Professional Documents
Culture Documents
0 Reference Manual
Tabla de contenidos
Prefacio ...................................................................................................................................... xix 1. Informacin general .................................................................................................................. 1 1.1. Sobre este manual ......................................................................................................... 2 1.2. Convenciones utilizadas en este manual ......................................................................... 2 1.3. Panormica de MySQL AB ............................................................................................. 4 1.4. Panormica del sistema de gestin de base de datos MySQL .......................................... 4 1.4.1. Historia de MySQL .............................................................................................. 6 1.4.2. Las principales caractersticas de MySQL ............................................................. 6 1.4.3. Estabilidad de MySQL ......................................................................................... 8 1.4.4. Dimensiones mximas de las tablas MySQL ......................................................... 9 1.4.5. Conformidad con el efecto 2000 ......................................................................... 10 1.5. Mapa de desarrollo de MySQL ..................................................................................... 12 1.5.1. El servidor MySQL incrustado (embedded) ......................................................... 12 1.5.2. Qu hay de nuevo en MySQL 5.0 ...................................................................... 12 1.6. Fuentes de informacin acerca de MySQL .................................................................... 13 1.6.1. Listas de correo de MySQL ............................................................................... 13 1.6.2. Soporte por IRC (Internet Relay Chat) de la comunidad MySQL ........................... 20 1.6.3. Soporte por parte de la comunidad en los foros de MySQL .................................. 20 1.7. Cumplimiento de los estndares por parte de MySQL .................................................... 20 1.7.1. Estndares utilizados por MySQL ....................................................................... 21 1.7.2. Seleccin de modos SQL .................................................................................. 21 1.7.3. Ejecutar MySQL en modo ANSI ......................................................................... 21 1.7.4. Extensiones MySQL al estndar SQL ................................................................. 22 1.7.5. Diferencias en MySQL del estndar SQL ............................................................ 24 1.7.6. Cmo trata MySQL las restricciones (Constraints) ............................................... 29 2. Instalar MySQL ....................................................................................................................... 33 2.1. Cuestiones generales sobre la instalacin ..................................................................... 34 2.1.1. Sistemas operativos que MySQL soporta ........................................................... 35 2.1.2. Escoger la distribucin MySQL a instalar ............................................................ 37 2.1.3. Cmo obtener MySQL ....................................................................................... 47 2.1.4. Comprobar la integridad de paquetes con sumas de verificacin MD5 o GnuPG ..... 47 2.1.5. Conformacin de la instalacin .......................................................................... 50 2.2. Instalacin MySQL estndar con una distribucin binaria ............................................... 51 2.3. Instalar MySQL en Windows ......................................................................................... 51 2.3.1. Requisitos de Windows ...................................................................................... 52 2.3.2. Eleccin de un paquete de instalacin ................................................................ 52 2.3.3. Instalacin de MySQL con un instalador automtico ............................................ 53 2.3.4. Usar el asistente de instalacin de MySQL ......................................................... 53 2.3.5. Utilizacin del asistente de configuracin ............................................................ 56 2.3.6. Instalar MySQL partiendo de un archivo Zip Noinstall .......................................... 60 2.3.7. Descomprimir el fichero de instalacin ................................................................ 61 2.3.8. Creacin de un fichero de opciones ................................................................... 61 2.3.9. Seleccionar un tipo de servidor MySQL .............................................................. 62 2.3.10. Arrancar el servidor la primera vez ................................................................... 63 2.3.11. Arrancar MySQL desde la lnea de comandos de Windows ................................ 64 2.3.12. Arrancar MySQL como un servicio de Windows ................................................ 65 2.3.13. Comprobar la instalacin de MySQL Installation ................................................ 67 2.3.14. Resolucin de problemas en la instalacin de MySQL bajo Windows .................. 67 2.3.15. Aumentar la versin de MySQL en Windows ..................................................... 69 2.3.16. Comparacin entre MySQL en Windows y MySQL en Unix ................................ 70 2.4. Instalar MySQL en Linux .............................................................................................. 72 2.5. Instalar MySQL en Mac OS X ...................................................................................... 74 2.6. Instalar MySQL sobre NetWare .................................................................................... 76 2.7. Instalacin de MySQL en otros sistemas similares a Unix .............................................. 78 2.8. Instalacin de MySQL usando una distribucin de cdigo fuente ..................................... 81
iii
2.8.1. Panormica de la instalacin de cdigo fuente .................................................... 82 2.8.2. Opciones tpicas de configure ........................................................................ 84 2.8.3. Instalar desde el rbol de cdigo fuente de desarrollo ......................................... 87 2.8.4. Problemas en la compilacin de MySQL ............................................................. 90 2.8.5. Notas sobre MIT-pthreads .................................................................................. 93 2.8.6. Instalar MySQL desde el cdigo fuente en Windows ........................................... 94 2.8.7. Compilar los clientes de MySQL en Windows ..................................................... 97 2.9. Puesta en marcha y comprobacin despus de la instalacin ......................................... 97 2.9.1. Pasos a seguir despus de la instalacin en Windows ........................................ 98 2.9.2. Pasos a seguir despus de la instalacin en Unix ............................................... 99 2.9.3. Hacer seguras las cuentas iniciales de MySQL ................................................. 109 2.10. Aumentar la versin de MySQL ................................................................................. 112 2.10.1. Aumentar la versin de 4.1 a 5.0 .................................................................... 113 2.10.2. Aumentar la versin de las tablas de privilegios .............................................. 115 2.10.3. Copiar bases de datos MySQL a otra mquina ................................................ 116 2.11. Bajar la versin de MySQL ....................................................................................... 117 2.11.1. Volver a la versin 4.1 ................................................................................... 118 2.12. Notas especficas sobre sistemas operativos ............................................................. 118 2.12.1. Notas sobre Linux .......................................................................................... 118 2.12.2. Notas sobre Mac OS X .................................................................................. 125 2.12.3. Notas sobre Solaris ....................................................................................... 126 2.12.4. Notas sobre BSD ........................................................................................... 129 2.12.5. Notas sobre otros Unix .................................................................................. 133 2.12.6. Notas sobre OS/2 .......................................................................................... 146 2.13. Notas sobre la instalacin de Perl ............................................................................. 147 2.13.1. Instalacin de Perl en Unix ............................................................................ 147 2.13.2. Instalar ActiveState Perl en Windows .............................................................. 148 2.13.3. Problemas en la utilizacin de la interfaz Perl DBI/DBD .................................... 149 3. Curso (tutorial) de MySQL ..................................................................................................... 153 3.1. Conectarse al y desconectarse del servidor ................................................................. 153 3.2. Entrar consultas ......................................................................................................... 154 3.3. Crear y utilizar una base de datos .............................................................................. 157 3.3.1. Crear y seleccionar una base de datos ............................................................. 158 3.3.2. Crear una tabla ............................................................................................... 159 3.3.3. Cargar datos en una tabla ............................................................................... 160 3.3.4. Extraer informacin de una tabla ...................................................................... 161 3.4. Obtener informacin sobre bases de datos y tablas ..................................................... 173 3.5. Usar mysql en modo batch ........................................................................................ 174 3.6. Ejemplos de consultas comunes ................................................................................. 175 3.6.1. El valor mximo de una columna ..................................................................... 176 3.6.2. El registro que tiene el valor mximo de determinada columna ........................... 176 3.6.3. Mximo de columna por grupo ......................................................................... 176 3.6.4. Los registros de un grupo que tienen el mximo valor en alguna columna ........... 177 3.6.5. Utilizacin de variables de usuario ................................................................... 177 3.6.6. Usar claves forneas (foreign keys) .................................................................. 177 3.6.7. Buscar usando dos claves ............................................................................... 179 3.6.8. Calcular visitas diarias ..................................................................................... 179 3.6.9. Utilizacin de AUTO_INCREMENT ...................................................................... 180 3.7. Consultas del proyecto Mellizos (Twin) ........................................................................ 181 3.7.1. Encontrar todos los mellizos no repartidos ........................................................ 181 3.7.2. Mostrar una tabla de estado de mellizos ........................................................... 183 3.8. Usar MySQL con Apache ........................................................................................... 183 4. Usar los programas MySQL .................................................................................................. 185 4.1. Panormica de programas MySQL .............................................................................. 185 4.2. Invocar programas MySQL ......................................................................................... 186 4.3. Especificar opciones de programa ............................................................................... 187 4.3.1. Usar opciones en la lnea de comandos ........................................................... 187 4.3.2. Usar ficheros de opciones ................................................................................ 189
iv
4.3.3. Usar variables de entorno para especificar opciones ......................................... 193 4.3.4. Utilizacin de opciones para establecer variables de programa .......................... 194 5. Administracin de bases de datos ......................................................................................... 195 5.1. El servidor MySQL y scripts de arranque del servidor ................................................... 196 5.1.1. Panormica de los programas scripts y las utilidades del lado del servidor (server-side) .............................................................................................................. 196 5.1.2. El servidor extendido de MySQL mysqld-max ................................................. 197 5.1.3. El script de arranque del servidor mysqld_safe .............................................. 200 5.1.4. El script mysql.server para el arranque del servidor ...................................... 203 5.1.5. El programa mysqld_multi para gestionar mltiples servidores MySQL ........... 203 5.2. El gestor de instancias de MySQL .............................................................................. 207 5.2.1. Arrancar el servidor MySQL con el gestor de instancias MySQL ......................... 207 5.2.2. Conexin al gestor de instancias de MySQL y creacin de cuentas de usuario ..... 208 5.2.3. Opciones de los comandos del gestor de instancias MySQL .............................. 208 5.2.4. Ficheros de configuracin del gestor de instancias de MySQL ............................ 209 5.2.5. Los comandos que reconoce el gestor de instancias de MySQL ......................... 210 5.3. Configuracin del servidor MySQL .............................................................................. 212 5.3.1. Opciones del comando mysqld ....................................................................... 212 5.3.2. El modo SQL del servidor ................................................................................ 222 5.3.3. Variables de sistema del servidor ..................................................................... 226 5.3.4. Variables de estado del servidor ...................................................................... 255 5.4. El proceso de cierre del servidor MySQL ..................................................................... 264 5.5. Cuestiones de seguridad general ................................................................................ 265 5.5.1. Gua de seguridad general ............................................................................... 266 5.5.2. Hacer que MySQL sea seguro contra ataques .................................................. 268 5.5.3. Opciones de arranque para mysqld relacionadas con la seguridad .................... 270 5.5.4. Cuestiones relacionadas con la seguridad y LOAD DATA LOCAL ....................... 271 5.6. El sistema de privilegios de acceso de MySQL ............................................................ 272 5.6.1. Qu hace el sistema de privilegios ................................................................... 272 5.6.2. Cmo funciona el sistema de privilegios ........................................................... 272 5.6.3. Privilegios de los que provee MySQL ............................................................... 277 5.6.4. Conectarse al servidor MySQL ......................................................................... 280 5.6.5. Control de acceso, nivel 1: Comprobacin de la conexin .................................. 281 5.6.6. Control de acceso, nivel 2: comprobacin de solicitudes .................................... 284 5.6.7. Cundo tienen efecto los camios de privilegios ................................................. 287 5.6.8. Causas de errores Access denied ................................................................ 287 5.6.9. Hashing de contraseas en MySQL 4.1 ............................................................ 292 5.7. Gestin de la cuenta de usuario MySQL ..................................................................... 296 5.7.1. Nombres de usuario y contraseas de MySQL .................................................. 296 5.7.2. Aadir nuevas cuentas de usuario a MySQL ..................................................... 298 5.7.3. Eliminar cuentas de usuario de MySQL ............................................................ 300 5.7.4. Limitar recursos de cuentas ............................................................................. 300 5.7.5. Asignar contraseas a cuentas ........................................................................ 302 5.7.6. Guardar una contrasea de forma segura ......................................................... 303 5.7.7. Usar conexiones seguras ................................................................................. 304 5.8. Prevencin de desastres y recuperaciones .................................................................. 310 5.8.1. Copias de seguridad de bases de datos ........................................................... 311 5.8.2. Ejemplo de estrategia de copias de seguridad y recuperacin ............................ 312 5.8.3. Mantenimiento de tablas y recuperacin de un fallo catastrfico (crash) .............. 316 5.8.4. Organizar un programa de mantenimiento de tablas .......................................... 327 5.8.5. Obtener informacin acerca de una tabla .......................................................... 328 5.9. Uso internacional y localizacin de MySQL .................................................................. 333 5.9.1. El conjunto de caracteres utilizado para datos y ordenacin ............................... 333 5.9.2. Escoger el idioma de los mensajes de error ...................................................... 334 5.9.3. Aadir un conjunto de caracteres nuevo ........................................................... 335 5.9.4. Los vectores de definicin de caracteres .......................................................... 336 5.9.5. Soporte para colacin de cadenas de caracteres .............................................. 337 5.9.6. Soporte de caracteres multi-byte ...................................................................... 337
5.9.7. Problemas con conjuntos de caracteres ............................................................ 337 5.9.8. Soporte de zonas horarias en el servidor MySQL .............................................. 338 5.10. Los ficheros de registro (log) de MySQL .................................................................... 339 5.10.1. El registro de errroes (Error Log) .................................................................... 339 5.10.2. El registro general de consultas ..................................................................... 340 5.10.3. El registro binario (Binary Log) ....................................................................... 340 5.10.4. El registro de consultas lentas (Slow Query Log) ............................................. 344 5.10.5. Mantenimiento de ficheros de registro (log) ..................................................... 345 5.11. Ejecutar ms de un servidor MySQL en la misma mquina ......................................... 345 5.11.1. Ejecutar varios servidores en Windows ........................................................... 347 5.11.2. Ejecutar varios servidores en Unix .................................................................. 350 5.11.3. Utilizacin de programas cliente en un entorno de mltiples servidores ............. 351 5.12. La cach de consultas de MySQL ............................................................................. 352 5.12.1. Cmo opera la cach de consultas ................................................................. 352 5.12.2. Opciones de SELECT para la cach de consultas ............................................ 354 5.12.3. Configuracin de la cach de consultas .......................................................... 354 5.12.4. Estado y mantenimiento de la cach de consultas ........................................... 355 6. Replicacin en MySQL .......................................................................................................... 357 6.1. Introduccin a la replicacin ........................................................................................ 357 6.2. Panormica de la implementacin de la replicacin ...................................................... 358 6.3. Detalles de la implementacin de la replicacin ........................................................... 358 6.3.1. Estados de los subprocesos del maestro de replicacin ..................................... 360 6.3.2. Estados de proceso E/S (I/O) del esclavo de replicacin .................................... 360 6.3.3. Estados del flujo SQL de un esclavo de replicacin ........................................... 361 6.3.4. Ficheros de replicacin, retardados y de estado ................................................ 361 6.4. Cmo montar la replicacin ........................................................................................ 363 6.5. Compatibilidad entre versiones de MySQL con respecto a la replicacin ........................ 367 6.6. Aumentar la versin de la replicacin .......................................................................... 367 6.6.1. Aumentar la versin de la replicacin a 5.0 ....................................................... 367 6.7. Caractersticas de la replicacin y problemas conocidos ............................................... 368 6.8. Opciones de arranque de replicacin .......................................................................... 371 6.9. Preguntas y respuestas sobre replicacin .................................................................... 379 6.10. Resolucin de problemas de replicacin .................................................................... 384 6.11. Reportar bugs de replicacin .................................................................................... 385 7. Optimizacin de MySQL ........................................................................................................ 387 7.1. Panormica sobre optimizacin ................................................................................... 388 7.1.1. Limitaciones y soluciones de compromiso en el diseo de MySQL ...................... 388 7.1.2. Disear aplicaciones pensando en la portabilidad .............................................. 389 7.1.3. Para qu hemos usado MySQL ....................................................................... 390 7.1.4. El paquete de pruebas de rendimiento (benchmarks) de MySQL ........................ 390 7.1.5. Usar pruebas de rendimiento (benchmarks) propios .......................................... 391 7.2. Optimizar sentencias SELECT y otras consultas ........................................................... 392 7.2.1. Sintaxis de EXPLAIN (Obtener informacin acerca de un SELECT) ..................... 392 7.2.2. Estimar el renidimiento de una consulta ............................................................ 400 7.2.3. Velocidad de las consultas SELECT .................................................................. 400 7.2.4. Optimizacin de las clusulas WHERE por parte de MySQL ................................. 401 7.2.5. Optimizacin de rango ..................................................................................... 402 7.2.6. Index Merge Optimization ................................................................................ 405 7.2.7. Cmo optimiza MySQL IS NULL ..................................................................... 407 7.2.8. Cmo MySQL optimiza DISTINCT ................................................................... 408 7.2.9. Cmo optimiza MySQL los LEFT JOIN y RIGHT JOIN .................................... 408 7.2.10. Cmo optimiza MySQL ORDER BY ................................................................. 409 7.2.11. Cmo optimiza MySQL los GROUP BY ............................................................ 410 7.2.12. Cmo optimiza MySQL las clusulas LIMIT ................................................... 412 7.2.13. Cmo evitar lecturas completas de tablas ....................................................... 413 7.2.14. Velocidad de la sentencia INSERT ................................................................. 413 7.2.15. Velocidad de las sentencias UPDATE .............................................................. 415 7.2.16. Velocidad de sentencias DELETE ................................................................... 415
vi
7.2.17. Otros consejos sobre optimizacin .................................................................. 415 7.3. Temas relacionados con el bloqueo ............................................................................ 418 7.3.1. Mtodos de bloqueo ........................................................................................ 418 7.3.2. Cuestiones relacionadas con el bloqueo (locking) de tablas ............................... 420 7.4. Optimizar la estructura de una base de datos .............................................................. 421 7.4.1. Elecciones de diseo ....................................................................................... 421 7.4.2. Haga sus datos lo ms pequeos posibles ....................................................... 421 7.4.3. ndices de columna .......................................................................................... 422 7.4.4. ndices de mltiples columnas .......................................................................... 423 7.4.5. Cmo utiliza MySQL los ndices ....................................................................... 424 7.4.6. La cach de claves de MyISAM ........................................................................ 426 7.4.7. Cmo cuenta MySQL las tablas abiertas .......................................................... 430 7.4.8. Cmo abre y cierra tablas MySQL .................................................................... 431 7.4.9. Desventajas de crear muchas tablas en la misma base de datos ........................ 432 7.5. Optimizacin del servidor MySQL ................................................................................ 432 7.5.1. Factores de sistema y afinamientos de parmetros de arranque ......................... 432 7.5.2. Afinar parmetros del servidor .......................................................................... 432 7.5.3. Vigilar el rendimiento del optimizador de consultas ............................................ 435 7.5.4. Efectos de la compilacin y del enlace en la velocidad de MySQL ...................... 436 7.5.5. Cmo utiliza MySQL la memoria ...................................................................... 437 7.5.6. Cmo usa MySQL las DNS ............................................................................. 438 7.6. Cuestiones relacionadas con el disco .......................................................................... 439 7.6.1. Utilizar enlaces simblicos ............................................................................... 440 8. Programas cliente y utilidades MySQL ................................................................................... 443 8.1. Panormica de scripts y utilidades del lado del cliente ................................................. 443 8.2. myisampack, el generador de tablas comprimidas de slo lectura de MySQL ............... 445 8.3. La herramienta intrprete de comandos mysql ............................................................ 451 8.3.1. Comandos mysql ............................................................................................ 457 8.3.2. Ejecutar sentencias SQL desde un fichero de texto ........................................... 460 8.3.3. Sugerencias acerca de mysql ......................................................................... 461 8.4. Administrar un servidor MySQL con mysqladmin ....................................................... 462 8.5. La utilidad mysqlbinlog para registros binarios ......................................................... 467 8.6. El programa mysqlcheck para mantener y reparar tablas ........................................... 470 8.7. El programa de copia de seguridad de base de datos mysqldump ................................ 473 8.8. El programa de copias de seguridad de base de datos mysqlhotcopy ........................ 479 8.9. El programa para importar datos mysqlimport .......................................................... 481 8.10. Mostrar bases de datos, tablas y columnas con mysqlshow ...................................... 483 8.11. perror, explicacin de cdigos de error ................................................................... 485 8.12. La utilidad replace de cambio de cadenas de caracteres ......................................... 485 9. Estructura de lenguaje .......................................................................................................... 487 9.1. Valores literales .......................................................................................................... 487 9.1.1. Cadenas de caracteres .................................................................................... 487 9.1.2. Nmeros ......................................................................................................... 489 9.1.3. Valores hexadecimales .................................................................................... 490 9.1.4. Valores booleanos ........................................................................................... 490 9.1.5. Valores de bits ................................................................................................ 490 9.1.6. Valores NULL .................................................................................................. 490 9.2. Nombres de bases de datos, tablas, ndices, columnas y alias ..................................... 491 9.2.1. Cualificadores de los identificadores ................................................................. 492 9.2.2. Sensibilidad a maysuclas y minsculas de identificadores ................................ 492 9.3. Variables de usuario ................................................................................................... 494 9.4. Variables de sistema .................................................................................................. 495 9.4.1. Variables estructuradas de sistema .................................................................. 496 9.5. Sintaxis de comentarios .............................................................................................. 498 9.6. Tratamiento de palabras reservadas en MySQL ........................................................... 499 10. Soporte de conjuntos de caracteres ..................................................................................... 503 10.1. Conjuntos de caracteres y colaciones en general ....................................................... 504 10.2. Conjuntos de caracteres y colaciones en MySQL ....................................................... 504
vii
10.3. Determinar el conjunto de caracteres y la colacin por defecto .................................... 506 10.3.1. Conjunto de caracteres y colacin del servidor ................................................ 506 10.3.2. Conjuntos de caracteres y colaciones de la base de datos ............................... 506 10.3.3. Conjunto de caracteres y colacin de tabla ..................................................... 507 10.3.4. Conjunto de caracteres y colacin de columnas .............................................. 508 10.3.5. Ejemplos de asignacin de conjunto de caracteres y colacin .......................... 508 10.3.6. Conjunto de caracteres y colacin de la conexin ............................................ 509 10.3.7. Conjunto de caracteres y colacin de columnas carcter ............................... 510 10.3.8. Usar COLLATE en sentencias SQL ................................................................. 511 10.3.9. Precedencia de la clusula COLLATE .............................................................. 512 10.3.10. Operador BINARY ........................................................................................ 512 10.3.11. Casos especiales en los que determinar la colacin es complicado ................. 512 10.3.12. A cada colacin un conjunto de caracteres correcto ....................................... 513 10.3.13. Un ejemplo del efecto de una colacin .......................................................... 514 10.4. Efectos del soporte de conjuntos de caracteres ......................................................... 514 10.4.1. Cadenas de caracteres de resultado ............................................................... 514 10.4.2. CONVERT() ................................................................................................... 515 10.4.3. CAST() ......................................................................................................... 515 10.4.4. Sentencias SHOW ........................................................................................... 515 10.5. Soporte Unicode ....................................................................................................... 517 10.6. UTF8 para metadatos ............................................................................................... 517 10.7. Compatibilidad con otros SGBDs (Sistemas gestores de bases de datos) .................... 519 10.8. Formato del nuevo fichero de conjunto de caracateres ............................................... 519 10.9. Conjunto de caracteres nacional ............................................................................... 519 10.10. Conjuntos de caracteres y colaciones que soporta MySQL ....................................... 519 10.10.1. Conjuntos de caracteres Unicode ................................................................. 520 10.10.2. Conjuntos de caracteres de Europa occidental .............................................. 522 10.10.3. Conjuntos de caracteres de Europa central ................................................... 523 10.10.4. Conjuntos de caracteres del sur de Europa y de Oriente Medio ...................... 524 10.10.5. Conjuntos de caracteres blticos .................................................................. 524 10.10.6. Conjuntos de caracteres cirlicos .................................................................. 525 10.10.7. Conjuntos de caracteres asiticos ................................................................. 525 11. Tipos de columna ................................................................................................................ 527 11.1. Panormica de tipos de columna .............................................................................. 528 11.1.1. Panormica de tipos numricos ...................................................................... 528 11.1.2. Panormica de tipos de fechas y hora ............................................................ 531 11.1.3. Panormica de tipos de cadenas de caracteres ............................................... 532 11.2. Tipos numricos ....................................................................................................... 535 11.3. Tipos de fecha y hora ............................................................................................... 538 11.3.1. Los tipos de datos DATETIME, DATE y TIMESTAMP ......................................... 539 11.3.2. El tipo TIME .................................................................................................. 543 11.3.3. El tipo de datos YEAR .................................................................................... 544 11.3.4. Efecto 2000 (Y2K) y tipos de datos ................................................................ 544 11.4. Tipos de cadenas de caracteres ............................................................................... 545 11.4.1. Los tipos CHAR y VARCHAR ............................................................................ 545 11.4.2. Los tipos BINARY y VARBINARY .................................................................... 546 11.4.3. Los tipos BLOB y TEXT .................................................................................. 547 11.4.4. El tipo de columna ENUM ................................................................................ 548 11.4.5. El tipo SET .................................................................................................... 549 11.5. Requisitos de almacenamiento segn el tipo de columna ........................................... 550 11.6. Escoger el tipo de columna correcto .......................................................................... 553 11.7. Usar tipos de columnas de otros motores de bases de datos ...................................... 553 12. Funciones y operadores ...................................................................................................... 555 12.1. Operadores .............................................................................................................. 556 12.1.1. Precedencias de los operadores ..................................................................... 556 12.1.2. Parntesis ..................................................................................................... 556 12.1.3. Funciones y operadores de comparacin ........................................................ 556 12.1.4. Operadores lgicos ........................................................................................ 561
viii
12.2. Funciones de control de flujo .................................................................................... 562 12.3. Funciones para cadenas de caracteres ..................................................................... 564 12.3.1. Funciones de comparacin de cadenas de caracteres ..................................... 574 12.4. Funciones numricas ................................................................................................ 576 12.4.1. Operadores aritmticos .................................................................................. 576 12.4.2. Funciones matemticas .................................................................................. 578 12.5. Funciones de fecha y hora ....................................................................................... 584 12.6. Qu calendario utiliza MySQL ................................................................................... 599 12.7. Funciones de bsqueda de texto completo (Full-Text) ................................................ 600 12.7.1. Bsquedas booleanas de texto completo (Full-Text) ........................................ 603 12.7.2. Bsquedas de texto completo (Full-Text) con expansin de consulta ................. 605 12.7.3. Limitaciones de las bsquedas de texto completo (Full-Text) ............................ 605 12.7.4. Afinar bsquedas de texto completo (Full-Text) con MySQL ............................. 606 12.7.5. Cosas por hacer en bsquedas de texto completo (Full-Text) ........................... 607 12.8. Funciones y operadores de cast ............................................................................... 608 12.9. Otras funciones ........................................................................................................ 610 12.9.1. Funciones bit ................................................................................................. 610 12.9.2. Funciones de cifrado ...................................................................................... 611 12.9.3. Funciones de informacin .............................................................................. 614 12.9.4. Funciones varias ............................................................................................ 619 12.10. Funciones y modificadores para clusulas GROUP BY .............................................. 622 12.10.1. Funciones (de agregacin) de GROUP BY ..................................................... 622 12.10.2. Modificadores de GROUP BY ........................................................................ 625 12.10.3. GROUP BY con campos escondidos .............................................................. 627 13. Sintaxis de sentencias SQL ................................................................................................. 629 13.1. Sentencias de definicin de datos (Data Definition Statements) ................................... 629 13.1.1. Sintaxis de ALTER DATABASE ....................................................................... 629 13.1.2. Sintaxis de ALTER TABLE ............................................................................. 630 13.1.3. Sintaxis de CREATE DATABASE ..................................................................... 634 13.1.4. Sintaxis de CREATE INDEX ........................................................................... 634 13.1.5. Sintaxis de CREATE TABLE ........................................................................... 636 13.1.6. Sintaxis de DROP DATABASE ......................................................................... 645 13.1.7. Sintaxis de DROP INDEX ............................................................................... 646 13.1.8. Sintaxis de DROP TABLE ............................................................................... 646 13.1.9. Sintaxis de RENAME TABLE ........................................................................... 647 13.2. Sentencias de manipulacin de datos (Data Manipulation Statements) ........................ 647 13.2.1. Sintaxis de DELETE ....................................................................................... 647 13.2.2. Sintaxis de DO ............................................................................................... 650 13.2.3. Sintaxis de HANDLER ..................................................................................... 650 13.2.4. Sintaxis de INSERT ....................................................................................... 651 13.2.5. Sintaxis de LOAD DATA INFILE .................................................................. 657 13.2.6. Sintaxis de REPLACE ..................................................................................... 664 13.2.7. Sintaxis de SELECT ....................................................................................... 665 13.2.8. Sintaxis de subconsultas ................................................................................ 673 13.2.9. Sintaxis de TRUNCATE ................................................................................... 681 13.2.10. Sintaxis de UPDATE ..................................................................................... 682 13.3. Sentencias tiles de MySQL ..................................................................................... 683 13.3.1. Sintaxis de DESCRIBE (Informacin acerca de las columnas) ........................... 683 13.3.2. Sintaxis de USE ............................................................................................. 684 13.4. Comandos transaccionales y de bloqueo de MySQL .................................................. 684 13.4.1. Sintaxis de START TRANSACTION, COMMIT y ROLLBACK ................................ 684 13.4.2. Sentencias que no se pueden deshacer ......................................................... 686 13.4.3. Sentencias que causan una ejecucin (commit) implcita ................................. 686 13.4.4. Sintaxis de SAVEPOINT y ROLLBACK TO SAVEPOINT .................................... 686 13.4.5. Sintaxis de LOCK TABLES y UNLOCK TABLES ............................................... 686 13.4.6. Sintaxis de SET TRANSACTION ..................................................................... 689 13.5. Sentencias de administracin de base de datos ......................................................... 689 13.5.1. Sentencias para la gestin de cuentas ............................................................ 689
ix
13.5.2. Sentencias para el mantenimiento de tablas ................................................... 698 13.5.3. Sintaxis de SET ............................................................................................. 703 13.5.4. Sintaxis de SHOW ........................................................................................... 707 13.5.5. Otras sentencias para la administracin .......................................................... 724 13.6. Sentencias de replicacin ......................................................................................... 728 13.6.1. Sentencias SQL para el control de servidores maestros ................................... 728 13.6.2. Sentencias SQL para el control de servidores esclavos ................................... 730 13.7. Sintaxis SQL de sentencias preparadas .................................................................... 738 14. Motores de almacenamiento de MySQL y tipos de tablas ...................................................... 741 14.1. El motor de almacenamiento MyISAM ........................................................................ 743 14.1.1. Opciones de arranque de MyISAM .................................................................. 745 14.1.2. Cunto espacio necesitan las claves .............................................................. 746 14.1.3. Formatos de almacenamiento de tablas MyISAM ............................................. 746 14.1.4. Problemas en tablas MyISAM ......................................................................... 748 14.2. El motor de almacenamiento MERGE .......................................................................... 750 14.2.1. Problemas con tablas MERGE ......................................................................... 752 14.3. El motor de almacenamiento MEMORY (HEAP) ............................................................ 753 14.4. El motor de almacenamiento BDB (BerkeleyDB) ....................................................... 755 14.4.1. Sistemas operativos que soporta BDB ............................................................. 755 14.4.2. Instalacin de BDB ......................................................................................... 756 14.4.3. Opciones de arranque de BDB ........................................................................ 756 14.4.4. Caractersticas de las tablas BDB ................................................................... 757 14.4.5. Temas pendientes de arreglo para BDB .......................................................... 759 14.4.6. Limitaciones en las tablas BDB ....................................................................... 759 14.4.7. Errores que pueden darse en el uso de tablas BDB ......................................... 759 14.5. El motor de almacenamiento EXAMPLE ...................................................................... 760 14.6. El motor de almacenamiento FEDERATED .................................................................. 760 14.6.1. Instalacin del motor de almacenamiento FEDERATED ..................................... 760 14.6.2. Descripcin del motor de almacenamiento FEDERATED .................................... 760 14.6.3. Cmo usar las tablas FEDERATED .................................................................. 761 14.6.4. Limitaciones del motor de almacenamiento FEDERATED .................................. 762 14.7. El motor de almacenamiento ARCHIVE ...................................................................... 762 14.8. El motor de almacenamiento CSV .............................................................................. 763 15. El motor de almacenamiento InnoDB .................................................................................. 765 15.1. Panormica de InnoDB ............................................................................................ 766 15.2. Informacin de contacto de InnoDB .......................................................................... 766 15.3. Configuracin de InnoDB ......................................................................................... 766 15.4. Opciones de arranque de InnoDB ............................................................................ 771 15.5. Crear el espacio de tablas InnoDB ........................................................................... 777 15.5.1. Resolucin de problemas en la inicializacin de InnoDB .................................. 778 15.6. Crear tablas InnoDB ................................................................................................ 778 15.6.1. Cmo utilizar transacciones en InnoDB con distintas APIs ............................... 778 15.6.2. Pasar tablas MyISAM a InnoDB ..................................................................... 779 15.6.3. Cmo funciona una columna AUTO_INCREMENT en InnoDB ............................ 780 15.6.4. Restricciones (constraints) FOREIGN KEY ...................................................... 781 15.6.5. InnoDB y replicacin MySQL ......................................................................... 785 15.6.6. Usar un espacio de tablas para cada tabla ..................................................... 785 15.7. Aadir y suprimir registros y ficheros de datos InnoDB .............................................. 787 15.8. Hacer una copia de seguridad y recuperar una base de datos InnoDB ........................ 788 15.8.1. Forzar una recuperacin ................................................................................ 789 15.8.2. Marcadores ................................................................................................... 790 15.9. Trasladar una base de datos InnoDB a otra mquina ................................................ 790 15.10. Bloqueo y modelo de transacciones de InnoDB ....................................................... 791 15.10.1. Modos de bloqueo InnoDB .......................................................................... 791 15.10.2. InnoDB y AUTOCOMMIT ............................................................................... 792 15.10.3. InnoDB y TRANSACTION ISOLATION LEVEL ............................................. 792 15.10.4. Lecturas consistentes que no bloquean ......................................................... 794
15.10.5. Bloquear lecturas SELECT ... FOR UPDATE y SELECT ... LOCK IN SHARE MODE ............................................................................................................ 794 15.10.6. Bloqueo de la prxima clave (Next-Key Locking): evitar el problema fantasma ................................................................................................................... 795 15.10.7. Un ejemplo de lectura consistente en InnoDB ............................................... 795 15.10.8. Establecimiento de bloqueos con diferentes sentencias SQL en InnoDB ......... 796 15.10.9. Cundo ejecuta o deshace implicitamente MySQL una transaccin? ............. 797 15.10.10. Deteccin de interbloqueos (deadlocks) y cancelacin de transacciones (rollbacks) ................................................................................................................. 798 15.10.11. Cmo tratar con interbloqueos .................................................................... 798 15.11. Consejos de afinamiento del rendimiento de InnoDB ............................................... 799 15.11.1. SHOW INNODB STATUS y los monitores InnoDB .......................................... 801 15.12. Implementacin de multiversin ............................................................................... 805 15.13. Estructuras de tabla y de ndice .............................................................................. 806 15.13.1. Estructura fsica de un ndice ....................................................................... 806 15.13.2. Bfer de inserciones .................................................................................... 806 15.13.3. Indices hash adaptables ............................................................................... 807 15.13.4. Estructura fsica de los registros ................................................................... 807 15.14. Gestin de espacio de ficheros y de E/S de disco (Disk I/O) ..................................... 808 15.14.1. E/S de disco (Disk I/O) ................................................................................ 808 15.14.2. Usar dispositivos en bruto (raw devices) para espacios de tablas .................... 808 15.14.3. Gestin del espacio de ficheros .................................................................... 809 15.14.4. Desfragmentar una tabla .............................................................................. 810 15.15. Tratamiento de errores de InnoDB .......................................................................... 810 15.15.1. Cdigos de error de InnoDB ........................................................................ 811 15.15.2. Cdigos de error del sistema operativo ......................................................... 811 15.16. Restricciones de las tablas InnoDB ......................................................................... 816 15.17. Resolver problemas relacionados con InnoDB ......................................................... 818 15.17.1. Resolver problemas de las operaciones del diccionario de datos de InnoDB ... 818 16. MySQL Cluster .................................................................................................................... 821 16.1. Panormica de MySQL Cluster ................................................................................. 822 16.2. Conceptos bsicos de Basic MySQL Cluster .............................................................. 824 16.3. Cmo configurar varios ordenadores ......................................................................... 825 16.3.1. Hardware, software y redes ............................................................................ 827 16.3.2. Instalacin ..................................................................................................... 827 16.3.3. Configuracin ................................................................................................ 829 16.3.4. Arranque inicial .............................................................................................. 831 16.3.5. Cargar datos de ejemplo y realizar consultas .................................................. 831 16.3.6. Apagado y encendido seguros ....................................................................... 835 16.4. Configuracin de MySQL Cluster .............................................................................. 835 16.4.1. Generar MySQL Cluster desde el cdigo fuente .............................................. 835 16.4.2. Instalar el software ........................................................................................ 836 16.4.3. Rpido montaje de prueba de MySQL Cluster ................................................. 836 16.4.4. Fichero de configuracin ................................................................................ 838 16.5. Gestin de procesos en MySQL Cluster .................................................................... 862 16.5.1. El uso del proceso del servidor MySQL para MySQL Cluster ............................ 862 16.5.2. ndbd, el proceso del nodo de motor de almacenamiento ................................. 863 16.5.3. El proceso del servidor de administracin ndb_mgmd ....................................... 864 16.5.4. El proceso de cliente de administracin ndb_mgm ........................................... 864 16.5.5. Opciones de comando para procesos de MySQL Cluster ................................. 865 16.6. Administracin de MySQL Cluster ............................................................................. 867 16.6.1. Comandos del cliente de administracin ......................................................... 867 16.6.2. Informes de eventos generados por MySQL Cluster ........................................ 868 16.6.3. Modo de usuario nico .................................................................................. 873 16.6.4. Copias de seguridad On-line para MySQL Cluster ........................................... 874 16.7. Usar interconexiones de alta velocidad con MySQL Cluster ........................................ 877 16.7.1. Configurar MySQL Cluster para que utilice Sockets SCI ................................... 877 16.7.2. Entender el impacto de interconexiones de nodos ........................................... 880
xi
16.8. Limitaciones conocidas de MySQL Cluster ................................................................ 882 16.9. Mapa de desarrollo de MySQL Cluster ...................................................................... 884 16.9.1. Cambios de MySQL Cluster en MySQL 5.0 ..................................................... 884 16.9.2. Mapa de desarrollo de MySQL 5.1 para MySQL Cluster .................................. 885 16.10. Preguntas frecuentes sobre MySQL Cluster ............................................................. 886 16.11. Glosario de MySQL Cluster ..................................................................................... 892 17. Introduccin a MaxDB ......................................................................................................... 897 17.1. Historia de MaxDB ................................................................................................... 897 17.2. Licenciamiento y soporte .......................................................................................... 897 17.3. Enlaces relacionados con MaxDB ............................................................................. 897 17.4. Conceptos bsicos de MaxDB .................................................................................. 897 17.5. Diferencias de prestaciones entre MaxDB y MySQL ................................................... 898 17.6. Caractersticas de interoperabilidad entre MaxDB y MySQL ........................................ 898 17.7. Palabras reservadas de MaxDB ................................................................................ 898 18. Extensiones espaciales de MySQL ...................................................................................... 903 18.1. Introduccin .............................................................................................................. 904 18.2. El modelo geomtrico OpenGIS ................................................................................ 904 18.2.1. La jerarqua de las clases geomtricas ........................................................... 904 18.2.2. La clase Geometry ....................................................................................... 905 18.2.3. La clase Point ............................................................................................. 907 18.2.4. La clase Curve ............................................................................................. 907 18.2.5. La clase LineString ................................................................................... 907 18.2.6. La clase Surface ......................................................................................... 908 18.2.7. La clase Polygon ......................................................................................... 908 18.2.8. La clase GeometryCollection ................................................................... 908 18.2.9. La clase MultiPoint ................................................................................... 909 18.2.10. La clase MultiCurve ................................................................................. 909 18.2.11. La clase MultiLineString ....................................................................... 909 18.2.12. La clase MultiSurface ............................................................................. 909 18.2.13. La clase MultiPolygon ............................................................................. 910 18.3. Formatos de datos espaciales soportados ................................................................. 910 18.3.1. Formato Well-Known Text (WKT) ................................................................... 910 18.3.2. Formato Well-Known Binary (WKB) ................................................................ 911 18.4. Crear una base de datos MySQL con capacidades espaciales .................................... 912 18.4.1. Tipos de datos espaciales de MySQL ............................................................. 912 18.4.2. Crear valores espaciales ................................................................................ 912 18.4.3. Crear columnas espaciales ............................................................................ 916 18.4.4. Poblar columnas espaciales ........................................................................... 916 18.4.5. Extraer datos espaciales ................................................................................ 917 18.5. Analizar informacin espacial .................................................................................... 918 18.5.1. Funciones de conversin de formato geomtrico ............................................. 918 18.5.2. Funciones Geometry .................................................................................... 919 18.5.3. Funciones que crean nuevas geometras a partir de unas existentes ................ 925 18.5.4. Funciones para probar relaciones espaciales entre objetos geomtricos ............ 926 18.5.5. Relaciones entre rectngulos MBR (Minimal Bounding Rectangles) .................. 926 18.5.6. Funciones que prueban relaciones espaciales entre geometras ....................... 927 18.6. Optimizacin del anlisis espacial ............................................................................. 929 18.6.1. Crear ndices espaciales ................................................................................ 929 18.6.2. Usar un ndice espacial .................................................................................. 930 18.7. Conformidad y compatibilidad de MySQL .................................................................. 931 18.7.1. Caractersticas GIS que todava no han sido implementadas ............................ 931 19. Procedimientos almacenados y funciones ............................................................................ 933 19.1. Procedimientos almacenados y las tablas de permisos ............................................... 934 19.2. Sintaxis de procedimientos almacenados ................................................................... 934 19.2.1. CREATE PROCEDURE y CREATE FUNCTION ................................................... 934 19.2.2. ALTER PROCEDURE y ALTER FUNCTION ...................................................... 937 19.2.3. DROP PROCEDURE y DROP FUNCTION .......................................................... 937 19.2.4. SHOW CREATE PROCEDURE y SHOW CREATE FUNCTION ............................... 938
xii
20.
21.
22.
23.
24.
19.2.5. SHOW PROCEDURE STATUS y SHOW FUNCTION STATUS ............................... 938 19.2.6. La sentencia CALL ......................................................................................... 938 19.2.7. Sentencia compuesta BEGIN ... END ......................................................... 938 19.2.8. Sentencia DECLARE ....................................................................................... 939 19.2.9. Variables en procedimientos almacenados ...................................................... 939 19.2.10. Conditions and Handlers .............................................................................. 940 19.2.11. Cursores ...................................................................................................... 941 19.2.12. Constructores de control de flujo .................................................................. 942 19.3. Registro binario de procedimientos almacenados y disparadores ................................ 944 Disparadores (triggers) ........................................................................................................ 949 20.1. Sintaxis de CREATE TRIGGER .................................................................................. 949 20.2. Sintaxis de DROP TRIGGER ..................................................................................... 951 20.3. Utilizacin de disparadores ....................................................................................... 951 Vistas (Views) ..................................................................................................................... 955 21.1. Sintaxis de ALTER VIEW ......................................................................................... 955 21.2. Sintaxis de CREATE VIEW ....................................................................................... 955 21.3. Sintaxis de DROP VIEW ........................................................................................... 960 21.4. Sintaxis de SHOW CREATE VIEW ............................................................................. 960 La base de datos de informacin INFORMATION_SCHEMA ..................................................... 963 22.1. Las tablas INFORMATION_SCHEMA ........................................................................... 964 22.1.1. La tabla INFORMATION_SCHEMA SCHEMATA .................................................. 965 22.1.2. La tabla INFORMATION_SCHEMA TABLES ...................................................... 965 22.1.3. La tabla INFORMATION_SCHEMA COLUMNS .................................................... 966 22.1.4. La tabla INFORMATION_SCHEMA STATISTICS .............................................. 967 22.1.5. La tabla INFORMATION_SCHEMA USER_PRIVILEGES .................................... 968 22.1.6. La tabla INFORMATION_SCHEMA SCHEMA_PRIVILEGES ................................ 968 22.1.7. La tabla INFORMATION_SCHEMA TABLE_PRIVILEGES .................................. 969 22.1.8. La tabla INFORMATION_SCHEMA COLUMN_PRIVILEGES ................................ 969 22.1.9. La tabla INFORMATION_SCHEMA CHARACTER_SETS ...................................... 970 22.1.10. La tabla INFORMATION_SCHEMA COLLATIONS ............................................ 970 22.1.11. La tabla INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY ....................................................... 970 22.1.12. La tabla INFORMATION_SCHEMA TABLE_CONSTRAINTS .............................. 971 22.1.13. La tabla INFORMATION_SCHEMA KEY_COLUMN_USAGE ................................ 971 22.1.14. La tabla INFORMATION_SCHEMA ROUTINES ................................................ 972 22.1.15. La tabla INFORMATION_SCHEMA VIEWS ...................................................... 973 22.1.16. La tabla INFORMATION_SCHEMA TRIGGERS ................................................ 973 22.1.17. Otras tablas INFORMATION_SCHEMA ............................................................ 975 22.2. Extensiones a las sentencias SHOW ........................................................................... 975 Matemticas de precisin .................................................................................................... 977 23.1. Tipos de valores numricos ...................................................................................... 977 23.2. Cambios en el tipo de datos DECIMAL ...................................................................... 978 23.3. Manejo de expresiones ............................................................................................. 979 23.4. Cmo se redondea ................................................................................................... 981 23.5. Ejemplos de matemticas de precisin ...................................................................... 981 APIs de MySQL .................................................................................................................. 987 24.1. Utilidades para el desarrollo de programas MySQL .................................................... 987 24.1.1. msql2mysql ............................................................................................... 987 24.1.2. mysql_config ............................................................................................. 988 24.2. La API C de MySQL ................................................................................................. 989 24.2.1. Tipos de datos de la API C ............................................................................ 989 24.2.2. Panormica de funciones de la API C ............................................................. 992 24.2.3. Descripcin de funciones de la API C ............................................................. 996 24.2.4. Sentencias preparadas de la API C .............................................................. 1036 24.2.5. Tipos de datos de sentencias preparadas de la API C ................................... 1037 24.2.6. Panormica de las funciones de sentencias preparadas de la API C ............... 1040 24.2.7. Descripciones de funciones de sentencias preparadas de la API C ................. 1042 24.2.8. Problemas con sentencias preparadas de la API C ........................................ 1062
xiii
24.2.9. Tratamiento por parte de la API C de la ejecucin de mltiples consultas ......... 1063 24.2.10. Manejo de valores de fecha y hora por parte de la API C ............................. 1063 24.2.11. Descripcin de funciones de la API C para el control de subprocesos ............ 1064 24.2.12. Descripcin de las funciones de la API C del servidor incrustado (embedded) ............................................................................................................. 1065 24.2.13. Preguntas y problemas comunes en el uso de la API C ................................ 1067 24.2.14. Generar programas cliente ......................................................................... 1068 24.2.15. Cmo hacer un cliente multihilo .................................................................. 1069 24.2.16. libmysqld, la biblioteca del servidor MySQL incrustado (embedded) ............... 1070 24.3. API PHP de MySQL ............................................................................................... 1075 24.3.1. Problemas comunes con MySQL y PHP ....................................................... 1076 24.4. La API Perl de MySQL ........................................................................................... 1076 24.5. API C++ de MySQL ................................................................................................ 1076 24.5.1. Borland C++ ................................................................................................ 1077 24.6. La API Python de MySQL ....................................................................................... 1077 24.7. La API Tcl de MySQL ............................................................................................. 1077 24.8. El visor de MySQL Eiffel ......................................................................................... 1077 25. Conectores ........................................................................................................................ 1079 25.1. MySQL Connector/ODBC ........................................................................................ 1080 25.1.1. Introduction to Connector/ODBC ................................................................... 1080 25.1.2. Connector/ODBC Installation ........................................................................ 1084 25.1.3. Connector/ODBC Configuration .................................................................... 1103 25.1.4. Connector/ODBC Examples .......................................................................... 1119 25.1.5. Connector/ODBC Reference ......................................................................... 1142 25.1.6. Connector/ODBC Notes and Tips ................................................................. 1148 25.1.7. Connector/ODBC Support ............................................................................ 1157 25.2. MySQL Connector/NET ........................................................................................... 1159 25.2.1. Connector/NET Versions .............................................................................. 1159 25.2.2. Connector/NET Installation ........................................................................... 1159 25.2.3. Connector/NET Examples ............................................................................ 1165 25.2.4. Connector/NET Reference ............................................................................ 1213 25.2.5. Connector/NET Notes and Tips .................................................................... 1315 25.2.6. Connector/NET Support ............................................................................... 1332 25.3. MySQL Visual Studio Plugin .................................................................................... 1333 25.3.1. Installing the MySQL Visual Studio Plugin ..................................................... 1333 25.3.2. Creating a connection to the MySQL server .................................................. 1335 25.3.3. Using the MySQL Visual Studio Plugin .......................................................... 1336 25.3.4. Visual Studio Plugin Support ........................................................................ 1344 25.4. MySQL Connector/J ................................................................................................ 1344 25.4.1. Connector/J Versions ................................................................................... 1344 25.4.2. Connector/J Installation ................................................................................ 1345 25.4.3. Connector/J Examples ................................................................................. 1349 25.4.4. Connector/J (JDBC) Reference ..................................................................... 1350 25.4.5. Connector/J Notes and Tips ......................................................................... 1372 25.4.6. Connector/J Support .................................................................................... 1390 25.5. MySQL Connector/MXJ ........................................................................................... 1391 25.5.1. Introduction to Connector/MXJ ...................................................................... 1391 25.5.2. Connector/MXJ Installation ........................................................................... 1393 25.5.3. Connector/MXJ Configuration ....................................................................... 1397 25.5.4. Connector/MXJ Reference ............................................................................ 1400 25.5.5. Connector/MXJ Notes and Tips .................................................................... 1401 25.5.6. Connector/MXJ Support ............................................................................... 1405 25.6. Connector/PHP ....................................................................................................... 1406 26. Manejo de errores en MySQL ............................................................................................ 1407 27. Extender MySQL ............................................................................................................... 1443 27.1. El interior de MySQL .............................................................................................. 1443 27.1.1. Los subprocesos (threads) MySQL ............................................................... 1443 27.1.2. El paquete de pruebas MySQL Test ............................................................. 1444
xiv
27.2. Aadir nuevas funciones a MySQL .......................................................................... 1446 27.2.1. Caractersticas de la interfaz para funciones definidas por el usuario ............... 1447 27.2.2. Sintaxis de CREATE FUNCTION/DROP FUNCTION ....................................... 1447 27.2.3. Aadir una nueva funcin definida por el usuario ........................................... 1447 27.2.4. Aadir una nueva funcin nativa ................................................................... 1455 27.3. Aadir nuevos procedimientos a MySQL .................................................................. 1457 27.3.1. Procedimiento Analyse ................................................................................. 1457 27.3.2. Escribir un procedimiento ............................................................................. 1457 A. Problemas y errores comunes ............................................................................................. 1459 A.1. Cmo determinar a qu es debido un problema ........................................................ 1460 A.2. Errores comunes al usar programas MySQL ............................................................. 1461 A.2.1. Access denied .......................................................................................... 1461 A.2.2. Can't connect to [local] MySQL server ......................................... 1461 A.2.3. Client does not support authentication protocol ...................... 1463 A.2.4. La contrasea falla cuando se introduce interactivamente ................................ 1464 A.2.5. La mquina 'host_name' est bloqueada .......................................... 1464 A.2.6. Demasiadas conexiones .......................................................................... 1465 A.2.7. Out of memory ......................................................................................... 1465 A.2.8. MySQL se ha apagado ............................................................................. 1465 A.2.9. Packet too large ................................................................................... 1467 A.2.10. Errores de comunicacin y conexiones abortadas ......................................... 1468 A.2.11. The table is full ............................................................................... 1469 A.2.12. Can't create/write to file .............................................................. 1469 A.2.13. Commands out of sync ......................................................................... 1470 A.2.14. Ignoring user ........................................................................................ 1470 A.2.15. Table 'nombre_de_tabla' doesn't exist ........................................ 1470 A.2.16. Can't initialize character set ...................................................... 1471 A.2.17. No se encontr el fichero ............................................................................. 1471 A.3. Problemas relacionados con la instalacin ................................................................ 1472 A.3.1. Problemas al enlazar a la biblioteca de clientes MySQL .................................. 1472 A.3.2. Cmo ejecutar MySQL como usuario normal .................................................. 1473 A.3.3. Problemas con permisos de archivos ............................................................. 1473 A.4. Cuestiones relacionadas con la administracin .......................................................... 1474 A.4.1. Cmo reiniciar la contrasea de root .............................................................. 1474 A.4.2. Qu hacer si MySQL sigue fallando (crashing) ................................................ 1476 A.4.3. Cmo se comporta MySQL ante un disco lleno ............................................... 1478 A.4.4. Dnde almacena MySQL los archivos temporales ........................................... 1479 A.4.5. Cmo proteger o cambiar el fichero socket de MySQL /tmp/mysql.sock ....... 1480 A.4.6. Problemas con las franjas horarias ................................................................. 1480 A.5. Problemas relacionados con consultas ...................................................................... 1481 A.5.1. Sensibilidad a maysculas en bsquedas ....................................................... 1481 A.5.2. Problemas en el uso de columnas DATE ......................................................... 1481 A.5.3. Problemas con valores NULL ......................................................................... 1482 A.5.4. Problemas con alias de columnas .................................................................. 1483 A.5.5. Fallo en la cancelacin de una transaccin con tablas no transaccionales ......... 1484 A.5.6. Borrar registros de tablas relacionadas ........................................................... 1484 A.5.7. Resolver problemas con registros que no salen .............................................. 1485 A.5.8. Problemas con comparaciones en coma flotante ............................................. 1485 A.6. Cuestiones relacionadas con el optimizador .............................................................. 1487 A.7. Cuestiones relacionadas con definiciones de tabla ..................................................... 1488 A.7.1. Problemas con ALTER TABLE ....................................................................... 1488 A.7.2. Cmo cambiar el orden de las columnas en una tabla ..................................... 1488 A.7.3. Problemas con TEMPORARY TABLE ............................................................... 1489 A.8. Problemas conocidos en MySQL .............................................................................. 1489 A.8.1. Problemas de la versin 3.23 resueltos en una versin posterior de MySQL ...... 1489 A.8.2. Problemas de la versin 4.0 resueltos en una versin posterior de MySQL ........ 1490 A.8.3. Problemas de la versin 4.1 resueltos en una versin posterior de MySQL ........ 1490 A.8.4. Cuestiones abiertas en MySQL ...................................................................... 1490
xv
B. Credits ................................................................................................................................ 1495 B.1. Desarrolladores de MySQL AB ................................................................................. 1495 B.2. Han contribuido a crear MySQL ................................................................................ 1500 B.3. Documentadores y traductores ................................................................................. 1504 B.4. Bibliotecas incluidas en MySQL y que MySQL utiliza ................................................. 1505 B.5. Paquetes que soportan MySQL ................................................................................ 1506 B.6. Herramientas utilizadas en la creacin de MySQL ..................................................... 1507 B.7. Han ayudado a MySQL ............................................................................................ 1507 C. Historial de cambios de MySQL .......................................................................................... 1509 C.1. Cambios en la entrega 5.0.x (Desarrollo) .................................................................. 1510 C.1.1. Cambios en la entrega 5.0.11 (todava no liberada) ......................................... 1511 C.1.2. Cambios en la entrega 5.0.10 (todava no liberada) ......................................... 1512 C.1.3. Cambios en la entrega 5.0.9 (15 julio 2005) ................................................... 1515 C.1.4. Cambios en la entrega 5.0.8 (not released) .................................................... 1517 C.1.5. Cambios en la entrega 5.0.7 (10 June 2005) .................................................. 1521 C.1.6. Cambios en la entrega 5.0.6 (26 May 2005) ................................................... 1524 C.1.7. Cambios en la entrega 5.0.5 (not released) .................................................... 1528 C.1.8. Cambios en la entrega 5.0.4 (16 Apr 2005) .................................................... 1530 C.1.9. Cambios en la entrega 5.0.3 (23 Mar 2005: Beta) ........................................... 1533 C.1.10. Cambios en la entrega 5.0.2 (01 Dec 2004) .................................................. 1542 C.1.11. Cambios en la entrega 5.0.1 (27 Jul 2004) ................................................... 1544 C.1.12. Cambios en la entrega 5.0.0 (22 Dec 2003: Alpha) ....................................... 1548 C.2. Cambios en MySQL Connector/ODBC (MyODBC) ..................................................... 1549 C.2.1. Changes in Connector/ODBC 5.0.10 (14 December 2006) ............................... 1549 C.2.2. Changes in Connector/ODBC 5.0.9 (22 November 2006) ................................. 1549 C.2.3. Changes in Connector/ODBC 5.0.8 (17 November 2006) ................................. 1550 C.2.4. Changes in Connector/ODBC 5.0.7 (08 November 2006) ................................. 1550 C.2.5. Changes in Connector/ODBC 5.0.6 (03 November 2006) ................................. 1551 C.2.6. Changes in Connector/ODBC 5.0.5 (17 October 2006) .................................... 1551 C.2.7. Changes in Connector/ODBC 5.0.3 (Connector/ODBC 5.0 Alpha 3) (20 June 2006) ...................................................................................................................... 1551 C.2.8. Changes in Connector/ODBC 5.0.2 (Never released) ...................................... 1551 C.2.9. Changes in Connector/ODBC 5.0.1 (Connector/ODBC 5.0 Alpha 2) (05 June 2006) ...................................................................................................................... 1551 C.2.10. Changes in Connector/ODBC 3.51.13 (Not yet released) ............................... 1552 C.2.11. Cambios en MyODBC 3.51.12 ..................................................................... 1553 C.2.12. Cambios en MyODBC 3.51.11 ..................................................................... 1553 C.3. Connector/NET Change History ................................................................................ 1553 C.3.1. Changes in MySQL Connector/NET Version 5.0.4 (Not yet released) ................ 1553 C.3.2. Changes in MySQL Connector/NET Version 5.0.3 (05 January 2007) ............... 1554 C.3.3. Changes in MySQL Connector/NET Version 5.0.2 (06 November 2006) ............ 1555 C.3.4. Changes in MySQL Connector/NET Version 5.0.1 (01 October 2006) ............... 1555 C.3.5. Changes in MySQL Connector/NET Version 5.0.0 (08 August 2006) ................. 1556 C.3.6. Changes in MySQL Connector/NET Version 1.0.9 (Not yet released) ................ 1557 C.3.7. Changes in MySQL Connector/NET Version 1.0.8 (20 October 2006) ............... 1557 C.3.8. Changes in MySQL Connector/NET Version 1.0.7 (21 November 2005) ............ 1559 C.3.9. Changes in MySQL Connector/NET Version 1.0.6 (03 October 2005) ............... 1559 C.3.10. Changes in MySQL Connector/NET Version 1.0.5 (29 August 2005) ............... 1559 C.3.11. Changes in MySQL Connector/NET Version 1.0.4 (20 January 2005) ............. 1560 C.3.12. Changes in MySQL Connector/NET Version 1.0.3-gamma (12 October 2004) . 1560 C.3.13. Changes in MySQL Connector/NET Version 1.0.2-gamma (15 November 2004) ...................................................................................................................... 1561 C.3.14. Changes in MySQL Connector/NET Version 1.0.1-beta2 (27 October 2004) .... 1562 C.3.15. Changes in MySQL Connector/NET Version 1.0.0 (01 September 2004) ......... 1563 C.3.16. Changes in MySQL Connector/NET Version 0.9.0 (30 August 2004) ............... 1563 C.3.17. Changes in MySQL Connector/NET Version 0.76 .......................................... 1566 C.3.18. Changes in MySQL Connector/NET Version 0.75 .......................................... 1567 C.3.19. Changes in MySQL Connector/NET Version 0.74 .......................................... 1568
xvi
C.3.20. Changes in MySQL Connector/NET Version 0.71 .......................................... 1570 C.3.21. Changes in MySQL Connector/NET Version 0.70 .......................................... 1570 C.3.22. Changes in MySQL Connector/NET Version 0.68 .......................................... 1572 C.3.23. Changes in MySQL Connector/NET Version 0.65 .......................................... 1572 C.3.24. Changes in MySQL Connector/NET Version 0.60 .......................................... 1572 C.3.25. Changes in MySQL Connector/NET Version 0.50 .......................................... 1572 C.4. MySQL Visual Studio Plugin Change History ............................................................. 1573 C.4.1. Changes in MySQL Visual Studio Plugin 1.0.2 (Not yet released) ..................... 1573 C.4.2. Changes in MySQL Visual Studio Plugin 1.0.1 (4 October 2006) ...................... 1573 C.4.3. Changes in MySQL Visual Studio Plugin 1.0.0 (4 October 2006) ...................... 1573 C.5. MySQL Connector/J Change History ......................................................................... 1573 C.5.1. Changes in MySQL Connector/J 5.1.x ............................................................ 1573 C.5.2. Changes in MySQL Connector/J 5.0.x ............................................................ 1574 C.5.3. Changes in MySQL Connector/J 3.1.x ............................................................ 1577 C.5.4. Changes in MySQL Connector/J 3.0.x ............................................................ 1594 C.5.5. Changes in MySQL Connector/J 2.0.x ............................................................ 1606 C.5.6. Changes in MySQL Connector/J 1.2b (04 July 1999) ....................................... 1610 C.5.7. Changes in MySQL Connector/J 1.2.x and lower ............................................ 1611 D. Portar a otros sistemas ....................................................................................................... 1615 D.1. Depurar un servidor MySQL ..................................................................................... 1616 D.1.1. Compilacin de MySQL para depuracin ........................................................ 1616 D.1.2. Crear ficheros de traza .................................................................................. 1617 D.1.3. Depurar mysqld con gdb .............................................................................. 1618 D.1.4. Usar stack trace ............................................................................................ 1619 D.1.5. El uso de registros (logs) para encontrar la causa de errores de mysqld .......... 1620 D.1.6. Crear un caso de prueba tras haber encontrado una tabla corrupta .................. 1620 D.2. Depuracin de un cliente MySQL ............................................................................. 1621 D.3. El paquete DBUG .................................................................................................... 1621 D.4. Comentarios sobre subprocesos RTS ....................................................................... 1622 D.5. Diferencias entre paquetes de control de subprocesos ............................................... 1624 E. Variables de entorno ........................................................................................................... 1625 F. Expresiones regulares en MySQL ........................................................................................ 1627 G. Lmites en MySQL .............................................................................................................. 1631 G.1. Lmites de los joins .................................................................................................. 1631 H. Restricciones en caractersticas de MySQL .......................................................................... 1633 H.1. Restricciones en procedimientos almacenados y disparadores ................................... 1633 H.2. Restricciones en cursores del lado del servidor ......................................................... 1634 H.3. Restricciones en subconsultas .................................................................................. 1634 H.4. Restricciones en vistas ............................................................................................. 1636 I. GNU General Public License ................................................................................................ 1639 J. MySQL FLOSS License Exception ....................................................................................... 1645 ndice ...................................................................................................................................... 1647
xvii
xviii
Prefacio
ste es el manual de referencia para el sistema de base de datos MySQL, en su versin 5.0, hasta la versin 5.0.9-beta. No debera utilizarse con ediciones ms antiguas del software MySQL, por las muchas diferencias funcionales y de otro tipo entre MySQL 5.0 y versiones anteriores. Si se est utilizando una versin anterior del software MySQL, es preferible hacer referencia al Manual de referencia de MySQL 4.1, que cubre las versiones 3.22, 3.23, 4.0 y 4.1 de MySQL. En este texto se sealan las diferencias entre las diversas versiones de MySQL 5.0, indicando la entrega (5.0.x). La traduccin al espaol de este manual se debe a Vespito, empresa de Barcelona especializada en la gestin de bases de datos MySQL y partner de MySQL AB desde 2001. Ha colaborado en la traduccin Claudio Alberto Nipotti, de San Lorenzo (Santa Fe), Argentina.
xix
xx
Para la historia de nuevas caractersticas y fallos arreglados, consulte Apndice C, Historial de cambios de MySQL. Para una lista de fallos conocidos y caractersticas no implementadas, consulte Seccin A.8, Problemas conocidos en MySQL. Para la lista de todos los que han contribuido a este proyecto, consulte Apndice B, Credits. Importante: Informes de errores (a menudo llamados "bugs"), as como preguntas y comentarios, deben enviarse a http://bugs.mysql.com. Consulte Seccin 1.6.1.3, Cmo informar de bugs y problemas. Si encuentra un fallo de seguridad importante en el servidor MySQL, por favor comunquelo inmediatamente mediante un correo electrnico a <security@mysql.com>.
Nombres de ficheros y directorios se escriben as: "El fichero global my.cnf se encuentra en el directorio /etc". Las secuencias de caracteres se escriben as: "Para especificar un comodn, use el carcter '%'." El texto de este estilo se usa para enfatizar. El texto de este estilo se usa en las cabeceras y para dar un enfsis especialmente fuerte. Cuando se muestran comandos que deben ser ejecutados en un programa particular, el programa se indica con un prompt mostrado antes del comando. Por ejemplo, shell> indica un comando que se ejecuta desde el login shell, y mysql> indica un comando que se ejecuta desde el programa cliente mysql :
shell> escriba un comando de shell aqu mysql> escriba un comando mysql aqu
El "shell" es su intrprete de comandos. En Unix, esto es normalmente un programa como sh csh. En Windows, el programa equivalente es command.com o cmd.exe, normalmente ejecutado en una ventana de consola. Cuando introduzca un comando u rden no escriba el prompt mostrado en el ejemplo. Nombres de bases de datos, tablas y columnas a menudo deben reemplazarse en los comandos. Para indicar que dicha substitucin es necesaria, el manual usa db_name, tbl_name, y col_name. Por ejemplo, puede ver un comando como este:
mysql> SELECT col_name FROM db_name.tbl_name;
Significa que si quisiera introducir un comando similar, debera escribir su propio nombre de base de datos, tabla y columna, tal vez as:
mysql> SELECT author_name FROM biblio_db.author_list;
En SQL no tiene importancia si las palabras clave se escriben en maysculas o minsculas. Este manual usa maysculas. En descripciones de sintaxis, corchetes ('[' y ']') se usan para indicar palabras o clusulas opcionales. Por ejemplo, en el siguiente comando, IF EXISTS es opcional:
DROP TABLE [IF EXISTS] tbl_name
Cuando un elemento de sintaxis consiste en un nmero de alternativas, las alternativas se separan mediante barras verticales ('|'). Cuando un miembro de una serie de elecciones puede ser elegido, las alternativas se muestran entre corchetes ('[' y ']'):
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
Cuando un miembro de una serie de elecciones debe ser elegido, las alternativas se muestran entre llaves ('{' y '}'):
{DESCRIBE | DESC} tbl_name [col_name | wild]
Puntos suspensivos (...) indica la omisin de una parte del comando, tpicamente para proporcionar una versin corta de una sintaxis ms compleja. Por ejemplo, INSERT ... SELECT es la versin corta de un comando INSERT seguido de un comando SELECT. Puntos suspensivos pueden tambier indicar que el elemento de sintaxis precedente de un comando puede repertirse. En el siguiente ejemplo, pueden darse varios valores reset_option cada uno de ellos tras el primero precedidos por comas:
RESET reset_option [,reset_option] ...
Los comandos para inicializar variables del shell se muestran usando la sintaxis del shell Bourne. Por ejemplo, la secuencia para incializar una variable de entorno y ejecutar un comando es la siguiente con la sintaxis del shell Bourne:
Panormica de MySQL AB
Si utiliza csh o tcsh, debe proporcionar comandos ligeramente distintos. Debera ejecutar la secuencia anterior as:
shell> setenv VARNAME value shell> some_command
MySQL es un sistema de gestin de bases de datos Una base de datos es una coleccin estruturada de datos. Puede ser cualquier cosa, desde una simple lista de compra a una galera de pintura o las ms vastas cantidades de informacin en una red corporativa. Para aadir, acceder, y procesar los datos almacenados en una base de datos, necesita un sistema de gestin de base de datos como MySQL Server. Al ser los computadores muy buenos en tratar grandes cantidades de datos, los sistemas de gestin de bases de datos juegan un papel central en computacin, como aplicaciones autnomas o como parte de otras aplicaciones. MySQL es un sistema de gestin de bases de datos relacionales Una base de datos relacional almacena datos en tablas separadas en lugar de poner todos los datos en un gran almacn. Esto aade velocidad y flexibilidad. La parte SQL de "MySQL"se refiere a "Structured Query Language". SQL es el lenguaje estandarizado ms comn para acceder a bases de datos y est definido por el estndar ANSI/ISO SQL. El estndar SQL ha evolucionado desde 1986 y existen varias versiones. En este manual, "SQL-92" se refiere al estndar del 1992, "SQL:1999" se refiere a la versin del 1999, y "SQL:2003" se refiere a la versin actual del estndar. Usamos la frase "el estndar SQL" para referirnos a la versin actual de SQL. MySQL software es Open Source. Open Source significa que es posible para cualquiera usar y modificar el software. Cualquiera puede bajar el software MySQL desde internet y usarlo sin pagar nada. Si lo desea, puede estudiar el cdigo fuente y cambiarlo para adapatarlo a sus necesidades. El software MySQL usa la licencia GPL (GNU General Public License), http://www.fsf.org/licenses/, para definir lo que puede y no puede hacer con el software en diferentes situaciones. Si no se encuentra cmodo con la GPL o necesita aadir cdigo MySQL en una aplicacin comercial, puede comprarnos una licencia comercial. Consulte la Introduccin a las Licencias MySQL para ms informacin (http:// www.mysql.com/company/legal/licensing/). El servidor de base de datos MySQL es muy rpido, fiable y fcil de usar. Si esto es lo que est buscando, debera probarlo. El servidor MySQL tambin tiene una serie de caractersticas prcticas desarrolladas en cooperacin con los usuarios. Puede encontrar comparaciones de rendimiento de MySLQL Server con otros sistemas de gestin de bases de datos en nuestra pgina de comparativas de rendimiento. Consulte Seccin 7.1.4, El paquete de pruebas de rendimiento (benchmarks) de MySQL. MySQL Server se desarroll originalmente para tratar grandes bases de datos mucho ms rpido que soluciones existentes y ha sido usado con xito en entornos de produccin de alto rendimiento durante varios aos. MySQL Server ofrece hoy en da una gran cantidad de funciones. Su conectividad, velocidad, y seguridad hacen de MySQL Server altamente apropiado para acceder bases de datos en Internet MySQL Server trabaja en entornos cliente/servidor o incrustados El software de bases de datos MySQL es un sistema cliente/servidor que consiste en un servidor SQL multi-threaded que trabaja con diferentes bakends, programas y bibliotecas cliente, herramientas administrativas y un amplio abanico de interfaces de programacin para aplicaciones (APIs). Tambin proporcionamos el MySQL Server como biblioteca incrustada multi-threaded que puede lincar en su aplicacin para obtener un producto ms pequeo, rpido y fcil de administrar. Una gran cantidad de software de contribuciones est disponible para MySQL Es muy posible que su aplicacin o lenguaje favorito soporte el servidor de base de datos MySQL. La forma oficial de pronunciar "MySQL" es "My Ess Que Ell" (no "my sicuel"), pero no importa si lo pronuncia como "my sicuel" o de alguna otra forma.
Historia de MySQL
El cdigo MySQL se prueba con Purify (un detector de memoria perdida comercial) as como con Valgrind, una herramienta GPL (http://developer.kde.org/~sewardj/). El servidor est disponible como un programa separado para usar en un entorno de red cliente/servidor. Tambin est disponible como biblioteca y puede ser incrustado (linkado) en aplicaciones autnomas. Dichas aplicaciones pueden usarse por s mismas o en entornos donde no hay red disponible.. Tipos de columnas Diversos tipos de columnas: enteros con/sin signo de 1, 2, 3, 4, y 8 bytes de longitud, FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET, ENUM, y tipos espaciales OpenGIS. Consulte Captulo 11, Tipos de columna. Registros de longitud fija y longitud variable. Sentencias y funciones Soporte completo para operadores y funciones en las clusulas de consultas SELECT y WHERE. Por ejemplo:
mysql> SELECT CONCAT(first_name, ' ', last_name) -> FROM citizen -> WHERE income/dependents > 10000 AND age > 30;
Soporte completo para las clusulas SQL GROUP BY y ORDER BY. Soporte de funciones de agrupacin (COUNT(), COUNT(DISTINCT ...), AVG(), STD(), SUM(), MAX(), MIN(), y GROUP_CONCAT()). Soporte para LEFT OUTER JOIN y RIGHT OUTER JOIN cumpliendo estndares de sintaxis SQL y ODBC. Soporte para alias en tablas y columnas como lo requiere el estndar SQL. DELETE, INSERT, REPLACE, y UPDATE devuelven el nmero de filas que han cambiado (han sido afectadas). Es posible devolver el nmero de filas que seran afectadas usando un flag al conectar con el servidor. El comando especfico de MySQL SHOW puede usarse para obtener informacin acerca de la base de datos, el motor de base de datos, tablas e ndices. El comando EXPLAIN puede usarse para determinar cmo el optimizador resuelve una consulta. Los nombres de funciones no colisionan con los nombres de tabla o columna. Por ejemplo, ABS es un nombre vlido de columna. La nica restriccin es que para una llamada a una funcin, no se permiten espacios entre el nombre de funcin y el '(' a continuacin. Consulte Seccin 9.6, Tratamiento de palabras reservadas en MySQL. Puede mezclar tablas de distintas bases de datos en la misma consulta (como en MySQL 3.22). Seguridad Un sistema de privilegios y contraseas que es muy flexible y seguro, y que permite verficacin basada en el host. Las contraseas son seguras porque todo el trfico de contraseas est cifrado cuando se conecta con un servidor. Escalabilidad y lmites Soporte a grandes bases de datos. Usamos MySQL Server con bases de datos que contienen 50 millones de registros. Tambin conocemos a usuarios que usan MySQL Server con 60.000 tablas y cerca de 5.000.000.000.000 de registros.
Estabilidad de MySQL
Se permiten hasta 64 ndices por tabla (32 antes de MySQL 4.1.2). Cada ndice puede consistir desde 1 hasta 16 columnas o partes de columnas. El mximo ancho de lmite son 1000 bytes (500 antes de MySQL 4.1.2).Un ndice puede usar prefijos de una columna para los tipos de columna CHAR, VARCHAR, BLOB, o TEXT. Conectividad Los clientes pueden conectar con el servidor MySQL usando sockets TCP/IP en cualquier plataforma. En sistemas Windows de la familia NT (NT,2000,XP, o 2003), los clientes pueden usar named pipes para la conexin. En sistemas Unix, los clientes pueden conectar usando ficheros socket Unix. En MySQL 5.0, los servidores Windows soportan conexiones con memoria compartida si se inicializan con la opcin --shared-memory. Los clientes pueden conectar a travs de memoria compartida usando la opcin --protocol=memory. La interfaz para el conector ODBC (MyODBC) proporciona a MySQL soporte para programas clientes que usen conexiones ODBC (Open Database Connectivity). Por ejemplo, puede usar MS Access para conectar al servidor MySQL. Los clientes pueden ejecutarse en Windows o Unix. El cdigo fuente de MyODBC est disponible. Todas las funciones para ODBC 2.5 estn soportadas, as como muchas otras. Consulte Seccin 25.1, MySQL Connector/ODBC. La interfaz para el conector J MySQL proporciona soporte para clientes Java que usen conexiones JDBC. Estos clientes pueden ejecutarse en Windows o Unix. El cdigo fuente para el conector J est disponible. Consulte Seccin 25.4, MySQL Connector/J. Localizacin El servidor puede proporcionar mensajes de error a los clientes en muchos idomas. Consulte Seccin 5.9.2, Escoger el idioma de los mensajes de error. Soporte completo para distintos conjuntos de caracteres, incluyendo latin1 (ISO-8859-1), german, big5, ujis, y ms. Por ejemplo, los caracteres escandinavos '', '' y '' estn permitidos en nombres de tablas y columnas. El soporte para Unicode est disponible Todos los datos se guardan en el conjunto de caracteres elegido. Todas las comparaciones para columnas normales de cadenas de caracteres son case-insensitive. La ordenacin se realiza acorde al conjunto de caracteres elegido (usando colacin Sueca por defecto). Es posible cambiarla cuando arranca el servidor MySQL. Para ver un ejemplo de ordenacin muy avanzada, consulte el cdigo Checo de ordenacin. MySQL Server soporta diferentes conjuntos de caracteres que deben ser especificados en tiempo de compilacin y de ejecucin. Clientes y herramientas MySQL server tiene soporte para comandos SQL para chequear, optimizar, y reparar tablas. Estos comandos estn disponibles a travs de la lnea de comandos y el cliente mysqlcheck. MySQL tambin incluye myisamchk, una utilidad de lnea de comandos muy rpida para efectuar estas operaciones en tablas MyISAM. Consulte Captulo 5, Administracin de bases de datos. Todos los programas MySQL pueden invocarse con las opciones --help o -? para obtener asistencia en lnea.
se basa en datos recopilados de las listas de correo, que son muy activas para identificar problemas as como para reportar tipos de usos. El cdigo original se remonta a los principos de los aos 80. En TcX, la predecesora de MySQL AB, el cdigo MySQL ha funcionado en proyectos desde mediados de 1996 sin ningn problema. Cuando el software de base de datos MySQL fue distribudo entre un pblico ms amplio, nuestros nuevos usuarios rpidamente encontraron trozos de cdigo no probados. Cada nueva versin desde entonces ha tenido pocos problemas de portabilidad incluso considerando que cada nueva versin ha tenido muchas nuevas funcionalidades. Cada versin de MySQL Server ha sido usable. Los problemas han ocurrido nicamente cuando los usuarios han probado cdigo de las "zonas grises". Naturalmente, los nuevos usuarios no conocen cules son estas zonas; esta seccin, por lo tanto, trata de documentar dichas reas conocidas a da de hoy. Las descripciones mayormente se corresponden con la versin 3.23, 4.0 y 4.1 de MySQL Server. Todos los bugs reportados y conocidos se arreglan en la ltima versin, con las excepciones listadas en las secciones de bugs y que estn relacionados con problemas de diseo. Consulte Seccin A.8, Problemas conocidos en MySQL. El diseo de MySQL Server es multi capa, con mdulos independientes. Algunos de los ltimos mdulos se listan a continuacin con una indicacin de lo bien testeados que estn: Replicatin (Estable) Hay grandes grupos de servidores usando replicacin en produccin, con buenos resultados. Se trabaja para mejorar caractersticas de replicacin en MySQL 5.x. InnoDB tablas (Estable) El motor de almacenamiento transaccional InnoDB es estable y usado en grandes sistemas de produccin con alta carga de trabajo. BDB tablas (Estable) El cdigo Berkeley DB es muy estable, pero todava lo estamos mejorando con el interfaz del motor de almacenamiento transaccional BDB en MySQL Server. Bsquedas Full-text (Estable) Bsquedas Full-text es mpliamente usada. MyODBC 3.51 (Estable) MyODBC 3.51 usa ODBC SDK 3.51 y es usado en sistemas de produccin mpliamente. Algunas cuestiones surgidas parecen ser cuestin de las aplicaciones que lo usan e independientes del controlador ODBC o la base de datos subyacente.
Sistema operativo Linux 2.2-Intel 32-bit Linux 2.4 Solaris 9/10 win32 w/ FAT/FAT32 win32 w/ NTFS MacOS X w/ HFS+
Tamao mximo de fichero 2GB (LFS: 4GB) (usando sistema de ficheros ext3) 4TB 16TB 2GB/4GB 2TB (posiblemente mayor) 2TB
En Linux 2.2, puede utilizar tablas MyISAM mayores de 2GB usando el parche para LFS (Large File Support) en el sistema de ficheros ext2. En Linux 2.4 y posteriores, existen parches para ReiserFS soportando grandes archivos (hasta 2TB). La mayora de distribuciones Linux se basan en el kernel 2.4 o 2.6 e incluyen todos los parches LFS necesarios. Con JFS y XFS, se permiten ficheros mayores de un petabyte para Linux. Sin embargo, el tamao mximo de ficheros todava depende de diversos factores, uno de ellos siendo el sistema de ficheros usado para almacenar tablas MySQL. Para un resumen ms detallado acerca de LFS en Linux, recomendamos la pgina de Andreas Jaeger Large File Support in Linux en http://www.suse.de/~aj/linux_lfs.html. Usuarios de Windows, por favor tengan en cuenta que: FAT and VFAT (FAT32) no se consideran apropiados para sistemas de produccin con MySQL. Use NTFS para ello. Por defecto, MySQL crea tablas MyISAM con una estructura interna que permite un tamao mximo de unas 4GB. Puede chequear el tamao mximo de tabla para una tabla con el comando SHOW TABLE STATUS o con myisamchk -dv tbl_name. Consulte Seccin 13.5.4, Sintaxis de SHOW. Si necesita una tabla MyISAM con un tamao mayor a 4GB (y su sistema operativo soporta ficheros grandes), el comando CREATE TABLE permite las opciones AVG_ROW_LENGTH y MAX_ROWS. Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE. Tambin puede cambiar esas opciones con ALTER TABLE una vez que la tabla se ha creado, para aumentar el tamao mximo de la tabla. Consulte Seccin 13.1.2, Sintaxis de ALTER TABLE. Otros mtodos para cambiar los lmites de tamao de ficheros para tablas MyISAM son: Si una tabla es de slo lectura, puede usar myisampack para comprimirla. myisampack normalmente comprime una tabla al menos un 50%, lo que permite, a efectos prcticos, tablas mucho mayores. myisampack puede mezclar mltiples tablas en una misma tabla. Consulte Seccin 8.2, myisampack, el generador de tablas comprimidas de slo lectura de MySQL. MySQL incluye la biblioteca MERGE que permite tratar una coleccin de tablas MyISAM con una estructura idntica en una tabla MERGE. Consulte Seccin 14.2, El motor de almacenamiento MERGE.
10
La siguiente demostracin ilustra que MySQL Server no tiene problemas con valores DATE o DATETIME hasta el ao 9999, ni tampoco tiene problemas con valores de tipo TIMESTAMP hasta el ao 2030:
mysql> DROP TABLE IF EXISTS y2k; Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE y2k (date DATE, -> date_time DATETIME, -> time_stamp TIMESTAMP); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO y2k VALUES -> ('1998-12-31','1998-12-31 23:59:59',19981231235959), -> ('1999-01-01','1999-01-01 00:00:00',19990101000000), -> ('1999-09-09','1999-09-09 23:59:59',19990909235959), -> ('2000-01-01','2000-01-01 00:00:00',20000101000000), -> ('2000-02-28','2000-02-28 00:00:00',20000228000000), -> ('2000-02-29','2000-02-29 00:00:00',20000229000000), -> ('2000-03-01','2000-03-01 00:00:00',20000301000000), -> ('2000-12-31','2000-12-31 23:59:59',20001231235959), -> ('2001-01-01','2001-01-01 00:00:00',20010101000000), -> ('2004-12-31','2004-12-31 23:59:59',20041231235959), -> ('2005-01-01','2005-01-01 00:00:00',20050101000000), -> ('2030-01-01','2030-01-01 00:00:00',20300101000000), -> ('2040-01-01','2040-01-01 00:00:00',20400101000000), -> ('9999-12-31','9999-12-31 23:59:59',99991231235959); Query OK, 14 rows affected (0.01 sec) Records: 14 Duplicates: 0 Warnings: 2 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 | | 2040-01-01 | 2040-01-01 00:00:00 | 00000000000000 | | 9999-12-31 | 9999-12-31 23:59:59 | 00000000000000 | +------------+---------------------+----------------+ 14 rows in set (0.00 sec)
Los dos ltimos valores de columna TIMESTAMP son cero porque los valores de ao (2040, 9999) excede el mximo de TIMESTAMP. El tipo de datos TIMESTAMP que se usa para almacenar el tiempo actual, soporta valores del rango 19700101000000 hasta 20300101000000 en mquinas de 32-bit (valores con signo). En mquinas de 64-bit, TIMESTAMP trata valores hasta 2106 (valores sin signo). Aunque MySQL Server por s mismo no tiene problemas con el ao 2000, puede tenerlos si interacta con aplicaciones que s los tengan. Por ejemplo, muchas aplicaciones antiguas almacenan o manipulan aos usando valores de dos dgitos (que son ambguos) en lugar de cuatro dgitos. Este problema puede darse por aplicaciones que usan valores tales como 00 o 99 como indicadores de valores "perdidos". Por desgracia, estos problemas pueden ser complicados de arreglar, ya que aplicaciones diferentes pueden haber sido programadas por distintos programadores, cada uno de los cuales puede usar una serie de distintas convenciones y funciones de fechas. As, aunque MySQL Server no tiene problemas con el ao 2000, es la responsabilidad de la aplicacin de proporcionar entradas inambguas. Consulte Seccin 11.3.4, Efecto 2000 (Y2K) y tipos de datos para las reglas de MySQL Server para tratar fechas ambguas de dos digitos.
11
12
Administrador de instancias: Puede usarse para iniciar y parar el MySQL Server, incluso desde una mquina remota. Consulte Seccin 5.2, El gestor de instancias de MySQL. Matemticas de precisin: Consulte Captulo 23, Matemticas de precisin. Procedimientos almacenados: Consulte Captulo 19, Procedimientos almacenados y funciones. Modo estricto y tratamiento de errores estndar: Consulte Seccin 5.3.2, El modo SQL del servidor y Captulo 26, Manejo de errores en MySQL. Disparadores: Consulte Captulo 20, Disparadores (triggers). Tipo de datos VARCHAR: Soporte nativo VARCHAR. La longitud mxima de VARCHAR es 65,532 bytes ahora, y no se cortan espacios en blanco consecutivos. Consulte Seccin 11.4.1, Los tipos CHAR y VARCHAR. Vistas: Consulte Captulo 21, Vistas (Views) y Seccin 1.7.5.6, Vistas. La seccin Novedades de este manual incluye una lista ms en profundidad de caractersticas. Consulte Seccin C.1, Cambios en la entrega 5.0.x (Desarrollo). Para los que deseen consultar las ltimas novedades de MySQL, tenemos nuestro repositorio BitKeeper para MySQL disponible pblicamente. Consulte Seccin 2.8.3, Instalar desde el rbol de cdigo fuente de desarrollo.
13
bugs Esta lista es para gente que desee estar informada sobre cuestiones reportadas desde la ltima versin de mySQL o que deseen estar activamente implicadas en el proceso de buscar bugs y arreglarlos. Consulte Seccin 1.6.1.3, Cmo informar de bugs y problemas. temas internos Esta lista es para gente que trabaja en el cdigo de MySQL. Este tambin es el frum para discutir acerca del desarrollo de MySQL y para publicar parches. mysqldoc Esta lista es para gente que trabaja en la documentacin de MySQL: gente de MySQL AB, traductores, y otros miembros de la comunidad. pruebas de rendimiento Esta lista es para cualquiera interesado en temas de rendimiento. La discusin se concentra en rendimiento de bases de datos ( no slo de MySQL), pero tambin incluye categoras ms amplias como rendimiento del kernel, sistema de ficheros, tipos de discos, etc. empaquetadores Esta lista es para discusiones acerca de empaquetar y distribuir MySQL. Este es el frum usado por mantenedores de distribuciones para intercambiar ideas sobre empaquetar MySQL y asegurar que MySQL parece tan similar como sea posible en todas las plataformas y sistemas operativos soportados. java Esta lista es para discusionse acerca de MySQL Server y Java. Normalmente se usa para discutir acerca de JDBC, incluyendo el connector/J de MySQL. win32 Esta lista es para todos los temas acerca del software MySQL en sistemas operativos Microsoft, tales como Windows 9x, Me, NT, 2000, SP y 2003.. myodbc Esta lista es para todos los tpicos acerca de conectar al MySQL Server con ODBC. herramientas gui Esta lista es para todos los temas acerca de herramientas GUI MySQL, incluyendo MySQL Administrator y el cliente grfico MySQL Control Center. cluster Esta lista es para discusin acerca de MySQL Cluster. dotnet Esta lista es para discusin acerca de MySQL Server y la plataforma .NET. La mayora de discusiones es acerca del Connector/NET MySQL. plusplus Esta lista es para tpicos acerca de programacin con la API C++ para MySQL. perl Esta lista es para tpicos acerca de soporte Perl para MySQL con DBD::mysql.
14
Si no es capaz de obtener una respuesta a su pregunta de ninguna lista MySQL, una opcin es adquirir soporte de MySQL AB. Esto le pondr en contacto directo con los desarrolladores. La siguiente tabla muestra algunas listas de correo MySQL en idiomas distintos al ingls. Estas listas no son operadas por MySQL AB. <mysql-france-subscribe@yahoogroups.com> Lista de correo francesa. <list@tinc.net> Lista de correo Koreana. Enve un correo a subscribe mysql your@email.address para subscribirse a la lista. <mysql-de-request@lists.4t2.com> Lista de correo Alemana. Enve un correo a subscribe mysql-de your@email.address para subscribirse a la lista. Puede encontrar informacin acerca de esta lista en http://www.4t2.com/ mysql/. <mysql-br-request@listas.linkway.com.br> Lista de correo Portuguesa. Enve un correo a subscribe mysql-br your@email.address para subscribirse a la lista. <mysql-alta@elistas.net> Lista de correo Espaola. Enve un correo a subscribe mysql your@email.address para subscribirse a la lista.
15
seccin muestra cmo escribir un reporte correctamente de forma que no pierda su tiempo haciendo cosas que no nos ayudan en absoluto. Animamos a todo el mundo a usar el script mysqlbug para generar un reporte de bug (o un reporte acerca de cualquier problema). mysqlbug puede encontrarse en el directorio scripts (distribucin fuente) y en el directorio bin en el directorio de instalacin (distribucin binaria). Si no es posible usar mysqlbug (por ejemplo, si utiliza Windows), es vital que incluya toda la informacin necesaria que aparece en esta seccin (y lo ms importante, una descripcin del sistema operativo y la versin de MySQL). El script mysqlbug le ayuda a generar un reporte determinando la mayora de la informacin automticamente, pero si falta algo importante, por favor inclyalo en su mensaje. Por favor, lea esta seccin con cuidado y asegrese que toda la informacin descrita aqu se incluye en su reporte. Preferiblemente, debe testear el problema usando la ltima versin de produccin o desarrollo de MySQL server antes de postear. Cualquiera debera ser capaz de repetir el bug usando mysql test< script_file en el caso de test includo o ejecutando el script de consola o Perl includo en el reporte de bug. Todos los bugs posteados en la base de datos de bugs en http://bugs.mysql.com/ se corrigen o documentan en la siguiente actualizacin de MySQL. Si slo se necesitan cambios menores en el cdigo para arreglarlo, podemos postear un parche para arreglarlo. Si encuentra un fallo importante de seguridad en MySQL, puede enviar un correo a <security@mysql.com>. Si tiene un reporte de bug repetible, por favor envelo a la base de datos de bugs en http:// bugs.mysql.com/. Tenga en cuenta que incluso en este caso es bueno ejecutar el script mysqlbug antes para reunir informacin de su sistema. Cualquier bug que seamos capaces de reproducir tiene una alta probabilidad de arreglarse en la siguiente versin de MySQL. Para reportar otros problemas, puede usar cualquiera de las listas de correo de MySQL. Recuerde que nos es posible responder un mensaje que contenga demasiada informacin, pero no si no contiene suficiente. Normalmente se omiten los hechos porque se piensa que se conoce la causa del problema y se asume que algunos detalles no importan. Un buen principio es el siguiente: si duda acerca de explicar algo, hgalo. Es ms rpido y menos problemtico escribir un par de lneas extra en su reporte que esperar a la respuesta si debemos preguntar algo que no se incluya en el reporte inicial. Los errores ms comunes en los reportes de error son (a) no incluir el nmero de versin de la distribucin MySQL Server usada, y (b) no escribir completamente la plataforma en la est instalado MySQL Server (incluyendo el tipo de plataforma y nmero de versin). Esta es informacin altamente relevante, y en el 99% de los casos el reporte de bug es intil sin ella. Muy a menudo nos preguntas "Porqu no me funciona a m?" Entonces encontramos que la caracterstica reportada no estaba implementada en esa versin de MySQL. A veces el error depende de la plataforma; en esos casos es casi imposible para nosotros arreglar nada sin saber el sistema operativo y el nmero de versin de la plataforma. Si ha compilado MySQL del cdigo fuente, recuerde en proporcionar informacin acerca del compilador, si est relacionada con el problema. A menudo la gente encuentra fallos en los compiladores y cree que el problema est relacionado con MySQL. La mayora de los compiladores estn bajo desarrollo contnuo y mejoran versin a versin, necesitamos saber qu compilador usa. Tenga en cuenta que cada cada problema de compilacin debe ser considerado como un bug y reportado como tal. Es ms til cuando se incluye una buena descripcin del problema junto al reporte del bug. Esto es dar un buen ejemplo de todo lo que conduce al problema y describir exactamente el problema en s. El mejor reporte es el que incluye un ejemplo incluyendo cmo reproducir el problema o bug. Consulte Seccin D.1.6, Crear un caso de prueba tras haber encontrado una tabla corrupta.
16
Si un programa produce un mensaje de error es muy importante incluirlo en el reporte. Si tratamos de buscar algo de los archivos usando programas, es mejor que el mensaje de error coincida exactamente con el producido por el programa (incluso es importante respetar maysculas y minsculas). Nunca debe intentar reproducir de memoria el mensaje de error; en lugar de ello, copie el mensaje entero en el reporte. Si tiene algn problema con el Connector/ODBC (MyODBC), por favor trate de generar un fichero de traza y enviarlo con su reporte. Consulte Seccin 25.1.7.2, How to Report Connector/ODBC Problems or Bugs. Por favor, recuerde que mucha gente que lea su reporte lo har con un monitor de 80 columnas. Cuando genere reportes o ejemplos usando la columna de lnea de comandos mysql debe usar la opcin --vertical (o el terminador de comando \G ) para salida que excedera el ancho disponible para tales monitores ( por ejemplo, con el comando EXPLAIN SELECT; ( vea el ejemplo al final de esta seccin). Por favor, incluya la siguiente informacin en su reporte: El nmero de la versin de la distribucin de MySQL que usa (por ejemplo, MySQL 4.0.12). Puede consultar la versin que est usando ejecuntado mysqladmin version. El programa mysqladmin puede encontrarse en el directorio bin bajo el directorio de instalacin. El fabricante y modelo de la mquina en la que experimenta el problema. Nombre del sistema operativo y versin. Si trabaja con Windows, puede obtener el nombre y nmero de versin haciendo doble click en el icono Mi PC y consultando el men "Ayuda/Acerca de Windows". Para la mayora de sistemas Unix puede obtener esta informacin con el comando uname -a. En ocasiones la cantidad de memoria (real y virtual) es relevante. Si lo duda, incluya estos valores. Si usa una distribucin fuente del software MySQL, el nombre y nmero de versin del compilador usado es necesario.Si usa una distribucin binaria, necesita el nombre de la distribucin. Si el problema ocurre durante la compilacin, incluya el mensaje de error exacto y unas cuantas lneas de contexto alrededor del cdigo en el fichero donde ocurre el error. Si mysqld cae, incluya la consulta que hizo caer mysqld. Normalmente puede consultarlo ejecutando mysqld con el log de consultas activado, y luego consultando el log tras la cada de mysqld. Consulte Seccin D.1.5, El uso de registros (logs) para encontrar la causa de errores de mysqld. Si una base de datos est relacionada con el problema, incluya la salida del comando mysqldump --no-data db_name tbl_name. Este es un mtodo sencillo y poderoso para obtener informacin acerca de cualquier tabla en una base de datos. La informacin nos ayuda a crear una situacin similar a la que ha provocado el fallo. Para bugs relacionados con rendimiento o problemas con consultas SELECT, siempre debe incluir la salida de EXPLAIN SELECT ..., y como mnimo el nmero de filas que el comando SELECT produce. Tambin puede incluir la salida de SHOW CREATE TABLE tbl_name para cada tabla implicada. Mientras ms informacin tengamos acerca de la situacin, es ms posible que podamos ayudar.. El siguiente es un ejemplo de un reporte muy bueno. Debe ser posteado con el script mysqlbug. El ejemplo usa la herramienta por lneas de comando mysql. Tenga en cuenta el terminador de comandos \G para comandos cuya salida exceda las de un monitor de 80 columnas.
mysql> SHOW VARIABLES; mysql> SHOW COLUMNS FROM ...\G <salida de SHOW COLUMNS> mysql> EXPLAIN SELECT ...\G <salida de EXPLAIN> mysql> FLUSH STATUS;
17
mysql> SELECT ...; <Una pequea descripcin de la salida del SELECT, incluyendo el tiempo empleado en ejecutar la consulta> mysql> SHOW STATUS; <salida de SHOW STATUS>
Si ocurre un problema al ejecutar mysqld, trate de proporcionar un script de entrada que reproduzca la anomala. Este script debe incluir cualquier fichero fuente necesario. Mientras ms fielmente reproduzca el script la situacin, mejor. Si puede hacer un caso de test reproducible, debe postearlo en http://bugs.mysql.com/ para un tratamiento prioritario. Si no puede proporcionar un script, debe como mnimo incluir la salida de mysqladmin variables extended-status processlist en su correo para proporcionar algo de informacin sobre cmo se est comportando el sistema. Si no puede proporcionar un caso de test con unas pocas lneas, o si la tabla de test es demasiado grande para ser enviada a la lista de correo (ms de 10 filas), debe dumpear sus tablas usando mysqldump y crear un ficero README que describa su problema. Cree un fichero comprimido con sus ficheros usando tar y gzip o zip, y use FTP para transferir el archivo a ftp://ftp.mysql.com/pub/mysql/upload/. Despus introduzca el problema en nuestra base de datos en http://bugs.mysql.com/. Si cree que el servidor MySQL produce un resultado extrao de una consulta, incluya no slo el resultado, sino tambin su opinin sobre cul debera ser el resultado correcto, y una citacin describiendo las bases de su opinin. Cuando de un ejemplo del problema, es mejor usar los nombres de variables, de tablas, etc. que existan en la situacin en lugar de usar nuevos nombres. El problema puede estar relacionado con el nombre de una variable o tabla. Estos casos son raros, pero es mejor estar seguro que arrepentirse luego. Despus de todo, debera ser ms fcil dar un ejemplo que use la situacin real y esto es mejor para nosotros. En caso que tenga datos que no quiera ensear, puede usar FTP para transferirlo a ftp://ftp.mysql.com/pub/mysql/upload/. Si la informacin es realmente secreta y no quiere ensernosla, entonces puede proporcionarnos un ejemplo usando otros nombres, pero por favor, considrelo como la ltima opcin. Incluya todas las opciones introducidas en los programas relevantes, si es posible. Por ejemplo, indique las opiones que usa cuando inicia el servidor mysqld as como las opciones que usa cuando ejecuta cualquier programa cliente MySQL. Las opciones de dichos programas, tales como mysqld y mysql, y al script configure , son a menudo claves para obtener una respuesta y muy relevantes. Nunca es mala idea incluirlas. Si usa cualquier mdulo, como Perl o PHP, por favor incluya los nmero de versiones de los mismos tambin. Si su pregunta est relacionada con el sistema de privilegios, por favor incluya la salida de mysqlaccess, la salida de mysqladmin reload, y todos los mensajes de error que obtenga cuando intente conectar. Cuando testee sus privilegios, debe ejecutar el comando mysqlaccess. Despus, ejecute mysqladmin reload version y trate de conectar con el comando que le causa problemas. mysqlaccess se encuentra en el directorio bin bajo el directorio de instalacin de MySQL. Si tiene un parche para un bug, inclyalo. Pero no asuma que el parche es todo lo que necesitamos o que podemos usarlo, sin proporcionar alguna informacin necesaria como casos de test mostrando el problema que corrige el parche. Podemos encontrar problemas en su parche o puede que no lo entendamos en absoluto; en ese caso no podemos usarlo. Si no podemos verificar exactamente el propsito del parche, no lo usaremos. Los casos de test nos ayudan en este punto. Nos muestran que el parche puede tratar todas las situaciones que puedan ocurrir. Si encontramos un caso extremo (incluso uno raro) donde el parche no funcione, ser intil. Suposiciones acerca de la naturaleza del bug, porqu ocurre o de qu depende, suelen ser incorrectas. Incluso el equipo de MySQL no puede adivinar estas cosas sin usar un debugger para determinar la causa real de un bug.
18
Indique en su reporte que ha chequeado el manual de referencia y el archivo de correo, de forma que otros sepan que ha intentado solucionar el problema por s mismo. Si obtiene un parse error, por favor chequee su sintaxis con cuidado. Si no puede encontrar nada incorrecto en ella, es muy posible que su versin de MySQL Server no soporte la sintaxis que utiliza. Si est usando la versin actual y el manual en http://dev.mysql.com/doc/ no cubre la versin que usa, MySQL Server no soporta su consulta. En ese caso, sus nicas opciones son implementar la sintaxis usted mismo o enviar un mail a <licensing@mysql.com> y pedir una oferta para implementarlo. Si el manual cubre la sintaxis que est usando, pero tiene una versin ms antigua de MySQL, compruebe el historial de cambios de MySQL para ver si la sintaxis ha sido implementada. En ese caso, tiene la opcin de actualizar a una nueva versin de MySQL Server. Consulte Apndice C, Historial de cambios de MySQL. Si su problema es que los datos parecen estar corruptos u obtiene errores al acceder a una tabla en particular, debe chequear y tratar de arreglar las tablas con CHECK TABLE y REPAIR TABLE o con myisamchk. Consulte Captulo 5, Administracin de bases de datos. Si est utilizando Windows, verifique que lower_case_table_names es 1 o 2 con SHOW VARIABLES LIKE 'lower_case_table_names'. Si tiene problemas con tablas corruptas a menudo, debe tratar de encontrar cundo y porqu ocurre. En este caso, el log de errores en el directorio de datos de MySQL puede contener informacin acerca de qu ha ocurrido. (ste es el fichero con el sufijo .err en el nombre.) Consulte Seccin 5.10.1, El registro de errroes (Error Log). Por favor, incluya cualquier informacin relevante de este fichero en su reporte. Normalmente mysqld nunca debera corromper una tabla si nada muere durante una actualizacin. Si puede encontrar la causa de un mysqld muriendo, es mucho ms fcil para nosotros encontrar una solucin al problema. Consulte Seccin A.1, Cmo determinar a qu es debido un problema. Si es posible, descargue e instale la versin ms reciente de MySQL Server y compruebe si resuelve su problema. Todas las versiones del software MySQL son testeadas duramente y deberan funcionar sin problemas. Creemos en hacer todo tan compatible con versiones anteriores como sea posible, y debera cambiar entre versiones de MySQL sin dificultades. Consulte Seccin 2.1.2, Escoger la distribucin MySQL a instalar. Si es un cliente con soporte, por favor enve el reporte de error a <mysql-support@mysql.com> para tratamiento de alta prioridad, as como a la lista de correo apropiada para ver si alguien ms ha experimentado ( y quizs resuelto ) el problema. Para informacin acerca de reportar errores en MyODBC, consulte Seccin 25.1.7.2, How to Report Connector/ODBC Problems or Bugs. Para soluciones de problemas ms comunes, consulte Apndice A, Problemas y errores comunes. Cuando se envan soluciones a usted individualmente y no a la lista de correo, se considera una buena prctica resumir las respuestas y enviar el resumen a la lista de correo, de forma que otros puedan beneficiarse de las respuestas que ha recibido y que le han ayudado a resolver su problema.
19
Por favor, no postee un mensaje desde su navegador con el modo HTML activado. Muchos usuarios no leen el correo con un navegador
20
reducida adecuada para dispositivos hand-held o incrustados. El diseo compacto de MySQL Server hace el desarrollo en ambas direcciones posible sin ningn conflicto en el rbol fuente. Actualmente, no tratamos soporte en tiempo real, aunque la capacidad de replicacin en MySQL ofrece funcionalidades significativas. Existe soporte para clusters de bases de datos a travs de soluciones de terceras partes, as como la integracin de tecnologa NDB Cluster, disponible desde la versin 4.1.2. Consulte Captulo 16, MySQL Cluster. Tambin estamos mirando de proveer de soporte XML en el servidor de base de datos.
En MySQL 4.1, puede conseguir el mismo efecto con los siguientes 2 comandos (especifique el valor de sql_mode en una nica lnea):
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET GLOBAL sql_mode = 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES, IGNORE_SPACE';
Consulte Seccin 1.7.2, Seleccin de modos SQL. En MySQL 4.1.1, la opcin sql_mode puede inicializarse con el siguiente comando:
SET GLOBAL sql_mode='ansi';
En ese caso, el valor de la variable sql_mode se especifica para todas las opciones que son relevantes en el modo ANSI. Puede comprobar el resultado de la siguiente manera:
mysql> SET GLOBAL sql_mode='ansi';
21
Si aade un nmero de versin tras el carcter '!', la sintaxis dentro del comentario se ejecuta slo si el nmero de versin de MySQL es igual o mayor que el especificado:
CREATE /*!32302 TEMPORARY */ TABLE t (a INT);
Eso significa que si tiene la Versin 3.23.02 o posterior, MySQL Server usa la palabra clave TEMPORARY. La siguiente lista describe las extensiones MySQL, organizadas por categoras. Organizacin de los datos en disco MySQL Server mapea cada base de datos a un directorio bajo el directorio de datos de MySQL, y las tablas dentro de cada directorio como ficheros. Esto tiene algunas implicaciones: Puede usar comandos de sistema estndar para hacer copia de seguridad, renombrar, mover, borrar y copiar tablas de tipo MyISAM o ISAM. Por ejemplo, para renombrar el nombre de una tabla MyISAM renombre los archivos .MYD, .MYI, y .frm que correspondan a la tabla. Nombres de bases de datos, tablas, ndices, columnas o alias pueden empezar con un dgito (pero no pueden consistir nicamente de dgitos). Sintaxis general del lenguaje Cadenas de caracteres deben limitarse por '"' o ''', no slo por '''. Use '\' como un carcter de escape en cadenas de caracteres. En comandos SQL, puede acceder a tablas de distintas bases de datos con la sintaxis db_name.tbl_name. Algunos servidores SQL proporcionan la misma fucnionalidad, pero lo llaman User space. MySQL Server no soporta espacios de tablas como los usados en comandos como: CREATE TABLE ralph.my_table...IN my_tablespace. Sintaxis de comandos SQL Los comandos ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE, y REPAIR TABLE. Los comandos CREATE DATABASE y DROP DATABASE. Consulte Seccin 13.1.3, Sintaxis de CREATE DATABASE. El comando DO. EXPLAIN SELECT para obtener una descripcin de cmo las tablas se usan. Los comandos FLUSH y RESET. El comando SET. Consulte Seccin 13.5.3, Sintaxis de SET. 22
El comando SHOW. Consulte Seccin 13.5.4, Sintaxis de SHOW. Uso de LOAD DATA INFILE. En muchos casos, esta sintaxis es compatible con el comando de Oracle LOAD DATA INFILE. Consulte Seccin 13.2.5, Sintaxis de LOAD DATA INFILE. Uso de RENAME TABLE. Consulte Seccin 13.1.9, Sintaxis de RENAME TABLE. Uso de REPLACE en lugar de DELETE + INSERT. Consulte Seccin 13.2.6, Sintaxis de REPLACE. Uso de CHANGE col_name, DROP col_name, o DROP INDEX, IGNORE o RENAME en un comando ALTER TABLE. Uso de mltiples ADD, ALTER, DROP, o CHANGE clusulas en un comando ALTER TABLE. Consulte Seccin 13.1.2, Sintaxis de ALTER TABLE. Uso de nombres de ndices, ndices sobre el prefijo de un cambio, y uso de INDEX o KEY en un comando CREATE TABLE. Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE. Uso de TEMPORARY o IF NOT EXISTS con CREATE TABLE. Uso de IF EXISTS con DROP TABLE. Puede borrar varias tablas con un nico comando DROP TABLE. Las clusulas ORDER BY y LIMIT de los comandos UPDATE y DELETE. Sintaxis de INSERT INTO ... SET col_name = .... La clusula DELAYED de los comandos INSERT y REPLACE. La clusula LOW_PRIORITY de los comandos INSERT, REPLACE, DELETE, y UPDATE. Uso de INTO OUTFILE y STRAIGHT_JOIN en un comando SELECT . Consulte Seccin 13.2.7, Sintaxis de SELECT. La opcin SQL_SMALL_RESULT en un comando SELECT. No necesita nombrar todas las columnas seleccionadas en la parte GROUP BY. Esto proporciona mejor rendimiento en algunas consultas muy especficas pero bastante normales. Consulte Seccin 12.10, Funciones y modificadores para clusulas GROUP BY. Puede especificar ASC y DESC con GROUP BY. La habilidad para inicializar variables en un comando con el operador :=:
mysql> SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg -> FROM test_table; mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
Tipos de columnas Los tipos de columnas MEDIUMINT, SET, ENUM, y los distintos tipos BLOB y TEXT. Los atributos de columnas AUTO_INCREMENT, BINARY, NULL, UNSIGNED, y ZEROFILL. Funciones y operadores Para facilitar a los usuarios que vienen de otros entornos SQL, MySQL Server soporta alias para varias funciones. Por ejemplo, todas las funciones de cadenas de caracteres soportan sintaxis estndar SQL y ODBC. MySQL Server entiende los operadores || y && para OR lgica y AND, como en el lenguaje de programacin C. En MySQL Server, || y OR son sinnimos, como lo son && y AND. Debido a esta
23
sintaxis, MySQL Server no soporta el operador estndar SQL || para concatenar cadenas de caracteres; use en su lugar CONCAT(). Como CONCAT() toma cualquier nmero de argumentos, es fcil adaptarse al uso del operador || a MySQL Server. Uso de COUNT(DISTINCT list) donde list tiene ms de un elemento. Todas las comparaciones de cadenas de caracteres son case-insensitive por defecto, con la ordenacin determinada por el conjunto de caracteres actual (ISO-8859-1 Latin1 por defecto). Si no quiere que sea as, puede declarar las columnas con el atributo BINARY o usar la conversin BINARY, que hace que las comparaciones se hagan usando el cdigo de caracteres subyacente en lugar del orden lxico. El operador % es sinnimo de MOD(). Esto es que N % M es equivalente a MOD(N,M). % se soporta para programadores C y por compatibilidad con PostgreSQL. Los operadores =, <>, <= ,<, >=,>, <<, >>, <=>, AND, OR, o LIKE se pueden usar en comparaciones de columnas a la izquierda del FROM en comandos SELECT. Por ejemplo:
mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
La funcin LAST_INSERT_ID() retorna el valor AUTO_INCREMENT ms reciente. Consulte Seccin 12.9.3, Funciones de informacin. LIKE se permite en columnas numricas. Los operadores de expresiones regulares extendidos REGEXP y NOT REGEXP. CONCAT() o CHAR() con un argumento o ms de dos argumentos. (En MySQL Server, estas funciones pueden tomar cualquier nmero de argumentos.) Las funciones BIT_COUNT(), CASE, ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(), ENCRYPT(), MD5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS(), y WEEKDAY(). Uso de TRIM() para eliminar espacios en substrings. Funciones estndar slo SQL soportan eliminar caracteres simples. Las funciones GROUP BY STD(), BIT_OR(), BIT_AND(), BIT_XOR(), y GROUP_CONCAT(). Consulte Seccin 12.10, Funciones y modificadores para clusulas GROUP BY.
24
1.7.5.1. Subconsultas
MySQL 4.1 soporta sub-consultas y tablas derivadas. Una "sub-consulta" es un comando SELECT anidado en otro comando. Una tabla "derivada" (una vista sin nombre) es una subconsulta en la clusula FROM de otra consulta. Consulte Seccin 13.2.8, Sintaxis de subconsultas. Para versiones MySQL anteriores a la 4.1, la mayora de subconsultas pueden reescribirse usando joins u otros mtodos. Consulte Seccin 13.2.8.11, Re-escribir subconsultas como joins en versiones de MySQL anteriores para ejemplos que muestren cmo hacerlo.
Alternativamente, puede usar SELECT INTO OUTFILE ... o CREATE TABLE ... SELECT. Para al versin 5.0, MySQL soporta SELECT ... INTO con variables de usuario. La misma sintaxis puede usarse dentro de procedimientos almacenados usando cursores y variables locales. Consulte Seccin 19.2.9.3, La sentencia SELECT ... INTO.
25
ejecutando scripts sencillos que comprueban que la consistencia de la base de datos, dando una advertencia o reparando automticamente cualquier incosistencia. Simplemente usando el log de MySQL o aadiendo un log extra, normalmente puede arreglar tablas sin prdida de integridad en los datos. 2. Normalmente, las actualizaciones transaccionales crticas pueden reescribirse como atmicas.Generalmente hablando, todos los problemas de integridad que resuelven las transacciones pueden resolverse con LOCK TABLES o actualizaciones atmicas, asegurando que no se aborten automticamente desde el servidor, el cul es un problema habitual en sistemas de bases de datos transaccionales. 3. Para tener un entorno fiable de MySQL, usando tablas transaccionales o no, slo necesita tener copias de seguridad y el log binario activado. Con ello, puede recuperarse de cualquier situacin de la que pueda hacerlo con cualquier otro sistema transaccional. Siempre es bueno tener copias de seguridad, independientemente del sistema de bases de datos usado. El paradigma transaccional tiene sus ventajas y desventajas. Muchos usuarios y desarrolladores de aplicaciones dependen en la facilidad con la que pueden solucionar problemas donde un aborto parece ser o es necesario. Sin embargo, incluso si el paradigma de operaciones atmicas le es desconocido o est ms familiarizado con las transacciones, considere el beneficio de la velocidad que pueden ofrecer las tablas no transaccionales, que puede ser de tres a cinco veces ms rpido que las ms optimizadas tablas transaccionales. En las situaciones en las que la integridad es de mxima importancia, MySQL Server ofrece integridad a nivel de transaccin incluso para tablas no transaccionales. Si bloquea tablas con LOCK TABLES, todas las actualizaciones se bloquean hasta que se hacen las comprobaciones necesarias. Si obtiene un bloqueo READ LOCAL (el contrario a un bloqueo de escritura) para una tabla que permita inserciones concurrentes al final de la tabla, las lecturas estn permitidas, as como las inserciones de otros clientes. Los registros insertados no puede verlos el cliente que tenga el bloqueo hasta que lo libere. Con INSERT DELAYED, puede encolar inserciones en una cola local, hasta que los bloqueos se liberan, sin tener que esperar el cliente a que acabe la insercin. Consulte Seccin 13.2.4.2, Sintaxis de INSERT DELAYED. "Atmico", en el sentido en que nos referimos, no es nada mgico. Se trata que puede asegurar que mientras cada actualizacin especfica est ejecutndose, ningn otro usuario puede interferir con ellas, y que nunca puede haber un rollback automtico (lo que puede ocurrir con tablas transaccionales si no se es muy cuidadoso). MySQL Server garantiza que no hay dirty reads (lecturas sucias). A continacin se presentan algunas tcnicas para trabajar con tablas no transaccionales: Los bucles que necesiten transacciones normalmente pueden codificarse con la ayuda de LOCK TABLES, y no necesita cursores para actualizar registros en tiempo real. Para evitar usar ROLLBACK, puede usar la siguiente estrategia: 1. Use LOCK TABLES para bloquear todas las tablas a las que quiere acceder. 2. Compruebe las condiciones que deben darse antes de ejecutar la actualizacin. 3. Actualice si todo es correcto. 4. Use UNLOCK TABLES para liberar los bloqueos. Este es un mtodo mucho ms rpido que usar transacciones con posibles rollbacks, aunque no siempre. La nica situacin en que esta situacin no funciona es cuando alguien mata el thread durante una actualizacin. En ese caso, todos los bloqueos se liberan pero algunas actualizaciones pueden no ejecutarse. Puede usar funciones para actualizar registros en una nica operacin. Puede obtener una aplicacin muy eficiente usando las siguientes tcnicas:
26
Modifique columnas con su valor actual. Actualice slo aqullas que hayan cambiado. Por ejemplo, cuando estamos actualizando la informacin de un cliente, slo actualizamos los datos del cliente que han cambiado y comprobamos que los datos cambiados o datos que dependen de los datos cambiados, han cambiado respecto a los datos originales. El test para datos cambiados se hace con la clusula WHERE en el comando UPDATE . Si el registro no se ha actualizado, mostramos un mensaje al cliente: "Algunos de los datos actualizados han sido cambiados por otro usuario". A continuacin mostramos los registros viejos junto a los nuevos en una ventana para que el usuario pueda decidir qu versin del registro de usuario usar. Esto nos da algo que es similar a bloqueo de columnas pero es incluso mejor ya que slo actualizamos algunas de las columnas, usando valores que son relativos a sus valores actuales. Eso significa que el tpico comando UPDATE ser algo as:
UPDATE tablename SET pay_back=pay_back+125; UPDATE customer SET customer_date='current_date', address='new address', phone='new phone', money_owed_to_us=money_owed_to_us-125 WHERE customer_id=id AND address='old address' AND phone='old phone';
Esto es muy eficiente y funciona incluso si otro cliente ha cambiado los valores en las columnas pay_back o money_owed_to_us.
27
Reglas diseadas correctamente para claves forneas pueden ayudar a documentar las relaciones entre tablas. Tenga en cuenta que estos beneficios tienen el coste de un trabajo adicional para el servidor de base de datos para poder realizar todas las comprobaciones necesarias. Chequeos adicionales por parte del servidor afectan al rendimiento, lo que puede ser lo suficientemente malo para algunas aplicaciones como para evitarlo todo lo posible. (Algunas grandes aplicaciones comerciales han codificado la lgica de claves forneas en el nivel de aplicacin por esta razn.) MySQL proporciona a diseadores de bases de datos la posibilidad de elegir qu paradigma elegir. Si no necesita claves forneas y quiere evitar la sobrecarga asociada con la integridad referencial, puede usar otro tipo de tabla como MyISAM. (Por ejemplo, el motor MyISAM ofrece muy buen rendimiento para aplicaciones que slo realizan operaciones INSERT y SELECT, ya que las inserciones de pueden utilizar de forma concurrente con consultas. Consulte Seccin 7.3.2, Cuestiones relacionadas con el bloqueo (locking) de tablas.) Si elige no utilizar integridad referencial, tenga en cuenta las siguientes consideraciones: Sin un chequeo por parte del servidor de integridad referencial, la aplicacin debe realizar este trabajo. Por ejemplo, debe tener cuidado de insertar registros en tablas en el orden apropiado, y evitar crear registros con hijos hurfanos. Tambin debe ser capaz de recuperarse de errores que ocurran durante inserciones mltiples. Si ON DELETE es la nica integridad referencial que necesita la aplicacin, desde la versin 4.0 de MySQL Server puede usar comandos DELETE para borrar registros de distintas tablas con un nico comando. Consulte Seccin 13.2.1, Sintaxis de DELETE. Una forma de suplir la falta de ON DELETE es aadir el comando DELETE apropiado a su aplicacin cuando borre registros de una tabla que no tenga clave fornea. En la prctica, esto es tan rpido como usar una clave fornea, y ms portable. Tenga en cuenta que el uso de claves forneas puede provocar algunos problemas: El soporte de claves forneas arregla muchas cuestiones relacionadas con la integridad, pero todava es necesario disear las claves cuidadosamente para evitar reglas circulares o combinaciones incorrectas de borrados en cascada. Es posible crear una topologa de relaciones que haga difcil restaurar tablas individuales de una copia de seguridad. (MySQL alivia esta dificultad permitiendo desactivar claves forneas temporalmente al recargar una tabla que dependa de otras. Consulte Seccin 15.6.4, Restricciones (constraints) FOREIGN KEY. Desde MySQL 4.1.1, mysqldump genera ficheros que utilizan esta caractersticas automticamente al recargarse.) Tenga en cuenta que las claves forneas en SQL se usan para chequear y forzar integridad referencial, no para unir tablas. Si quiere obtener resultados de mltiples tablas a partir de un comando SELECT, debe usar un join entre ellas:
SELECT * FROM t1, t2 WHERE t1.id = t2.id;
Consulte Seccin 13.2.7.1, Sintaxis de JOIN. Consulte Seccin 3.6.6, Usar claves forneas (foreign keys). La sintaxis de FOREIGN KEY sin ON DELETE ... se usa a menudo por aplicaciones ODBC para producir clusulas WHERE automticamente.
1.7.5.6. Vistas
Vistas (incluyendo vistas actualizables) se implementan en la versin 5.0 de MySQL Server. Las vistas estn disponibles en las versiones binarias a partir de la 5.0.1. Consulte Captulo 21, Vistas (Views). Las vistas son tiles para permitir acceder a los usuarios a un conjunto de relaciones (tablas) como si fueran una sola, y limitar su acceso a las mismas. Tambin se pueden usar las vistas para restringir
28
el acceso a registros (un subconjunto de una tabla particular). Para control de acceso a columnas, puede usar el sofisticado sistema de privilegios de MySQL Server. Consulte Seccin 5.6, El sistema de privilegios de acceso de MySQL. Al disear la implementacin de las vistas, nuestro ambicioso objetivo, dentro de los lmites de SQL, ha sido la plena compatibilidad con la regla 6 de Codd para sistemas relacionales de bases de datos: "Todas las vistas que son actualizables en teora, deben serlo en la prctica".
Piense acerca de lo que ocurre si el valor de payment es un valor negativo como -1:
UPDATE account SET credit=credit--1
credit--1 es una expresin legal en SQL, pero si -- se interpreta como parte de un comentario, una parte de la expresin se descarta. El resultado es un comando que tiene un significado completamente distinto al deseado:
UPDATE account SET credit=credit
Este comando no produce ningn cambio en absoluto! Lo cual ilustra que permitir comentaros que empiecen con '--' puede tener serias consecuencias. Usando la implementacin de este mtodo de comentarios en MySQL Server desde 3.23.3, credit--1 es seguro. Otra medida de seguridad es que el cliente de lneas de comando mysql elimina todas las lneas que empiecen con '--'. La siguiente informacin slo es relevante si utiliza versiones anteriores a la 3.23.3: Si tiene un programa SQL en un fichero de texto que contenga comentarios del estilo '--', debera utilizar la utilidad replace para convertir los comentarios antiguos en caracteres '#' de la siguiente forma:
shell> replace " --" " #" < text-file-with-funny-comments.sql \ | mysql db_name
Tambin puede editar el fichero "a mano" para cambiar los comentarios '--' a '#':
shell> replace " --" " #" -- text-file-with-funny-comments.sql
MySQL le permite trabajar con tablas transaccionales, que permiten hacer un rollback, y con tablas no transaccionales que no lo permiten. Es por ello que las restricciones son algo distintas en MySQL respecto a otras bases de datos. Debemos tratar el caso en el que se insertan o actualizan muchos registros en una tabla no transaccional en la que los cambios no pueden deshacerse cuando ocurre un error. La filosofa bsica es que MySQL Server trata de producir un error para cualquier cosa que detecte mientras parsea un comando que va a ejecutarse, y trata de recuperarse de cualquier error que ocurra mientras se ejecuta el comando. Lo hacemos en la mayora de casos, pero todava no en todos. Las opciones en MySQL cuando ocurre un error son parar el comando en medio de la ejecucin o recuperarse lo mejor posible del problema y continuar. Por defecto, el servidor utiliza esta ltima opcin. Esto significa, por ejemplo, que el servidor puede cambiar algunos valores ilegales por el valor legal ms prximo. A partir de la versin 5.0.2 de MySQL, hay disponibles varios modos SQL para proporcionar un mayor control sobre cmo aceptar valores incorrectos y si continuar ejecutando el comando o abortarlo cuando ocurre el error. Usando estas opciones, puede configurar MySQL Server para actuar en un modo ms tradicional como otros servidores de bases de datos que rechazan datos incorrectos. Los modos SQL pueden cambiarse en tiempo de ejecucin, lo que permite a los clientes individuales seleccionar el comportamiento ms apropiado para sus requerimientos. Consulte Seccin 5.3.2, El modo SQL del servidor. La siguiente seccin describe qu ocurre para diferentes tipos de restricciones.
30
Para cadenas de caracteres, MySQL almacena una cadena vaca o tanto de la cadena de carcteras como quepa en la columna. Si trata de almacenar una cadena de caracteres que no empiece con un nmero en una columna numrica, MySQL Server almacena 0. MySQL le permite almacenar ciertos valores incorrectos en columnas DATE y DATETIME (tales como '2000-02-31' o '2000-02-00'). La idea es que no es el trabajo del servidor SQL validar fechas. Si MySQL puede almacenar una fecha y recuperarla fielmente, se almacena tal y como se da. Si la fecha es totalmente incorrecta (ms all de la capacidad del servidor para almacenarla), se almacena en su lugar el valor especial '0000-00-00'. Si intenta almacenar NULL en una columna que no admita valores NULL ocurre un error para los comandos INSERT de un solo registro. Para comandos INSERT de varios registros o para comandos INSERT INTO... SELECT , MySQL Server almacena el valor implcito para el tipo de datos de la columna. En general, es 0 para tipos numricos, cadena vaca ("") para tipos de cadenas de caracteres, y el valor "cero" para tipos de fecha y tiempo. Los valores implcitos por defecto se discuten en Seccin 13.1.5, Sintaxis de CREATE TABLE. Si un comando INSERT no especifica un valor para una columna, MySQL inserta su valor por defecto si la columna especifica un valor mediante la clusula DEFAULT. Si la definicin no tiene tal clusula DEFAULT clause, MySQL inserta el valor por defecto implcito para el tipo de datos de la columna. La razn para las reglas anteriores es que no podemos validar esas condiciones hasta que los comandos han empezado a ejecutarse. No podemos deshacer si encontramos un problema tras actualizar algunos registros, ya que el motor de almacenamiento puede no soportar rollback. La opcin de terminar el comando no es siempre positiva; en este caso, la actualizacin quedara "a medias", lo que posiblemente es la peor opcin. En este caso, lo mejor es hacerlo "lo mejor posible" y continuar como si nada hubiera ocurrido. A partir de MySQL 5.0.2, puede seleccionar un tratamiento de validacin de datos de entrada ms estricto usando los modos SQL STRICT_TRANS_TABLES o STRICT_ALL_TABLES. Consulte Seccin 5.3.2, El modo SQL del servidor. STRICT_TRANS_TABLES funciona as: Para motores de almacenamiento transaccionales, valores incorrectos en cualquier parte del comando provocan que se aborte el comando y se deshaga el mismo. Para motores no transaccionales, el comando aborta si ocurre un error en el primer registro a insertar o actualizar. (En este caso, el comando dejar la tabla intacta, igual que en una tabla transaccional.) Los errores en registros despus del primero no abortan el comando. En lugar de ello, los valores incorrectos se ajustan y se generan advertencias en lugar de errores. En otras palabras, con STRICT_TRANS_TABLES, un valor incorrecto provoca que MySQL deshaga todas las actualizaciones hechas hasta el momento, si es posible. Para chequeo estricto, active STRICT_ALL_TABLES. Es equivalente a STRICT_TRANS_TABLES excepto que en motores de almacenamiento no transaccionales, los errores abortan el comando incluso cuando hay datos incorrectos a partir del primer registro. Esto significa que si ocurre un error a medias de una insercin o actualizacin de varios registros en una tabla no transaccional, se produce una actualizacin parcial. Los primeros registros se insertan o actualizan, pero aqullos a partir del punto en que ocurre el error no. Para evitar esto en tablas no transaccionales, use inserciones de un solo registro o use STRICT_TRANS_TABLES para obtener advertencias en lugar de errores. Para evitar problemas, no utilice MySQL para validar contenido de columnas. Es preferible (y a menudo ms rpido) dejar que la aplicacin se asegure de pasar slo valores legales a la base de datos. Con cualquiera de las opciones de modo estricto, puede hacer que se traten los errores como advertencias usando INSERT IGNORE o UPDATE IGNORE en lugar de INSERT o UPDATE sin IGNORE.
31
32
33
2.12.6. Notas sobre OS/2 .................................................................................................. 2.13. Notas sobre la instalacin de Perl ..................................................................................... 2.13.1. Instalacin de Perl en Unix .................................................................................... 2.13.2. Instalar ActiveState Perl en Windows ...................................................................... 2.13.3. Problemas en la utilizacin de la interfaz Perl DBI/DBD ............................................ En este captulo se describe cmo obtener e instalar MySQL:
1. Debe determinarse si la plataforma donde se desea hacer la instalacin est soportada. Ntese que no todos los sistemas soportados son igualmente adecuados para ejecutar MySQL. En algunas plataformas el funcionamiento ser mucho ms robusto y eficiente que en otras. Consulte Seccin 2.1.1, Sistemas operativos que MySQL soporta para ms detalles. 2. Debe elegirse la distribucin que se instalar. Hay varias versiones de MySQL disponibles, y la mayora lo estn en varios formatos de distribucin. Se puede elegir entre distribuciones prearmadas que contienen programas binarios (precompilados) o bien cdigo fuente. En caso de duda, debe elegirse una distribucin binaria. Tambin se provee acceso pblico al cdigo fuente para quienes deseen ver los desarrollos ms recientes y colaborar en el testeo de cdigo nuevo. Para establecer qu versin y tipo de distribucin debera usarse, consulte Seccin 2.1.2, Escoger la distribucin MySQL a instalar. 3. Descargar la distribucin que se desea instalar. Para ver una lista de sitios desde los cuales se puede obtener MySQL, consltese Seccin 2.1.3, Cmo obtener MySQL. Se puede verificar la integridad de la distribucin como se describe en Seccin 2.1.4, Comprobar la integridad de paquetes con sumas de verificacin MD5 o GnuPG. 4. Instalar la distribucin. Para instalar MySQL desde una dsitribucin binaria, empleense las instrucciones en Seccin 2.2, Instalacin MySQL estndar con una distribucin binaria. Para instalar MySQL a partir de una distribucin de cdigo fuente o desde el directorio de desarrollo actual, utilcense las instrucciones en Seccin 2.8, Instalacin de MySQL usando una distribucin de cdigo fuente. Nota: Si se planea actualizar una versin existente de MySQL a una versin ms nueva en lugar de instalarlo por primera vez, consltese Seccin 2.10, Aumentar la versin de MySQL para obtener informacin acerca de procedimientos de actualizacin y de cuestiones que se deberan de considerar antes de actualizar. Si se encontrasen problemas durante la instalacin, consltese Seccin 2.12, Notas especficas sobre sistemas operativos para obtener informacin sobre la resolucin de problemas en plataformas especficas. 5. Realizar cualquier ajuste que sea necesario con posterioridad a la instalacin. Luego de instalar MySQL, lase Seccin 2.9, Puesta en marcha y comprobacin despus de la instalacin. Esta seccin contiene informacin importante acerca de cmo asegurarse de que el servidor de MySQL est funcionando adecuadamente. Tambin describe cmo hacer seguras las cuentas de usuario iniciales de MySQL, que no poseen contraseas hasta que se les hayan asignado. Esta seccin es de aplicacin si MySQL se ha instalado utilizando tanto una distribucin binaria como una de cdigo fuente. 6. Si se desea ejecutar los scripts para medir el rendimiento de MySQL, debe estar disponible el soporte de Perl para MySQL. Consltese Seccin 2.13, Notas sobre la instalacin de Perl.
34
Esta seccin contiene la informacin necesaria para llevar adelante estos pasos. Una vez ejecutados, se puede seguir las instrucciones de secciones posteriores del captulo, para instalar la distribucin elegida.
35
SCO Openserver 6.0.x. Consulte Seccin 2.12.5.10, Notas sobre SCO OpenServer 6.0.x. SGI Irix 6.x con subprocesos nativos. Consulte Seccin 2.12.5.7, Notas sobre SGI Irix. Solaris 2.5 y posteriores con subprocesos nativos en SPARC y x86. Consulte Seccin 2.12.3, Notas sobre Solaris. SunOS 4.x con el paquete MIT-pthreads package. Consulte Seccin 2.12.3, Notas sobre Solaris. Tru64 Unix. Consulte Seccin 2.12.5.5, Notas Alpha-DEC-UNIX (Tru64). Windows 9x, Me, NT, 2000, XP, y 2003. Consulte Seccin 2.3, Instalar MySQL en Windows. No todas las plataformas son igualmente aptas para ejecutar MySQL. Los siguientes factores determinan si una plataforma est ms o menos bien preparada para un servidor MySQL con alto volumen de carga y para misiones crtica: Estabilidad general de la biblioteca de subprocesos. Una plataforma puede tener una excelente reputacin en otras situaciones, pero MySQL es estable como lo sea la biblioteca de subprocesos que utiliza la plataforma, aun cuando cualquier otro aspecto sea perfecto. La capacidad del ncleo o kernel del sistema operativo y de la biblioteca de subprocesos para aprovechar sistemas de multiprocesamiento simtrico (SMP). En otras palabras, cuando un proceso crea un subproceso, ste debera poderse ejecutar en una CPU diferente a la del proceso original. La capacidad del ncleo o kernel del sistema operativo y de la biblioteca de subprocesos para ejecutar varios subprocesos que bloquean y liberan mutexes frecuentemente en una pequea regin crtica sin excesivos cambios de contexto. Si la implementacin de pthread_mutex_lock() es muy proclive a consumir tiempo de CPU, esto afectar en gran manera a MySQL. Si no se previene este problema, aadir ms CPUs har todava ms lento a MySQL. El rendimiento y la estabilidad general del sistema de ficheros. Si se emplean grandes tablas, la capacidad del sistema de ficheros para gestionar eficientemente archivos de gran tamao. El nivel de experiencia que los desarrolladores de MySQL AB posean sobre una determinada plataforma. Si la conocen bien, habilitan optimizaciones especficas y soluciones en tiempo de compilacin. Adems pueden proporcionar consejos sobre cmo configurar el sistema en forma ptima para MySQL. El volumen de pruebas realizadas por MySQL AB sobre configuraciones similares. La cantidad de usuarios que han ejecutado MySQL con xito en la misma plataforma y en configuraciones similares. Si este nmero es alto, las probabilidades de encontrar sorpresas especficas de la plataforma son mucho menores. En base a estos criterios, las mejores plataformas para ejecutar MySQL en este momento son x86 con SuSE Linux (kernel versin 2.4 o 2.6), y ReiserFS (o cualquier distribucin de Linux similar) y SPARC con Solaris (2.7-9). FreeBSD aparece en tercer lugar, pero es de esperar que se integre al lote principal cuando se mejore la biblioteca de subprocesos. Tambin las otras plataformas donde MySQL se compila y ejecuta en la actualidad podrian ser incluidas en la categoria principal, pero no con el mismo nivel de estabilidad y rendimiento. Esto requiere un esfuerzo por parte de los desarrolladores de MySQL en cooperacin con los desarrolladores de los sistemas operativos y de bibliotecas de componentes de las que depende MySQL. Si Usted est interesado en mejorar alguno de estos componentes, est en posicin de influir en su desarrollo, y necesita informacin ms detallada acerca de lo que MySQL requiere para funcionar mejor, enve un mensaje de correo electrnico a la lista de correo internals de MySQL. Consulte Seccin 1.6.1.1, Las listas de correo de MySQL. El propsito de la anterior comparacin no es afirmar que un sistema es, en trminos generales, mejor o peor que otro. Se trata solamente de la eleccin de un sistema operativo con el objetivo de ejecutar MySQL. Por lo tanto, el resultado de la comparacin podra ser diferente si se consideraran otros
36
factores. En algunos casos, la razn de que un sistema operativo sea mejor que otros podra residir simplemente en que los desarrolladores de MySQL han podido dedicar ms esfuerzos a la prueba y optimizacin sobre una plataforma en particular. Lo aqu manifestado son las observaciones de estos desarrolladores a fin de ayudar al usuario a decidir la plataforma sobre la que ejecutar MySQL.
37
El esquema de denominaciones de MySQL emplea para las entregas nombres consistentes en tres nmeros y un sufijo; por ejemplo, mysql-5.0.9-beta. Los nmeros dentro del nombre de la entrega se interpretan como sigue: El primer nmero (5) es la versin principal y describe el formato de fichero. Todas las entregas de la versin 5 comparten el mismo formato para sus ficheros. El segundo nmero (0) es el nivel de entrega. En conjunto, la versin principal y el nivel de entrega constituyen el nmero de la serie. El tercer nmero (9) es el nmero de versin dentro de la serie. Se incrementa para cada nueva entrega. Usualmente es deseable poseer la ltima versin dentro de la serie que se est usando. Para los cambios menores, el que se incrementa es el ltimo nmero en la denominacin de la versin. Cuando se adicionan caractersticas de importancia o aparecen incompatibilidades menores con versiones precedentes, se incrementa el segundo nmero. Cuando cambia el formato de los ficheros, se incrementa el primer nmero. Las denominaciones de las entregas tambin incluyen un sufijo para indicar el grado de estabilidad. Una entrega progresa a travs de un conjunto de sufijos a medida que mejora su estabilidad. Los posibles sufijos son: alpha indica que la entrega contiene caractersticas nuevas que no han sido plenamente probadas. Asimismo, en la seccin "Novedades" deberan estar documentados los errores conocidos, aunque usualmente no los hay. Consulte Apndice C, Historial de cambios de MySQL. Por lo general, en cada entrega alpha se implementan nuevos comandos y extensiones, y es la etapa donde puede producirse la mayor cantidad de cambios en el cdigo. Sin embargo, debido a las pruebas realizadas, no deberan existir errores conocidos. beta significa que la entrega est destinada a poseer sus caractersticas completas y que se prob todo el cdigo nuevo. No se agregan caractersticas de importancia, y no deberan existir errores crticos. Una versin cambia de alpha a beta cuando no se han descubierto errores fatales durante al menos un mes, y no hay planes de agregar caractersticas que pudieran comprometer la fiabilidad del cdigo existente. Todas las APIs, las estructuras visibles externamente y las columnas para comandos SQL no se modificarn en las futuras entregas, sean beta, candidatas, o de produccin. rc es una entrega candidata; o sea, una beta que ha estado funcionando un intervalo de tiempo y parece hacerlo bien. Solamente podran ser necesarias correcciones menores. (Una entrega candidata es formalmente conocida como una entrega gamma.) Si no hay un sufijo, significa que la versin se ha estado utilizando por un tiempo en diferentes sitios sin que se informaran errores crticos reproducibles, ms all de los especficos de una plataforma. Esto es lo que se llama una entrega de produccin (estable) o General Availability (GA). MySQL utiliza un esquema de denominaciones ligeramente diferente a muchos otros productos. En general, se considera segura para usar una versin que ha durado un par de semanas sin ser reemplazada por una nueva dentro de la misma serie de entregas. La totalidad de las entregas de MySQL se someten a pruebas de fiabilidad y rendimiento (estndares dentro de MySQL) para cerciorarse de que son relativamente seguras de utilizar. Puesto que las pruebas estndar son ampliadas cada vez para que incluyan todos los errores anteriormente descubiertos, el conjunto de pruebas se mejora continuamente. Cada entrega se prueba al menos con: Un conjunto interno de pruebas El directorio mysql-test contiene un amplio conjunto de casos de prueba. En MySQL, prcticamente cada versin binaria del servidor pasa por estas pruebas. Consulte Seccin 27.1.2, El paquete de pruebas MySQL Test para ms informacin sobre este conjunto de pruebas.
38
El conjunto de pruebas de rendimiento de MySQL Este conjunto ejecuta una serie de consultas comunes. Es tambin una manera de verificar que las ltimas optimizaciones realizadas hacen efectivamente ms rpido el cdigo. Consulte Seccin 7.1.4, El paquete de pruebas de rendimiento (benchmarks) de MySQL. La prueba crash-me Esta prueba intenta determinar las caractersticas soportadas por la base de datos y cules son sus capacidades y limitaciones. Consulte Seccin 7.1.4, El paquete de pruebas de rendimiento (benchmarks) de MySQL. Otra prueba consiste en utilizar la versin ms reciente del servidor en el entorno de produccin de MySQL, en al menos un ordenador. Se dispone de ms de 100GB de datos para este fin.
39
conjuntos de caracteres. Si se deseara un servidor MySQL ms liviano, se lo puede recompilar con soporte solamente para el conjunto de caracteres que se necesita. Cuando se posee un compilador especial (como pgcc) o se desea utilizar opciones de compilacin optimizadas para un determinado procesador. Las distribuciones binarias se compilan con opciones que deberan funcionar en diversos procesadores de la misma familia. Cuando se desea emplear la ltima versin de cdigo fuente desde un repositorio BitKeeper, para acceder a modificaciones recientes. Por ejemplo, si se detecta un error y se comunica al equipo de desarrollo de MySQL, la correccin se realiza sobre el cdigo fuente, que queda almacenado en el repositorio. La primera entrega con esta correccin ser la siguiente. Cuando se desea leer (o modificar) el cdigo en C y C++ que conforma MySQL. Para este fin, se debera poseer una distribucin de cdigo fuente, ya que es la documentacin ms actualizada. Las distribuciones de cdigo fuente contienen ms pruebas y ejemplos que las distribuciones binarias.
40
Se han documentado todos los problemas, errores y cuestiones que dependen de decisiones de diseo. Consulte Seccin A.8, Problemas conocidos en MySQL. La intencin de los desarrolladores es corregir todo lo que tenga solucin sin afectar a la estabilidad de una versin estable de MySQL. En ciertos casos, esto significa que se puede corregir un error en las versiones en desarrollo, pero no en la versin estable (de produccin). De todos modos estos errores se documentan para que los usuarios estn al tanto de ellos. El proceso de desarrollo comprende las siguientes etapas: Se recolectan informes de errores desde la lista de soporte tcnico, desde la base de datos de errores en http://bugs.mysql.com/, y desde las listas de correo externas. Todos los errores hallados en versiones con soporte, se introducen en la base de datos de errores. Cuando se corrige un error, se intenta crear un caso de prueba e incluirlo en el sistema de pruebas, para tener seguridad de que el error no vuelva a ocurrir sin ser detectado. (Cerca del 90% de los errores corregidos tienen un caso de prueba). Se crean casos de prueba para cada nueva caracterstica que se agrega a MySQL. Antes de crear una entrega, se verifica que todos los errores reproducibles informados para esa versin de MySQL (3.23.x, 4.0.x, 4.1.x, 5.0.x, etc.) estn solucionados. Si alguno no pudiera corregirse (debido a una decisin de diseo) esto se documenta en el manual. Consulte Seccin A.8, Problemas conocidos en MySQL. Se hace una compilacin para cada plataforma para la que se brinda una distribucin binaria (ms de 15) y se ejecutan pruebas de fiabilidad y rendimiento en todas ellas. No se publica una distribucin binaria para una plataforma en la que fallaron las pruebas de fiabilidad o rendimiento. Si el problema se debe a un error en el cdigo fuente, se resuelve, y para todas las plataformas se vuelve a compilar y probar. El proceso de compilacin y prueba dura entre 2 y 3 das. Si durante el proceso se descubre un error fatal (por ejemplo, uno que genere un fichero de volcado del ncleo), se corrige el error y el proceso recomienza. Despus de publicar la distribucin binaria en http://dev.mysql.com/, se enva un mensaje con la novedad a las listas de correo mysql y announce. Consulte Seccin 1.6.1.1, Las listas de correo de MySQL. El mensaje contiene una lista con todos los cambios y problemas conocidos que contiene la entrega. La seccin Known Problems (problemas conocidos) solo ha sido necesaria en una pequea cantidad de entregas. Para que los usuarios accedan rpidamente a las nuevas caractersticas de MySQL, se produce una entrega nuevo cada 4 a 8 semanas. El cdigo fuente se prepara diariamente y se pone a disposicin en http://downloads.mysql.com/snapshots.php. Si, a pesar de los esfuerzos realizados, se toma conocimiento de un error o problema crtico especficos de una plataforma despus de que una entrega haya sido liberada, se genera una nueva entrega 'a' con la correccin para la plataforma afectada. Gracias a la gran base de usuarios, cualquier problema se detecta y resuelve muy rpidamente. El trabajo del equipo de desarrollo en la generacin de entregas estables es bastante bueno. De las ltimas 150 entregas, se han debido rehacer menos de diez. En tres de estos casos, el error se debi a defectos en la biblioteca glibc en uno de los ordenadores de desarrollo, que llev tiempo descubrir.
41
A parte de las distribuciones binarias provistas en formatos especficos de algunas plataformas, se ofrecen distribuciones binarias para una serie de plataformas en forma de ficheros comprimidos tar (ficheros .tar.gz). Consulte Seccin 2.2, Instalacin MySQL estndar con una distribucin binaria. Para distribuciones Windows, consulte Seccin 2.3, Instalar MySQL en Windows. Estas distribuciones se generan empleando el script Build-tools/Do-compile, que compila el cdigo fuente y crea el fichero binario tar.gz empleando scripts/make_binary_distribution. Estos binarios estn configurados y compilados con los siguientes compiladores y opciones de compilacin. Esta informacin tambin puede obtenerse observando las variables COMP_ENV_INFO y CONFIGURE_LINE dentro del script bin/mysqlbug de cada fichero de distribucin binaria tar. Los siguientes binarios se compilan en los sistemas de desarrollo de MySQL AB: Linux 2.4.xx x86 con gcc 2.95.3: CFLAGS="-O2 -mcpu=pentiumpro" CXX=gcc CXXFLAGS="-O2 -mcpu=pentiumpro felide-constructors" ./configure --prefix=/usr/local/mysql --with-extracharsets=complex --enable-thread-safe-client --enable-local-infile -enable-assembler --disable-shared --with-client-ldflags=-all-static -with-mysqld-ldflags=-all-static Linux 2.4.x x86 con icc (compilador Intel C++ 8.1 o posterior): CC=icc CXX=icpc CFLAGS="-O3 -unroll2 -ip -mp -no-gcc -restrict" CXXFLAGS="-O3 -unroll2 -ip -mp -no-gcc -restrict" ./configure --prefix=/ usr/local/mysql --localstatedir=/usr/local/mysql/data --libexecdir=/usr/ local/mysql/bin --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --disable-shared --with-clientldflags=-all-static --with-mysqld-ldflags=-all-static --with-embeddedserver --with-innodb Obsrvese que las versiones 8.1 y posteriores del compilador Intel tienen drivers separados para C 'puro' (icc) y c++ (icpc); si se utiliza icc versin 8.0 o anterior para compilar MySQL, ser necesario establecer CXX=icc. Linux 2.4.xx Intel Itanium 2 con ecc (Compilador Intel C++ Itanium 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 con ecc (Compilador Intel C++ Itanium 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 con 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 con 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
42
--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 con 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) con 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 con 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 con 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 con gcc 3.2: 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 --with-named-z-libs=no --with-named-curses-libs=-lcurses --disable-shared Sun Solaris 9 SPARC con 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 con 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 con 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 --
43
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 con 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 con 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 --enable-threadsafe-client --enable-local-infile --with-named-z-libs=no --disable-shared IBM AIX 5.2.0 ppc con 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 con gcc 3.1: CFLAGS="-DHPUX -I/opt/dce/include -O3 -fPIC" CXX=gcc CXXFLAGS="-DHPUX I/opt/dce /include -felide-constructors -fno-exceptions -fno-rtti -O3 fPIC" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-pthread --withnamed-thread-libs=-ldce --with-lib-ccflags=-fPIC --disable-shared HP-UX 11.00 pa-risc con 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 con 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 con 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 con 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 --enable-
44
thread-safe-client --enable-local-infile --disable-shared --with-embeddedserver --with-innodb Apple Mac OS X 10.2 powerpc con 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 con 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 empleando LinuxThreads con 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 con 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" ./ configure --prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile --disable-shared Las siguientes distribuciones binarias estn compiladas sobre sistemas de terceros, facilitados por otros usuarios a MySQL AB. Se facilitan solamente por cortesa, ya que MySQL AB no tiene control total sobre estos sistemas, por lo que slo puede proporcionar un soporte limitado sobre las distribuciones compiladas en ellos. SCO Unix 3.2v5.0.7 i386 con 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 UnixWare 7.1.4 i386 con 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 -with-readline SCO OpenServer 6.0.0 i386 con 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 -with-readline Compaq Tru64 OSF/1 V5.1 732 alpha con cc/cxx (Compaq C V6.3-029i / DIGITAL C++ V6.1-027):
45
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-named-thread-libs="-lpthread -lmach -lexc -lc" --disable-shared --with-mysqld-ldflags=-all-static SGI Irix 6.5 IP32 con 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 con 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 Las siguientes opciones de compilacin han sido empleadas en distribuciones binarias en el pasado. Estas distribuciones ya no reciben actualizaciones, pero las opciones de compilacin se listan para referencia. Linux 2.2.xx SPARC con 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 con x686 con gcc 2.95.2: CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felideconstructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/ mysql --enable-assembler --with-mysqld-ldflags=-all-static --disableshared --with-extra-charsets=complex SunOS 4.1.4 2 sun4c con 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 (y posteriores) sun4u con egcs 1.0.3a o 2.90.27 o gcc 2.95.2 y posteriores: CC=gcc CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felideconstructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/ mysql --with-low-memory --with-extra-charsets=complex --enable-assembler SunOS 5.6 i86pc con 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 con gcc 2.7.2.1: CC=gcc CXX=gcc CXXFLAGS=-O ./configure --prefix=/usr/local/mysql --withextra-charsets=complex
46
BSDI BSD/OS 2.1 i386 con gcc 2.7.2: CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --withextra-charsets=complex AIX 4.2 con gcc 2.7.2.2: CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --withextra-charsets=complex Si alguien tiene opciones ms efectivas para cualquiera de las configuraciones listadas, puede enviarlas por correo electrnico a la lista de correo MySQL internals. Consulte Seccin 1.6.1.1, Las listas de correo de MySQL. Las distribuciones RPM para entregas de MySQL 5.0 disponibles en el sitio web de MySQL estn generadas por MySQL AB. Si desea compilar una versin de depuracin de MySQL, debera agregar --with-debug o --withdebug=full a los comandos configure anteriores, y quitar cualquier opcin -fomit-framepointer.
47
Ejemplo:
shell> md5sum mysql-standard-5.0.9-beta-linux-i686.tar.gz aaab65abbec64d5e907dcd41b8699945 mysql-standard-5.0.9-beta-linux-i686.tar.gz
Se debera verificar que la suma de verificacin resultante (la cadena de dgitos hexadecimales) concuerda con la que se muestra en la pgina de descargas inmediatamente debajo del paquete correspondiente. Nota: lo que se debe comprobar es la suma de verificacin del fichero comprimido (por ejemplo, el fichero .zip o .tar.gz) y no de los ficheros contenidos dentro del comprimido. Hay que notar que no todos los sistemas operativos soportan el comando md5sum. En algunos, se llama simplemente md5 y otros, directamente no lo poseen. En Linux forma parte del paquete GNU Text Utilities, que est disponible para una gran variedad de plataformas. El cdigo fuente puede bajarse desde http://www.gnu.org/software/textutils/. Si OpenSSL est instalado, tambin puede emplearse el comando openssl md5 package_name. Una versin para DOS/Windows del comando md5 se halla disponible en http://www.fourmilab.ch/md5/.
48
a8CGrRfsOAJxim63CHfty5mUc5rUSnTslGYEIOCR1BeQauyPZbPDsDD9MZ1ZaSaf anFvwFG6Llx9xkU7tzq+vKLoWkm4u5xf3vn55VjnSd1aQ9eQnUcXiL4cnBGoTbOW I39EcyzgslzBdC++MPjcQTcA7p6JUVsP6oAB3FQWg54tuUo0Ec8bsM8b3Ev42Lmu QT5NdKHGwHsXTPtl0klk4bQk4OajHsiy1BMahpT27jWjJlMiJc+IWJ0mghkKHt92 6s/ymfdf5HkdQ1cyvsz5tryVI3Fx78XeSYfQvuuwqp2H139pXGEkg0n6KdUOetdZ Whe70YGNPw1yjWJT1IhMBBgRAgAMBQI+PqMdBQkJZgGAAAoJEIxxjTtQcuH17p4A n3r1QpVC9yhnW2cSAjq+kr72GX0eAJ4295kl6NxYEuFApmr1+0uUq/SlsQ== =YJkx -----END PGP PUBLIC KEY BLOCK-----
Para incorporar esta clave dentro del GPG en uso, se emplea el comando gpg --import. Por ejemplo, si la clave estuviese guardada en un fichero llamado mysql_pubkey.asc, el comando de importacin tomara esta forma:
shell> gpg --import mysql_pubkey.asc
Debe consultarse la documentacin de GPG para obtener ms informacin sobre el manejo de claves pblicas. Despus de haber descargado e importado la clave pblica, debe descargarse el paquete MySQL deseado y la correspondiente firma, que tambin se encuentra en la pgina de descargas. El fichero de firma tiene el mismo nombre que el fichero de distribucin, con una extensin .asc. Por ejemplo: Fichero de distribucin Fichero de firma mysql-standard-5.0.9-beta-linux-i686.tar.gz mysql-standard-5.0.9-beta-linux-i686.tar.gz.asc
Se debe verificar que ambos ficheros se encuentran en el mismo directorio y entonces ejecutar el siguiente comando para verificar la firma del fichero de distribucin:
shell> gpg --verify package_name.asc
Ejemplo:
shell> gpg --verify mysql-standard-5.0.9-beta-linux-i686.tar.gz.asc gpg: Signature made Tue 12 Jul 2005 23:35:41 EST using DSA key ID 5072E1F5 gpg: Good signature from "MySQL Package signing key (www.mysql.com) <build@mysql.com>"
El mensaje Good signature indica que todo result correctamente. Puede ignorarse cualquier mensaje del tipo insecure memory que se obtenga.
Ejemplo:
shell> rpm --checksig MySQL-server-5.0.9-0.i386.rpm MySQL-server-5.0.9-0.i386.rpm: md5 gpg OK
Nota: si est utilizando RPM 4.1 y emite mensajes de error del tipo (GPG) NOT OK (MISSING KEYS: GPG#5072e1f5), aun cuando se haya incorporado la clave pblica dentro de las claves reconocidas por el GPG (keyring), se necesitar importar primero la clave pblica dentro de las claves reconocidas (keyring) del RPM. RPM 4.1 ya no utiliza las claves reconocidas (keyring) personales (o GPG en s mismo). En lugar de ello, mantiene su propio repositorio de claves (keyring) ya que constituye una aplicacin a nivel de sistema, en tanto que el repositorio pblico de claves (keyring) de GPG es un fichero especfico del usuario. Para importar la clave pblica de MySQL dentro del repositorio de claves (keyring) del RPM, primero debe obtenerse la clave tal como se describe en la seccin anterior. A continuacin debe utilizarse rpm --import para importar la clave. Por ejemplo, si la clave pblica se encuentra en un fichero llamado mysql_pubkey.asc, se importa utilizando el siguiente comando:
shell> rpm --import mysql_pubkey.asc
49
Conformacin de la instalacin
Para obtener la clave pblica de MySQL, consulte: Seccin 2.1.4.2, Verificacin de firmas utilizando GnuPG.
Las instalaciones que se crean a partir de distribuciones RPM para Linux generadas por MySQL AB generan archivos bajo los siguientes directorios deL sistema: Directorio /usr/bin /usr/sbin /var/lib/mysql /usr/share/doc/packages /usr/include/mysql /usr/lib/mysql /usr/share/mysql /usr/share/sql-bench Contenido Programas cliente y scripts El servidor mysqld Ficheros de registro (logs), bases de datos Documentacin Ficheros de inclusin Bibliotecas Ficheros con mensajes de error y conjuntos de caracteres Pruebas de rendimiento
En Unix, un fichero binario de distribucin tar se instala descomprimindolo en la ubicacin que se escoja para la instalacin (generalmente /usr/local/mysql) y crea los siguientes directorios en dicha ubicacin: Directorio bin data docs include lib scripts share/mysql Contenido Programas cliente y el servidor mysqld Ficheros de registro (logs), bases de datos. Documentacin, registro de modificaciones. Ficheros de inclusin Bibliotecas mysql_install_db Ficheros con mensajes de error
50
sql-bench
Pruebas de rendimiento
Una distribucin de cdigo fuente se instala despus de haberla configurado y compilado. Por defecto, la etapa de instalacin crea ficheros bajo /usr/local, en los siguientes subdirectorios: Directorio bin include/mysql info lib/mysql libexec share/mysql sql-bench var Contenido Programas cliente y scripts Ficheros de inclusin Documentacin en formato "Info" Bibliotecas El servidor mysqld Ficheros con mensajes de error Pruebas de rendimiento y crash-me Bases de datos y ficheros de registro (logs)
Dentro de su directorio de instalacin, la conformacin de una instalacin de cdigo fuente difiere de una binaria en los siguientes aspectos: El servidor mysqld se instala en el directorio libexec en lugar de en el directorio bin. El directorio para los datos es var en lugar de data. mysql_install_db se instala en el directorio bin en lugar de scripts. Los directorios de ficheros de inclusin y bibliotecas son include/mysql y lib/mysql en lugar de include y lib. Se puede crear una instalacin binaria propia a partir de una distribucin de cdigo fuente compilada si se ejecuta el script scripts/make_binary_distribution desde el directorio principal de la distribucin de cdigo fuente.
51
Requisitos de Windows
2. Establecer un fichero de opciones, de ser necesario. 3. Seleccionar el servidor que se desea emplear. 4. Iniciar el servidor. 5. Colocar contraseas a las cuentas MySQL creadas inicialmente. Este proceso tambin debe realizarse con instalaciones nuevas de MySQL, cuando el paquete de instalacin no incluya un instalador. MySQL 5.0 para Windows est disponible en tres formatos de distribucin: La distribucin binaria contiene un programa de instalacin que instala cada elemento necesario para iniciar el servidor inmediatamente. La distribucin de cdigo fuente contiene todo el cdigo y ficheros de soporte para generar ejecutables utilizando el compilador de VC++ 6.0 Siempre que sea posible debera emplearse la distribucin binaria. Es ms simple que las otras y no se necesita ninguna herramienta adicional para poner en funcionamiento el servidor MySQL. Esta seccin explica cmo instalar MySQL para Windows utilizando una distribucin binaria. Para realizar la instalacin a partir de una distribucin de cdigo fuente, consulte Seccin 2.8.6, Instalar MySQL desde el cdigo fuente en Windows.
52
El paquete Essentials: Tiene un nombre de fichero similar a mysql-essential-5.0.9-betawin32.msi y contiene los ficheros mnimamente necesarios para instalar MySQL en Windows, incluyendo el asistente de configuracin. Este paquete no incluye componentes opcionales como el servidor incrustado (embedded) y el conjunto de pruebas de rendimiento (benchmarks). El paquete Complete (Completo): Tiene un nombre de fichero similar a mysql-5.0.9-betawin32.zip y contiene todos los archivos necesarios para una instalacin completa bajo Windows, incluyendo el asistente de configuracin. Este paquete incluye componentes opcionales como el servidor incrustado (embedded) y el conjunto de pruebas de rendimiento (benchmarks). El Paquete Noinstall (Noinstall Archive): Tiene un nombre de fichero similar a mysqlnoinstall-5.0.9-beta-win32.zip y contiene todos los ficheros contenidos en el paquete Complete, a excepcin del asistente de configuracin. Este paquete no incluye un instalador automatizado, y debe ser instalado y configurado manualmente. El paquete Essentials es el recomendado para la mayora de los usuarios. El proceso de instalacin que se siga depende del paquete de instalacin escogido. Si se opta por instalar ya sea el paquete Complete o Essentials, consltese Seccin 2.3.3, Instalacin de MySQL con un instalador automtico. Si se opta por instalar MySQL a partir del paquete Noinstall, consltese Seccin 2.3.6, Instalar MySQL partiendo de un archivo Zip Noinstall.
53
de MySQL han optado por WiX porque es un proyecto Open Source y les permite manejar el proceso completo de instalacin en Windows de una manera flexible, utilizando scripts. Las mejoras al asistente de instalacin MySQL dependen del soporte y comentarios recibidos de los usuarios. Si Usted descubre que el asistente de instalacin est dejando de lado alguna caracterstica que le resulte importante, o si halla un error, por favor emplee nuestro sistema de errores MySQL para solicitar caractersticas o informar sobre problemas.
54
Para instalar MySQL una vez que se est conforme con la configuracin, debe hacerse click en el botn Instalar. Para cambiar la configuracin, debe hacerse click en el botn Retroceder. Para abandonar el asistente de instalacin sin terminar la instalacin de MySQL, debe hacerse click en el botn Cancel. Una vez que la instalacin est completa, se porporciona la opcin de registrarse en el sitio web de MySQL. El registro otorga acceso para publicar mensajes en los foros de Mysql, en forums.mysql.com, junto con la posibilidad de informar errores en bugs.mysql.com y suscribirse al boletn electrnico. La pantalla final del instalador brinda un resumen de la instalacin y la opcin de ejecutar el asistente de configuracin MySQL, que se utiliza para crear un fichero de configuracin, instalar el servicio MySQL, y establecer la seguridad.
55
Por defecto, todas las aplicaciones MySQL se almacenan en un directorio comn localizado en C: \Program Files\MySQL, donde Program Files es el directorio de aplicaciones por defecto del sistema. Una instalacin tpica de MySQL en el ordenador de un desarrollador podra verse as:
C:\Program Files\MySQL\MySQL Server 5.0 C:\Program Files\MySQL\MySQL Administrator 1.0 C:\Program Files\MySQL\MySQL Query Browser 1.0
Esta proximidad entre los distintos directorios facilita la administracin y el mantenimiento de todas las aplicaciones MySQL instaladas en un sistema en particular.
56
timestamp es la fecha y hora en que el fichero my.ini existente se cre. Para quitar la instancia del servidor actual, debe seleccionarse la opcin Remove Instance y hacer click en el botn Next. Si se selecciona la opcin Remove Instance , se contina con una ventana de confirmacin. Al hacer click en el botn Execute, el asistente de configuracin MySQL detendr y quitar el servico MySQL, tras lo cual borrar el fichero my.ini. Los ficheros del servidor, incluyendo el directorio data, no se eliminarn. Si se opta por Re-configure Instance , se contina hacia el cuadro de dilogo Configuration Type donde puede elegirse el tipo de instalacin a configurar.
57
de almacenamiento InnoDB estar disponible y qu porcentaje de los recursos de servidor estarn disponibles para InnoDB Base de datos polifuncional (Multifunctional database) : Esta opcin habilita tanto el motor de almacenamiento InnoDB como MyISAM y reparte los recursos uniformemente entre ambos. Se recomienda para usuarios que emplearn los dos motores de almacenamiento en forma habitual. Base de datos transaccional exclusiva (Transactional database only) : Esta opcin habilita tanto el motor de almacenamiento InnoDB como MyISAM, pero destina ms recursos del servidor al motor InnoDB. Se recomienda para usuarios que emplearn InnoDB casi exclusivamente, y harn un uso mnimo de MyISAM Base de datos no-transaccional exclusiva (Non-transactional database only) : Esta opcin deshabilita completamente el motor de almacenamiento InnoDB y destina todos los recursos del servidor al motor MyISAM. Recomendado para usuarios que no utilizarn InnoDB.
58
59
Para volver a un cuadro de dilogo anterior, debe hacerse click en el botn Atrs (Back). Para abandonar el asistente de configuracin sin cambiar la configuracin del servidor, debe hacerse click en el botn Cancelar (Cancel). Despus de hacer click en el botn Ejecutar (Execute), el asistente de configuracin MySQL llevar a cabo una serie de tareas cuyo avance se mostrar en la pantalla a medida que cada etapa termine. El asistente de configuracin MySQL determina en primer lugar las opciones del fichero de configuracin, basndose en las preferencias del usuario, y empleando una plantilla confeccionada por desarrolladores e ingenieros de MySQL AB. Esta plantilla se llama my-template.ini y se localiza en el directorio de instalacin del servidor. Luego, el asistente de configuracin guarda dichas opciones en el fichero my.ini. La ubicacin final de este fichero se muestra al lado de la tarea Guardar fichero de configuracin (Write configuration file). Si se opt por crear un servicio de Windows para el servidor MySQL, el asistente de configuracin crear e iniciar el servicio. Si se est reconfigurando un servicio existente, el asistente de configuracin reiniciar el servicio para que tomen efecto los cambios realizados. Si se opt por establecer una contrasea para el usuario root, el asistente de configuracin MySQL se conectar al servidor, establecer la nueva contrasea para root, y aplicar cualquier otra opcin de seguridad que se haya seleccionado. Despus de que el asistente de configuracin MySQL haya completado sus tareas, se mostrar un resumen. Haciendo click en el botn Terminar (Finish) se abandonar el asistente.
60
3. Elegir un tipo de servidor MySQL 4. Iniciar el servidor MySQL. 5. Establecer la seguridad de las cuentas de usuario por defecto. El proceso completo se describe en las secciones siguientes.
MySQL buscar opciones primero en el fichero my.ini y luego en my.cnf. Sin embargo, para evitar confusiones, es mejor emplear un solo fichero. Si el ordenador utiliza un gestor de arranque donde C: no es la unidad de inicio, la nica opcin ser my.ini. Cualquiera que sea el fichero de opciones empleado, deber estar en texto plano. Otra posibilidad es utilizar como base los ficheros de opciones incluidos como ejemplo en la distribucin de MySQL. stos se encuentran en el directorio de instalacin y tienen nombres como mysmall.cnf, my-medium.cnf, my-large.cnf, y my-huge.cnf. Para utilizarlos como base de la configuracin basta renombrarlos y copiarlos en la ubicacin apropiada. Un fichero de opciones puede crearse y modificarse con cualquier editor de textos, como el Bloc de Notas o Notepad. Por ejemplo, si MySQL est instalado en E:\mysql y el directorio de datos es E:
61
\mydata\data, se puede crear un fichero de opciones que contenga una seccin [mysqld] para especificar los valores que tendrn los parmetros basedir y datadir:
[mysqld] # coloca en basedir el directorio de instalacin basedir=E:/mysql # coloca en datadir el directorio de datos datadir=E:/mydata/data
Debe tenerse en cuenta que las rutas de directorio, aun en Windows, deben escribirse en los ficheros de opciones con barras invertidas (/) en lugar de las habituales. Si se desea emplear estas ltimas, deben colocarse en forma doble:
[mysqld] # coloca en basedir el directorio de instalacin basedir=E:\\mysql # coloca en datadir el directorio de datos datadir=E:\\mydata\\data
En Windows, el instalador de MySQL coloca el directorio de datos directamente bajo el directorio donde se instala MySQL. Si se deseara tener el directorio de datos en una ubicacin diferente, se debera copiar el contenido completo del directorio data en la nueva ubicacin. Por ejemplo, si MySQL se instala en C:\Program Files\MySQL\MySQL Server 5.0, el directorio de datos estar por defecto en C:\Program Files\MySQL\MySQL Server 5.0\data. Si se quiere que el directorio de datos sea E:\mydata deben hacerse dos cosas: 1. Desplazar el directorio data y todo su contenido desde C:\Program Files\MySQL\MySQL Server 5.0\data hasta E:\mydata. 2. Emplear la opcin --datadir para especificar la nueva ubicacin del directorio data cada vez que se inicia el servidor.
Todos los ejecutables mencionados estn optimizados para los modernos procesadores Intel, pero deberan funcionar en cualquier procesador Intel de tipo i386 o superior. En MySQL 5.0, todos los servidores Windows tienen soporte para vnculo simblico de directorios de bases de datos. MySQL tiene soporte para TCP/IP en todas las plataformas Windows. Los servidores mysqld-nt y mysql-max-nt tienen soporte para named pipes en Windows NT, 2000, XP y 2003. Sin embargo, lo habitual es emplear TCP/IP sin tener en cuenta la plataforma. (Las named pipes son ms lentas que TCP/IP en muchas configuraciones de Windows). El uso de named pipes est sujeto a estas condiciones: Las named pipes estn habilitadas solamente si se inicia el servidor con la opcin --enablenamed-pipe. Esto es necesario porque algunos usuarios han experimentado problemas al detener el servidor MySQL cuando las estaban utilizando.
62
Las conexiones con named pipes estn permitidas solamente en los servidores mysqld-nt o mysqld-max-nt, y siempre que la versin de Windows utilizada las soporte (Windows NT, 2000, XP, 2003). Estos servidores pueden ejecutarse en Windows 98 o Me, pero slo si el protocolo TCP/IP est instalado; las conexiones con named pipe no pueden utilizarse. Estos servidores no pueden ejecutarse en Windows 95. Nota: la mayor parte de los ejemplos de este manual emplean mysqld como nombre de servidor. Si se opta por emplear un servidor diferente, como mysqld-nt, deben hacerse los reemplazos de nombre adecuados en los comandos de los ejemplos.
En servidores que incluyen soporte para InnoDB, se deberan mostrar los siguientes mensajes a medida que el servidor se inicia:
InnoDB: The first specified datafile c:\ibdata\ibdata1 did not exist:
63
InnoDB: a new database to be created! InnoDB: Setting file c:\ibdata\ibdata1 size to 209715200 InnoDB: Database physically writes the file full: wait... InnoDB: Log file c:\iblogs\ib_logfile0 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile0 size to 31457280 InnoDB: Log file c:\iblogs\ib_logfile1 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile1 size to 31457280 InnoDB: Log file c:\iblogs\ib_logfile2 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile2 size to 31457280 InnoDB: Doublewrite buffer not found: creating new InnoDB: Doublewrite buffer created InnoDB: creating foreign key constraint system tables InnoDB: foreign key constraint system tables created 011024 10:58:25 InnoDB: Started
Cuando el servidor finaliza su secuencia de inicio, se debera ver un mensaje similar al siguiente, que indica que el servidor est listo para dar servicio a conexiones de clientes:
mysqld: ready for connections Version: '5.0.9-beta' socket: '' port: 3306
El servidor contina con la emisin por pantalla de cualquier otro mensaje de diagnstico que se genere. Puede abrirse una nueva ventana de consola en la cual ejecutar programas cliente. Si se omite la opcin --console, el servidor dirige la informacin de diagnstico hacia el registro de errores en el directorio de datos (por defecto, C:\Program Files\MySQL\MySQL Server 5.0\data). El registro de errores es el fichero con extensin .err. Nota: Las cuentas de usuario que aparecen inicialmente en las tablas de permisos de MySQL no estn protegidas por contrasea. Despus de iniciar el servidor, se deberan establecer las contraseas para estas cuentas empleando las instrucciones que se hallan en Seccin 2.9, Puesta en marcha y comprobacin despus de la instalacin.
La ruta empleada en el ejemplo anterior puede variar segn la ubicacin de la instalacin de MySQL en el sistema. En versiones no NT de Windows, esto ejecutar mysqld en segundo plano. Esto significa que luego de que el servidor se inicia, puede verse otra ventana de comandos. Si se inicia el servidor de esta manera pero en Windows NT, 2000, XP o 2003, el mismo se ejecuta en segundo plano sin que aparezca ningn indicador del sistema hasta que el servidor finaliza. Debido a esto, se deber abrir otra ventana de consola para correr programas cliente mientras el servidor se ejecuta. El siguiente comando detendr al servidor MySQL:
C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqladmin -u root shutdown
Esto invoca la utilidad administrativa de MySQL, mysqladmin, para conectarse al servidor y transmitirle la orden de finalizacin. El comando se conecta como el usuario root de MySQL, el cual es la cuenta administrativa por defecto en el sistema de permisos de MySQL. Debe advertirse que los usuarios en este sistema son enteramente independientes de cualquier usuario de inicio de sesin perteneciente a Windows. Si mysqld no se inicia, debe verificarse el registro de errores para ver si el servidor gener cualquier mensaje que indique la causa del problema. El registro de errores se localiza en el directorio C: \Program Files\MySQL\MySQL Server 5.0\data. Es el fichero con extensin .err. Tambin
64
puede intentarse iniciar el servidor con el comando mysqld --console; en este caso se podr obtener alguna informacin en pantalla que permita resolver el problema. La ltima opcin es ejecutar mysqld con --standalone --debug. En este caso, mysqld guardar un fichero de registro llamado C:\mysqld.trace el cual debera contener la razn por la cual mysqld no se inicia. Consulte Seccin D.1.2, Crear ficheros de traza. El comando mysqld --verbose --help sirve para mostrar todas las opciones que mysqld es capaz de comprender.
Nota: si la cuenta de usuario MySQL root est protegida por una contrasea, la forma de invocar este comando ser C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqladmin -u root -p shutdown y porporcionando la contrasea cuando sea solicitada. Esto invoca la utilidad administrativa de MySQL, mysqladmin, para conectarse al servidor y transmitirle la orden de finalizacin. El comando se conecta como el usuario root de MySQL, el cual es la cuenta administrativa por defecto en el sistema de permisos de MySQL. Debe advertirse que los usuarios en este sistema son enteramente independientes de cualquier usuario de inicio de sesin perteneciente a Windows. Este comando instalar el servidor como un servicio:
C:\> mysqld --install
Si se producen problemas al instalar mysqld como un servicio usando slo el nombre del servidor, debe intentarse indicando la ruta completa. Por ejemplo:
C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld --install
La ruta al directorio bin de MySQL puede agregarse a la variable de entorno de Windows PATH: En el Escritorio de Windows, hacer click derecho en el cono Mi PC y seleccionar Propiedades A continuacin, seleccionar la pestaa Opciones Avanzadas de la ventana Propiedades del Sistema, y hacer click en el botn Variables de Entorno. Bajo Variables del Sistema, seleccionar Path , y hacer click en el botn Modificar. Aparecer el cuadro de dilogo Modificar Variable del Sistema. Debe colocarse el cursor al final del texto mostrado en el espacio denominado Valor de la Variable. (Presionando la tecla Fin (End) se puede tener seguridad que el cursor quede realmente al final del texto.) Luego debe ingresarse la ruta completa al directorio bin de MySQL (por ejemplo, C: \Program Files\MySQL\MySQL Server 5.0\bin). Si haba un texto anterior, debe haber un punto y coma separando aquel y esta nueva ruta. Cerrar todos los cuadros de dilogo haciendo click en OK. Ahora debera poderse invocar cualquier programa ejecutable de MySQL simplemente
65
tipeando su nombre en el indicador de sistema desde cualquier directorio, sin tener que indicar la ruta completa. Esto incluye a los servidores, el cliente mysql, y todas las utilidades de lnea de comandos tal como mysqladmin y mysqldump. No se debera agregar el directorio bin de MySQL al PATH de Windows si se estn ejecutando mltiples servidores MySQL en el mismo ordenador. Advertencia: debe tenerse mucho cuidado al editar manualmente la variable de sistema PATH; el borrado o modificacin accidental de cualquier parte podra dejar al sistema funcionando mal o incluso inutilizable. El comando de instalacin como servicio no inicia el servidor. Las instrucciones para hacerlo se dan luego en esta seccin. MySQL 5.0 soporta argumentos adicionales cuando se lo instala como servicio: Puede indicarse un nombre para el servicio inmediatamente a continuacin de la opcin -install. El nombre por defecto es MySQL. Si se indica un nombre de servicio, solamente puede especificarse una opcin a continuacin. Por convencin, esta debera ser --defaults-file=file_name para indicar el nombre de un fichero de opciones que el servidor debera leer cuando se inicia. Es posible emplear otra opcin en vez de --defaults-file, pero no se recomienda. -defaults-file es ms flexible porque posibilita especificar mltiples opciones de inicio para el servidor, colocndolas en el fichero indicado. Adems, en MySQL 5.0, el uso de una opcin diferente a --defaults-file no est soportado hasta la versin 5.0.3. A partir de la versin 5.0.1, puede especificarse la opcin --local-service a continuacin del nombre del servicio. Esto provoca que el servidor se ejecute empleando la cuenta LocalService de Windows, que tiene privilegios de sistema limitados. Esta cuenta existe solamente en Windows XP y posteriores. Si ambas opciones --defaults-file y --local-service son colocadas a continuacin del nombre del servicio, pueden estar en cualquier orden. Para un servidor MySQL que se instal como un servicio de Windows, las siguientes reglas determinan el nombre de servicio y los ficheros de opciones que utilizar: Si el comando de instalacin como servicio no especific un nombre de servicio o el nombre por defecto (MySQL) a continuacin de la opcin --install, el servidor tomar el nombre de servicio MySQL y leer opciones desde el grupo [mysqld] en los ficheros de opciones estndar. Si el comando de instalacin como servicio especifica un nombre de servicio distinto a MySQL luego de la opcin --install, el servidor emplear ese nombre de servicio. Leer opciones en el grupo que tenga el mismo nombre que el servicio, en los ficheros de opciones estndar. El servidor tambin leer opciones desde el grupo [mysqld] de los ficheros de opciones estndar. Esto permite usar el grupo [mysqld] para opciones que deban ser utilizadas por todos los servicios MySQL, y un grupo de opciones con el mismo nombre del servicio para ser usadas slo por aquel. Si el comando de instalacin del servicio especifica una opcin --defaults-file despus del nombre del servicio, el servidor leer opciones solamente desde el grupo [mysqld] del fichero suministrado e ignorar los ficheros de opciones estndar. A modo de un ejemplo ms complejo, considrese el siguiente comando:
C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld --install MySQL --defaults-file=C:\my-opts.cnf
Aqu, el nombre de servicio por defecto (MySQL) se suministr a continuacin de la opcin -install. Si no se hubiera indicado la opcin --defaults-file, este comando hubiese tenido como efecto que el servidor leyera el grupo [mysqld] de los ficheros de opciones estndar. No obstante, debido a que la opcin --defaults-file se encuentra presente, el servidor leer las opciones del grupo [mysqld], pero slo del fichero indicado.
66
Tambin es posible especificar opciones como Parmetros de Inicio (Start parameters) en la utilidad Services de Windows antes de iniciar el servicio MySQL. Una vez que el servidor MySQL ha sido instalado como servicio, ser iniciado automticamente luego del arranque de Windows. El servicio tambin puede iniciarse desde la utilidad Services, o empleando el comando NET START MySQL. El comando NET no es case sensitive. Cuando se ejecuta como servicio, mysqld no tiene acceso a una ventana de consola, por lo que no puede mostrar mensajes. Si mysqld no se inicia, debe consultarse el registro de errores para ver si el servidor ha dejado all mensajes que indiquen la causa del problema. El registro de errores se encuentra en el directorio de datos de MySQL (por ejemplo, C:\Program Files\MySQL\MySQL Server 5.0\data). Es el fichero con extensin .err. Cuando un servidor MySQL se instala como servicio, se detendr automticamente si estaba en ejecucin al momento de cerrar Windows. Tambin puede detenerse manualmente, ya sea a travs de la utilidad Services, del comando NET STOP MySQL, o del comando mysqladmin shutdown. Tambin existe la opcin de instalar el servidor como un servicio de inicio manual, si no se desea que el servicio se inicie en cada arranque de Windows. Para esto, debe emplearse la opcin --installmanual en lugar de --install:
C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld --install-manual
Para cancelar un servidor que fue instalado como servicio, primero se lo debe detener, si est en ejecucin, por medio del comando NET STOP MYSQL. Luego de esto se usar la opcin --remove para cancelarlo:
C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld --remove
Si mysqld no se est ejecutando como un servicio, se lo puede iniciar desde la lnea de comandos. Consulte Seccin 2.3.11, Arrancar MySQL desde la lnea de comandos de Windows para ms instrucciones. Consulte Seccin 2.3.14, Resolucin de problemas en la instalacin de MySQL bajo Windows si se producen problemas durante la instalacin.
Si mysqld responde con lentitud a las conexiones TCP/IP provenientes de programas cliente, probablemente haya un problema con el DNS. En este caso, hay que iniciar mysqld con la opcin -skip-name-resolve y utilizar solamente localhost y nmeros de IP en la columna Host de las tablas de permisos de MySQL. Puede forzarse a un cliente MySQL a utilizar una conexin named pipe en lugar de TCP/IP especificando la opcin --pipe o --protocol=PIPE, o indicando . (punto) como nombre de host. La opcin --socket se utilizar para especificar el nombre del pipe.
67
que est impidiendo su inicio. El registro de errores se encuentra en el directorio de datos especificado en el fichero my.ini. La ubicacin por defecto es C:\Program Files\MySQL\MySQL Server 5.0\data. Consulte Seccin 5.10.1, El registro de errroes (Error Log). Otra fuente de informacin relativa a posibles errores son los mensajes mostrados en la consola cuando el servicio MySQL se est iniciando. Empleando el comando NET START mysql en la lnea de comandos luego de instalar mysqld como un servicio, se podr ver cualquier mensaje de error relativo al inicio del servicio MySQL. Consulte Seccin 2.3.12, Arrancar MySQL como un servicio de Windows. A continuacin se brindan ejemplos de algunos de los ms comunes errores que pueden ocurrir cuando se instala MySQL y se inicia el servidor por primera vez:
System error 1067 has occurred. Fatal error: Can't open privilege tables: Table 'mysql.host' doesn't exist
Este mensaje se emite cuando el servidor MySQL no puede encontrar la base de datos mysql u otros ficheros vitales para su funcionamiento. A menudo sucede cuando el directorio base o el directorio de datos de MySQL se instalan en ubicaciones distintas a las predeterminadas (C: \mysql y C:\Program Files\MySQL\MySQL Server 5.0\data, respectivamente). Una situacin en la que puede ocurrir esto es cuando se instala una actualizacin de MySQL en una nueva ubicacin, pero el fichero de configuracin no se modifica para reflejar el nuevo directorio. Accesoriamente puede suceder que haya ficheros de configuracin antiguos y nuevos en conflicto. Al actualizar MySQL hay que asegurarse de borrar o renombrar los ficheros de configuracin existentes. Si se ha instalado MySQL en un directorio diferente a C:\Program Files\MySQL\MySQL Server 5.0 es necesario asegurarse de que el servidor MySQL est al tanto de esto a travs del uso de un fichero de configuracin (my.ini). El fichero my.ini debe estar localizado en el directorio de Windows, generalmente C:\WINNT o C:\WINDOWS. Se puede determinar su ubicacin exacta a partir de la variable de entorno WINDIR si se ordena lo siguiente en la lnea de comandos:
C:\> echo %WINDIR%
Cualquier editor de texto, como Notepad, sirve para crear y modificar un fichero de opciones. Por ejemplo, si MySQL se instala en E:\mysql y el directorio de datos es D:\MySQLdata, se puede crear el fichero de opciones y establecer una seccin llamada [mysqld] para indicar los valores de los parmetros basedir y datadir:
[mysqld] # Coloca en basedir el directorio de instalacin basedir=E:/mysql # Coloca en datadir el directorio de datos datadir=D:/MySQLdata
Debe tenerse en cuenta que las rutas de directorio, an en Windows, deben escribirse en los ficheros de opciones con barras invertidas (/) en lugar de las habituales. Si se desea emplear estas ltimas, deben colocarse en forma doble:
[mysqld] # Coloca en basedir el directorio de instalacin basedir=C:\\Program Files\\MySQL\\MySQL Server 5.0 # Coloca en datadir el directorio de datos datadir=D:\\MySQLdata
Este error ocurre cuando se reinstala o actualiza MySQL utilizando el Asistente de Configuracin y sin detener y quitar primero el servicio MySQL existente. Sucede debido a que cuando el Asistente de Configuracin intenta instalar el servicio, halla el anterior con el mismo nombre.
68
Una solucin es escoger un nombre de servicio diferente a mysql cuando se emplea el Asistente de Configuracin. Esto le permitir al nuevo servicio instalarse correctamente, pero an seguir existiendo el servicio anterior. Aunque no es nocivo, es mejor remover los servicios que no estn en uso. Para quitar permanentemente el antiguo servicio mysql, debe emplearse el siguiente comando en la lnea de comandos, dentro de un usuario que tenga privilegios de administrador:
C:\>sc delete mysql [SC] DeleteService SUCCESS
Si la versin de Windows que se est utilizando no posee la utilidad sc, puede descargarse la utilidad delsrv desde http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/delsrvo.asp y utilizarla con la sintaxis delsrv mysql.
Si no se est ejecutando el servidor MySQL como un servicio de Windows, debe detenerse el servidor con el siguiente comando:
C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqladmin -u root shutdown
4. Cuando se actualiza a MySQL 5.0 desde una versin anterior de la 4.1.5 o bien cuando se actualiza desde una versin instalada desde un fichero zip a otra que utiliza el Asistente de Instalacin MySQL, se debe quitar manualmente la instalacin anterior, incluyendo el servicio MySQL (si el server se hubiera instalado como servicio de Windows). Para quitar el servicio MySQL, debe utilizarse el siguiente comando:
C:\> C:\mysql\bin\mysqld --remove
Si no se quita el servicio existente, el Asistente de Instalacin MySQL puede fallar al instalar el nuevo servicio MySQL. 5. Si se est empleando el Asistente de Instalacin MySQL, debe iniciarse el asistente como se indica en Seccin 2.3.4, Usar el asistente de instalacin de MySQL. 6. Si se est instalando MySQL desde un fichero Zip, debe descomprimirse el fichero. Durante la operacin puede sobreescribirse la instalacin actual de MySQL (generalmente localizada en C: \mysql), o instalar la nueva versin en una ubicacin diferente, como C:\mysql5. Se recomienda sobreescribir la instalacin existente. 7. Reiniciar el servidor. Por ejemplo, usando el comando NET START MySQL si se ejecutar MySQL como un servicio, o en otro caso, invocar directamente el comando mysqld. 8. Consulte Seccin 2.10, Aumentar la versin de MySQL para obtener informacin adicional (no limitada a Windows) sobre la actualizacin de MySQL. 69
9. Si se producen errores, consulte Seccin 2.3.14, Resolucin de problemas en la instalacin de MySQL bajo Windows.
70
Realizar DROP TABLE sobre una tabla que est en uso por una tabla MERGE no funcionar en Windows porque el manejador MERGE oculta el mapeo de la tabla a la capa superior de MySQL. Debido a que Windows no permite eliminar archivos que se encuentran abiertos, primero debern guardarse los cambios en todas las tablas MERGE (con FLUSH TABLES) o eliminar la tabla MERGE antes de borrar la tabla en cuestin. DATA DIRECTORY e INDEX DIRECTORY Las opciones de CREATE TABLE DATA DIRECTORY e INDEX DIRECTORY se ignoran en Windows, ya que Windows no soporta vnculos simblicos. Estas opciones tambin se ignoran en otros sistemas operativos que no tengan una llamada realpath() funcional. DROP DATABASE No se puede eliminar una base de datos que est siendo utilizada por algn subproceso. Finalizar MySQL desde el Administrador de Tareas No es posible finalizar MySQL desde el Administrador de Tareas o con la utilidad shutdown en Windows 95. Se lo debe detener usando mysqladmin shutdown. Nombres case-insensitive Los nombres de ficheros no son case sensitive en Windows, por lo tanto tampoco lo son los nombres de bases de datos y tablas. La nica restriccin es que los nombres de bases de datos y tablas deben ser especificados empleando el mismo esquema de maysculas y minsculas a lo largo de la misma sentencia. Consulte Seccin 9.2.2, Sensibilidad a maysuclas y minsculas de identificadores. El separador de rutas '\' En Windows, los componentes de las rutas de directorios estn separados por '\', el cual es tambin el carcter de escape en MySQL. Si se est utilizando LOAD DATA INFILE o SELECT ... INTO OUTFILE, deben usarse nombres de ficheros al estilo Unix, separados con caracteres '/':
mysql> LOAD DATA INFILE 'C:/tmp/skr.txt' INTO TABLE skr; mysql> SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr;
Problemas con pipes. Los pipes no funcionan confiablemente desde la lnea de comandos de Windows. Si el pipe incluye el carcter ^Z / CHAR(24), Windows lo reconocer como fin de fichero y terminar el programa. Esto es un problema particularmente cuando se intenta aplicar un fichero de registro (log) binario:
C:\> mysqlbinlog binary-log-name | mysql --user=root
Si ocurre un problema al aplicar el fichero de registro y se sospecha que es causado por un carcter ^Z / CHAR(24), puede intentarse la siguiente solucin:
C:\> mysqlbinlog binary-log-file --result-file=/tmp/bin.sql C:\> mysql --user=root --execute "source /tmp/bin.sql"
El ltimo comando tambien puede usarse para leer confiablemente cualquier fichero SQL que pueda contener datos binarios. Error Access denied for user (Acceso denegado a usuario)
71
Si se intenta ejecutar un programa cliente MySQL para conectarse a un servidor que funciona en el mismo ordenador, pero se obtiene el mensaje de error Access denied for user 'algnusuario'@'unknown' to database 'mysql', significa que MySQL no puede resolver apropiadamente el nombre del ordenador anfitrin (host). Para resolver esto, se debe crear un fichero llamado \windows\hosts conteniendo la siguiente informacin:
127.0.0.1 localhost
La siguiente es una lista de temas pendientes para aquellos que deseen colaborar en el perfeccionamiento de MySQL para Windows: Agregar macros para utilizar los mtodos de incremento/decremento provistos por Windows, ms rpidos y seguros para el trabajo con subprocesos.
72
MySQL-server-VERSION.i386.rpm El servidor MySQL. Ser necesario, a menos que solamente se desee conectar a un servidor MySQL ejecutado en otro ordenador. Nota: los ficheros RPM del servidor se denominaban MySQL-VERSION.i386.rpm antes de la versin 4.0.10. Es decir, no incluan -server en su nombre. MySQL-Max-VERSION.i386.rpm El servidor MySQL-Max. Este servidor tiene capacidades adicionales que no posee el provisto en el RPM MySQL-server. Igualmente, debe instalarse primero el RPM MySQL-server, porque el RPM MySQL-Max depende de l. MySQL-client-VERSION.i386.rpm Los programas cliente MySQL estndar. Es probable que siempre se instale este paquete. MySQL-bench-VERSION.i386.rpm Pruebas al programa y pruebas de rendimiento. Requieren Perl y el mdulo DBD::mysql. MySQL-devel-VERSION.i386.rpm Las bibliotecas y ficheros de cabecera que se necesitan para compilar otros clientes MySQL, como los mdulos Perl. MySQL-shared-VERSION.i386.rpm Este paquete contiene las bibliotecas compartidas (libmysqlclient.so*) que ciertos lenguajes y aplicaciones necesitan para enlazar dinmicamente y usar MySQL. MySQL-shared-compat-VERSION.i386.rpm Este paquete incluye las bibliotecas compartidas para MySQL 3.23 y MySQL 4.0. Debe instalarse en lugar de MySQL-shared si hay instaladas aplicaciones enlazadas dinmicamente con MySQL 3.23 y se desea actualizar a MySQL 4.0 sin afectar las dependencias de bibliotecas. Este paquete se encuentra disponible desde MySQL 4.0.13. MySQL-embedded-VERSION.i386.rpm La biblioteca del servidor MySQL incrustado (desde MySQL 4.0) MySQL-VERSION.src.rpm Contiene el cdigo fuente de todos los paquetes anteriores. Puede usarse para regenerar los RPMs bajo otras arquitecturas (por ejemplo, Alpha o SPARC). Para ver todos los ficheros contenidos en un paquete RPM (por ejemplo, un RPM MySQL-server), se debe ejecutar:
shell> rpm -qpl MySQL-server-VERSION.i386.rpm
RPM ofrece una caracterstica para verificar la integridad y autenticidad de los paquetes antes de instalarlos. Para ms informacin consulte Seccin 2.1.4, Comprobar la integridad de paquetes con sumas de verificacin MD5 o GnuPG.
73
El servidor RPM ubica los datos bajo el directorio /var/lib/mysql. Tambin crea una cuenta de acceso para el usuario mysql (si no existe anteriormente) a fin de ejecutar el servidor MySQL, y crea las correspondientes entradas en /etc/init.d/ para iniciar el servidor automticamente al arrancar el sistema. (Esto significa que si se haba realizado una instalacin previa y se hicieron cambios al script de inicio, posiblemente se desee hacer una copia de ese script para no perder los cambios al instalar un nuevo RPM). Consulte Seccin 2.9.2.2, Arrancar y parar MySQL automticamente para ms informacin sobre como MySQL puede iniciarse automticamente junto con el sistema. Si se va a instalar el RPM MySQL en una distribucin antigua de Linux la cual no soporta scripts de inicio en /etc/init.d (directamente o por medio de un symlink), deber crearse un vnculo simblico que apunte a la ubicacin donde realmente est instalado el script de inicializacin. Por ejemplo, si la ubicacin es /etc/rc.d/init.d, se debern ejecutar los siguientes comandos antes de instalar el RPM para crear /etc/init.d como un vnculo simblico que apunte all:
shell> cd /etc shell> ln -s rc.d/init.d .
Sin embargo, todas las principales distribuciones Linux de la actualidad soportan la nueva disposicin de directorios que utiliza /etc/init.d, porque es un requisito para cumplir con el LSB (Linux Standard Base, Base Estndar para Linux). Si entre los ficheros RPM instalados se encuentra MySQL-server, el servidor mysqld debera estar ejecutndose luego de la instalacin, y se debera estar en condiciones de comenzar a utilizar MySQL. Si algo no va bien, se puede hallar ms informacin en la seccin dedicada a la instalacin binaria. Consulte Seccin 2.7, Instalacin de MySQL en otros sistemas similares a Unix. Nota: Las cuentas que se hallan en las tablas de permisos de MySQL, en principio no estn protegidas con contraseas. Despus de iniciar el servidor se deben establecer contraseas para esas cuentas siguiendo las instrucciones en Seccin 2.9, Puesta en marcha y comprobacin despus de la instalacin.
Si ocurre este error, simplemente debe hacerse click en el botn Go Back una vez para volver a la pantalla anterior. Luego hacer click en Continue para avanzar nuevamente a la seleccin de disco destinto, y entonces debera poderse elegir sin problemas la unidad de instalacin. MySQL AB ha informado de este error a Apple, quien se encuentra investigando el problema.
74
El PKG para Mac OS X de MySQL se instala en /usr/local/mysql-VERSION y tambin instala un vnculo simblico, /usr/local/mysql, apuntando a la nueva ubicacin. Si existe un directorio llamado /usr/local/mysql, ser renombrado a /usr/local/mysql.bak primero. Adicionalmente, el instalador crear las tablas de permisos en la base de datos mysql a travs de la ejecucin de mysql_install_db despus de la instalacin. La disposicin de la instalacin es similar a la de la distribucin binaria en fichero tar, todos los ficheros binarios de MySQL estn ubicados en el directorio /usr/local/mysql/bin. El fichero de socket MySQL se crea por defecto en /tmp/mysql.sock. Consulte Seccin 2.1.5, Conformacin de la instalacin. La instalacin de MySQL requiere una cuenta de usuario Mac OS X llamada mysql. En Mac OS X 10.2 y posteriores, debera existir por defecto una cuenta con este nombre. Si se est ejecutando Mac OS X Server, entonces se tiene una versin de MySQL instalada. Las versiones de MySQL que acompaan a cada versin de Mac OS X Server se muestran en la siguiente tabla: Versin de Mac OS X Server 10.2-10.2.2 10.2.3-10.2.6 10.3 10.3.2 10.4.0 Versin de MySQL 3.23.51 3.23.53 4.0.14 4.0.16 4.1.10a
Esta seccin del manual abarca solamente la instalacin del PKG oficial para Mac OS X de MySQL. Se debe leer la ayuda de Apple relativa a la instalacin de MySQL: Ejecutando la aplicacin Help View, seleccionando la ayuda de Mac OS X Server, haciendo una bsqueda por MySQL, y leyendo el tema titulado Installing MySQL. En versiones de MySQL preinstaladas en Mac OS X Server, hay que tener en cuenta especialmente que se debera dar inicio a mysqld con el comando safe_mysqld en lugar de mysqld_safe si MySQL es anterior a la versin 4.0. Si anteriormente se estuvieron utilizando los paquetes para Mac OS X de Marc Liyanage, descargados de http://www.entropy.ch, es suficiente con seguir las instrucciones para actualizar paquetes que usan la disposicin de la instalacin binaria, como se ha presentado en estas pginas. Si se est actualizando hacia el PKG MySQL oficial desde alguna de las versiones 3.23.xx de Marc, o desde la versin de MySQL que acompaa al Mac OS X Server, se pueden convertir al formato actual las tablas de privilegios MySQL existentes, ya que se aadieron algunos nuevos privilegios de seguridad. Consulte Seccin 2.10.2, Aumentar la versin de las tablas de privilegios. Si se desea iniciar automticamente el servidor MySQL junto con el arranque del sistema, ser necesario instalar tambin el Componente MySQL Startup (Inicio de MySQL). En el caso de MySQL 5.0, viene como un paquete separado dentro de las imgenes de disco de instalacin. Siplemente hay que hacer doble click en el cono MySQLStartupItem.pkg y seguir las instrucciones para instalarlo. El Componente de Inicio de MySQL slo necesita ser instalado una vez: no hay necesidad de instalarlo cada vez que se hace una actualizacin de MySQL El Componente de Inicio de MySQL se instala en /Library/StartupItems/MySQLCOM. (Antes de MySQL 4.1.2, la ubicacin era /Library/StartupItems/MySQL, pero entraba en conflicto con el Componente de Inicio de MySQL instalado por Mac OS X Server). La instalacin del Componente de Inicio agrega una variable MYSQLCOM=-YES- al fichero de configuracin del sistema /etc/ hostconfig. Si se deseara deshabilitar el inicio automtico de MySQL, simplemente hay que cambiar esta variable a MYSQLCOM=-NO-.
75
En Mac OS X Server, la instalacin por defecto de MySQL utiliza la variable MYSQL en el fichero /etc/hostconfig. El instalador del Componente de Inicio de MySQL provisto por MySQL AB deshabilita esta variable establecindola en MYSQL=-NO-. Esto evita conflictos al momento del arranque del sistema con la variable MYSQLCOM utilizada por el Componente de Inicio de MySQL AB. Sin embargo, ello no finaliza un server MySQL en ejecucin. Eso debera ser hecho expresamente por el usuario. Luego de la instalacin, se puede iniciar MySQL ejecutando los siguientes comandos en una ventana de terminal. Se deben tener privilegios de administrador para llevar a cabo esta tarea. Si se ha instalado el Componente de Inicio:
shell> sudo /Library/StartupItems/MySQLCOM/MySQLCOM start (Enter your password, if necessary) (Press Control-D or enter "exit" to exit the shell)
Se debera estar en condiciones de conectar con el servidor MySQL, por ejemplo, ejecutando /usr/ local/mysql/bin/mysql. Nota: Las cuentas que se hallan en las tablas de permisos de MySQL, en principio no estn protegidas con contraseas. Despus de iniciar el servidor se deben establecer contraseas para esas cuentas siguiendo las instrucciones en Seccin 2.9, Puesta en marcha y comprobacin despus de la instalacin. Se podra desear agregar alias al fichero de recursos del shell para facilitar el acceso a los programas ms utilizados, como mysql y mysqladmin, desde la lnea de comandos. La sintaxis para tcsh es:
alias mysql /usr/local/mysql/bin/mysql alias mysqladmin /usr/local/mysql/bin/mysqladmin
An mejor, es agregar /usr/local/mysql/bin a la variable de entorno PATH. Por ejemplo, si se emplea el shell tcsh, agregando la siguiente lnea al fichero $HOME/.tcshrc:
setenv PATH ${PATH}:/usr/local/mysql/bin
Si en el directorio home no existe el fichero .tcshrc, se lo deber crear con un editor de textos. Si se est actualizando una instalacin existente, hay que notar que instalar un nuevo PKG MySQL no borra el directorio de la instalacin anterior. Desafortunadamente, el instalador de Mac OS X an no ofrece la funcionalidad necesaria para actualizar apropiadamente los paquetes instalados con anterioridad. Para utilizar en la nueva instalacin las bases de datos existentes, habr que copiar el contenido del directorio de datos antiguo dentro del nuevo. Hay que asegurarse que ni el antiguo servidor ni el nuevo estn en funcionamiento cuando se haga esto. Luego de que se hayan copiado las bases de datos desde la antigua instalacin hacia la nueva, y se haya iniciado exitosamente el nuevo servidor, debe considerarse la eliminacin de la instalacin anterior a fin de recuperar espacio en disco. Quiz tambin se desee borrar versiones antiguas de los directorios Receipt localizados en /Library/ Receipts/mysql-VERSION.pkg.
MySQL fue portado a NetWare a travs de un esfuerzo encabezado por Novell. Los clientes de Novell se sentirn gratificados al advertir que NetWare 6.5 incluye la distribucin binaria de MySQL, con una licencia comercial para todos los servidores que ejecuten esa versin de NetWare. MySQL para NetWare est compilado utilizando una combinacin de Metrowerks CodeWarrior para NetWare y versiones especiales de compilacin cruzada de las GNU autotools. La ltima distribucin binaria para NetWare puede obtenerse en http://dev.mysql.com/downloads/. Consulte Seccin 2.1.3, Cmo obtener MySQL. A fin de hospedar a MySQL, el servidor NetWare debe cumplir estos requisitos: Debe ser NetWare 6.5 con Support Pack 2 instalado y actualizado con la ltima LibC, o NetWare 6.0 con Support Pack 4 instalado y actualizado con la ltima LibC. El Support Pack 2 de NetWare 6.5 y otras actualizaciones pueden descargarse de: http://support.novell.com/filefinder/18197/ index.html. El Support Pack 4 de NetWare 6.0 y otras actualizaciones pueden descargarse de: http:// support.novell.com/filefinder/13659/index.html. La ltima biblioteca LibC puede descargarse de: http://developer.novell.com/ndk/libc.htm. Las instrucciones para actualizar LibC se encuentran en: http://developer.novell.com/ndk/doc/libc/index.html?page=/ndk/doc/libc/libc_enu/data/ajjl0r0.html. Para poder ejecutar la respectiva versin de NetWare, el sistema debe cumplir con los requisitos mnimos de Novell. Tanto los datos como los ficheros binarios de MySQL deben instalarse en un volumen NSS; los volmenes tradicionales no estn soportados. Debe emplearse el siguiente procedimiento para instalar MySQL para NetWare: 1. Si se est actualizando desde una versin anterior, debe detenerse el servidor MySQL. Esto se hace desde la consola del servidor, utilizando el siguiente comando:
SERVER: mysqladmin -u root shutdown
2. Debe iniciarse sesin en el servidor de destino desde un ordenador cliente que tenga acceso a la ubicacin donde se instalar MySQL. 3. Extraer en el servidor el paquete binario contenido en el fichero Zip. Hay que cerciorarse de habilitar las rutas en el fichero Zip para que sea usado. Lo ms seguro es simplemente extraerlo en SYS:\. Si se est actualizando desde una instalacin anterior, puede ser necesario copiar el directorio de datos (por ejemplo, SYS:MYSQL\DATA), as como my.cnf, si se lo haba modificado. Luego puede borrarse la antigua copia de MySQL. 4. Posiblemente se desee renombrar el directorio de instalacin con una denominacin ms consistente y simple de usar. Se recomienda emplear SYS:MYSQL; los ejemplos en este manual utilizan ese nombre para referirse al directorio de instalacin en general. 5. Desde la consola del servidor, debe agregarse una ruta de bsqueda para el directorio conteniendo los NLMs de MySQL. Por ejemplo:
SERVER: SEARCH ADD SYS:MYSQL\BIN
6. Inicializar el directorio de datos y las tablas de permisos, de ser necesario, a travs de la ejecucin de mysql_install_db desde la consola del servidor. 7. Iniciar el servidor MySQL con el comando mysqld_safe desde la consola del servidor. 8. Para finalizar la instalacin, se deberan agregar los siguientes comandos al autoexec.ncf. Por ejemplo, si la instalacin de MySQL se encuentra en SYS:MYSQL y se desea iniciar MySQL automticamente, habra que agregar las siguientes lneas:
#Inicia el servidor de bases de datos MySQL 5.0.x
77
Si se ejecutar MySQL en NetWare 6.0, es altamente recomendable utilizar la opcin --skipexternal-locking en la lnea de comandos:
#Inicia el servidor de bases de datos MySQL 5.0.x SEARCH ADD SYS:MYSQL\BIN MYSQLD_SAFE --skip-external-locking
En tal caso tambin ser necesario utilizar CHECK TABLE y REPAIR TABLE en lugar de myisamchk, puesto que myisamchk emplea bloqueo externo. Se sabe que el bloqueo externo cauas problemas en NetWare 6.0; el problema fue eliminado en NetWare 6.5. mysqld_safe para NetWare despliega una pantalla. Cuando se descarga (finaliza) el NLM mysqld_safe, la pantalla no desaparece por defecto. En lugar de eso, espera por una entrada del usuario:
*<NLM has terminated; Press any key to close the screen>*
Si se desea que NetWare cierre la pantalla automticamente, debe agregarse la opcin -autoclose a mysqld_safe. Por ejemplo:
#Inicia el servidor de bases de datos MySQL 5.0.x SEARCH ADD SYS:MYSQL\BIN MYSQLD_SAFE --autoclose
9. Al instalar MySQL 5.0, ya sea por primera vez o como actualizacin de una versin anterior, se debe descargar e instalar el mdulo Perl para MySQL 5.0 desde http://forge.novell.com/modules/ xfcontent/downloads.php/perl/Modules/MySQL-5.0.3a-Beta-LIBC-Based/. Al instalar MySQL 5.0, ya sea por primera vez o como actualizacin de una versin previa a la 4.1, se debe descargar e instalar la Extensin de PHP5 para MySQL 4.1 desde http://forge.novell.com/modules/xfcontent/ downloads.php/php/Modules/MySQL%204.1/. (Este mdulo tambin debera funcionar con MySQL 5.0) El funcionamiento de mysqld_safe en NetWare se describe ms adelante en Seccin 5.1.3, El script de arranque del servidor mysqld_safe. Si ya haba una instalacin de MySQL en el servidor, hay que cerciorarse de verificar el autoexec.ncf en busca de comandos de inicio de MySQL, y editarlos o borrarlos segn sea necesario. Nota: Las cuentas que se hallan en las tablas de permisos de MySQL, en principio no estn protegidas con contraseas. Despus de iniciar el servidor se deben establecer contraseas para esas cuentas siguiendo las instrucciones en Seccin 2.9, Puesta en marcha y comprobacin despus de la instalacin.
78
Para instalar una distribucin binaria de MySQL en fichero tar se requieren las siguientes herramientas: GNU gunzip para descomprimir la distribucin. Un tar para expandir la distribucin. GNU tar funciona correctamente. Algunos sistemas operativos vienen con una versin preinstalada de tar que tiene algunos problemas. Por ejemplo, el tar incluido con Mac OS X y el de Sun presentan problemas con nombres de fichero largos. En Mac OS X puede utilizarse el tambin preinstalado programa gnutar. En otros sistemas que tengan un tar deficiente, se debera instalar antes GNU tar. Si ocurren problemas, siempre debe emplearse mysqlbug para enviar consultas a la lista de correo MySQL. An si no se trata de un error, mysqlbug recoge informacin del sistema que ser de utilidad para quienes intenten resolver el problema. Al no usar mysqlbug se reduce la probabilidad de obtener una solucin. mysqlbug se puede hallar en el directorio bin luego de expandir la distribucin. Consulte Seccin 1.6.1.3, Cmo informar de bugs y problemas. Los comandos bsicos a ejecutarse para instalar y usar una distribucin binaria de MySQL son:
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 --user=mysql chown -R root . chown -R mysql data chgrp -R mysql . bin/mysqld_safe --user=mysql &
Nota: Este procedimiento no establece ninguna contrasea para las cuentas MySQL. Despus de completar el procedimiento debe continuarse con Seccin 2.9, Puesta en marcha y comprobacin despus de la instalacin. Esta es una versin ms detallada del procedimiento para instalar una distribucin binaria: 1. Crear un usuario y un grupo para mysqld a fin de que pueda ejecutarse:
shell> groupadd mysql shell> useradd -g mysql mysql
Estos comandos agregan el grupo mysql y el usuario mysql. La sintaxis para useradd y groupadd puede variar ligeramente entre las distintas versiones de Unix. Tambin pueden llamarse adduser y addgroup. Si se quisiera llamar al usuario y al grupo con otro nombre en lugar de mysql, habra que substituir por el nombre apropiado en los siguientes pasos. 2. Posicionarse en el directorio en el cual se desea expandir la distribucin. En el siguiente ejemplo se expandir bajo /usr/local. (Las instrucciones, sin embargo, asumen que se tiene permisos suficientes para crear ficheros y directorios en /usr/local. Si tal directorio se encuentra protegido, se deber llevar a cabo la instalacin como usuario root.)
shell> cd /usr/local
3. Obtener un fichero de distribucin desde uno de los sitios listados en Seccin 2.1.3, Cmo obtener MySQL. Dado un release, las distribuciones de todas las plataformas son generadas a partir del mismo cdigo fuente. 4. Expandir la distribucin, lo cual crear el directorio de instalacin. Luego crear un vnculo simblico a ese directorio:
shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf -
79
El comando tar crea un directorio denominado mysql-VERSION-OS. El comando ln crea un vnculo simblico a ese directorio. Esto permite referirse a ese directorio de una forma ms sencilla: /usr/local/mysql. Con GNU tar no se necesita invocar separadamente a gunzip. Se puede reemplazar la primera lnea con el siguiente comando alternativo, para descomprimir y extraer la distribucin:
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
Se pueden encontrar varios ficheros y subdirectorios en el directorio mysql. Los ms importantes a efectos de la instalacin son los subdirectorios bin y scripts. bin Este directorio contiene los programas cliente y el servidor. Se debera agregar la ruta completa de este directorio a la variable de entorno PATH, para que el shell encuentre los programas de MySQL apropiadamente. Consulte Apndice E, Variables de entorno. scripts Este directorio contiene el script mysql_install_db utilizado para inicializar la base de datos mysql, que contiene las tablas que almacenan los permisos de acceso al servidor. 6. Si no se ha instalado antes MySQL, se deben crear las tablas de permisos:
shell> scripts/mysql_install_db --user=mysql
Si se ejecuta el comando como usuario root, se debe emplear la opcin --user tal como se muestra. El valor de la opcin debe ser el nombre de la cuenta de usuario creada en el primer paso, para permitir que el servidor se ejecute. Si se ejecuta el comando habiendo iniciado sesin como este ltimo usuario, se puede omitir la opcin --user. Despues de crear o actualizar la tabla de permisos, habr que reiniciar el servidor manualmente. 7. Se debe cambiar el propietario de los programas binarios a root y el propietario del directorio de datos al que se cre para ejecutar mysqld. Asumiendo que se est en el directorio de instalacin (/usr/local/mysql), el comando sera similar a este:
shell> chown -R root . shell> chown -R mysql data shell> chgrp -R mysql .
El primer comando cambia el atributo de propietario de los ficheros y les asigna el usuario root. El segundo cambia el atributo de propietario del directorio de datos y le asigna el usuario mysql. El tercero cambia el atributo de grupo, asignndolo al grupo mysql. 8. Si se desea que MySQL se inicie automticamente durante el arranque del ordenador, debe copiarse el fichero support-files/mysql.server a la ubicacin donde se encuentran los ficheros de inicio del sistema. Puede hallarse ms informacin dentro del mismo script supportfiles/mysql.server y en Seccin 2.9.2.2, Arrancar y parar MySQL automticamente. 9. Pueden establecerse nuevas cuentas empleando el script bin/mysql_setpermission si se instalan los mdulos de Perl DBI y DBD::mysql. Para ms instrucciones consulte Seccin 2.13, Notas sobre la instalacin de Perl. 10. Si se desea utilizar mysqlaccess y la distribucin MySQL se ha instalado en una ubicacin no estndar, deber cambiarse el valor de $MYSQL, la cual es la variable que mysqlaccess utiliza
80
para saber dnde se encuentra el cliente mysql. Debe editarse el script bin/mysqlaccess aproximadamente en la lnea 18, que tiene este aspecto:
$MYSQL = '/usr/local/bin/mysql'; # ruta al ejecutable mysql
Debe modificarse la ruta para reflejar la ubicacin del sistema donde mysql se encuentra realmente. Si no se hace as, se obtendr un error Broken pipe cuando se ejecute mysqlaccess. Despus de que todo ha sido expandido e instalado, se debera probar la distribucin. El siguiente comando inicia al servidor MySQL:
shell> bin/mysqld_safe --user=mysql &
Hay ms informacin acerca de mysqld_safe en Seccin 5.1.3, El script de arranque del servidor mysqld_safe. Nota: Las cuentas que se hallan en las tablas de permisos de MySQL, en principio no estn protegidas con contraseas. Despus de iniciar el servidor se deben establecer contraseas para esas cuentas siguiendo las instrucciones en Seccin 2.9, Puesta en marcha y comprobacin despus de la instalacin.
Si se dispone de una versin de gcc lo suficientemente actualizada como para soportar la opcin fno-exceptions, es muy importante que se utilice. De lo contrario, podra obtenerse un binario que presente errores fatales aleatorios. Tambin se recomienda emplear -felide-constructors y fno-rtti junto con -fno-exceptions. En caso de duda, debe procederse as:
CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors \ -fno-exceptions -fno-rtti" ./configure \ --prefix=/usr/local/mysql --enable-assembler \ --with-mysqld-ldflags=-all-static
En la mayora de los sistemas, esto producir un binario rpido y estable. Si ocurren problemas, siempre debe emplearse mysqlbug para enviar consultas a la lista de correo MySQL. An si no se trata de un error, mysqlbug recoge informacin del sistema que ser de utilidad para quienes intenten resolver el problema. Al no usar mysqlbug se reduce la probabilidad de obtener una solucin. mysqlbug se puede hallar en el directorio bin luego de expandir la distribucin. Consulte Seccin 1.6.1.3, Cmo informar de bugs y problemas.
Esto genera un binario RPM instalable. En versiones antiguas de RPM, podra ser necesario reemplazar el comando rpmbuild con rpm. Nota: Este procedimiento no establece contraseas para las cuentas de MySQL. Despues de concluirlo, hay que dirigirse a Seccin 2.9, Puesta en marcha y comprobacin despus de la instalacin, para la configuracin y prueba posteriores a la instalacin. Esta es una versin ms detallada del procedimiento para instalar una distribucin de cdigo fuente: 1. Crear un usuario y un grupo para mysqld a fin de que pueda ejecutarse:
shell> groupadd mysql shell> useradd -g mysql mysql
Estos comandos agregan el grupo mysql y el usuario mysql. La sintaxis para useradd y groupadd puede variar ligeramente entre las distintas versiones de Unix. Tambin pueden llamarse adduser y addgroup. Si se quisiera llamar al usuario y al grupo con otro nombre en lugar de mysql, habra que substituir por el nombre apropiado en los siguientes pasos. 2. Posicionarse en el directorio en el cual se desea expandir la distribucin. 82
3. Obtener un fichero de distribucin desde uno de los sitios listados en Seccin 2.1.3, Cmo obtener MySQL. 4. Expandir la distribucin dentro del directorio actual:
shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf -
Este comando crear un directorio llamado mysql-VERSION. Con GNU tar no se necesita invocar separadamente a gunzip. Se puede usar el siguiente comando alternativo, para descomprimir y extraer la distribucin:
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
Actualmente debe configurarse y compilarse MySQL desde este directorio. No se puede compilar en un directorio diferente. 6. Configurar el release y compilar todo:
shell> ./configure --prefix=/usr/local/mysql shell> make
Al ejecutar configure, es posible que se deseen especificar algunas opciones. Ejecutar ./ configure --help para obtener la lista de las opciones disponibles. Seccin 2.8.2, Opciones tpicas de configure trata acerca de alguans de las opciones ms tiles. Si configure fallara y se enviase un mail a la lista de correo de MySQL para solicitar asistencia, deben incluirse algunas lneas del fichero config.log que en apariencia sirvan para resolver el problema. Tambin, incluir el ltimo par de lneas emitidas por configure en la pantalla. Para enviar el informe de error debe utilizarse el script mysqlbug. Consulte Seccin 1.6.1.3, Cmo informar de bugs y problemas. Si el compilador falla, consulte Seccin 2.8.4, Problemas en la compilacin de MySQL. 7. Instalar la distribucin:
shell> make install
Si se desea crear un fichero de opciones, debe utilizarse como plantilla uno de los presentes en el directorio support-files. Por ejemplo:
shell> cp support-files/my-medium.cnf /etc/my.cnf
Podra ser necesario iniciar sesin como root para ejecutar estos comandos. Si se configurar el soporte para tablas InnoDB, habr que editar el fichero /etc/my.cnf, quitar el carcter # al comienzo de las lneas de opciones que comienzan con innodb_..., y modificar los valores segn lo deseado. Consulte Seccin 4.3.2, Usar ficheros de opciones y Seccin 15.3, Configuracin de InnoDB. 8. Posicionarse en el directorio de instalacin:
shell> cd /usr/local/mysql
Si se ejecuta el comando como usuario root, se debe emplear la opcin --user tal como se muestra. El valor de la opcin debe ser el nombre de la cuenta de usuario creada en el primer
83
paso, para permitir que el servidor se ejecute. Si se ejecuta el comando habiendo iniciado sesin como este ltimo usuario, se puede omitir la opcin --user. Despues de crear o actualizar la tabla de permisos mediante mysql_install_db, habr que reiniciar el servidor manualmente. 10. Se debe cambiar el propietario de los programas binarios a root y el propietario del directorio de datos al que se cre para ejecutar mysqld. Asumiendo que se est en el directorio de instalacin (/usr/local/mysql), el comando sera similar a este:
shell> chown -R root . shell> chown -R mysql var shell> chgrp -R mysql .
El primer comando cambia el atributo de propietario de los ficheros y les asigna el usuario root. El segundo cambia el atributo de propietario del directorio de datos y le asigna el usuario mysql. El tercero cambia el atributo de grupo, asignndolo al grupo mysql. 11. Si se desea que MySQL se inicie automticamente durante el arranque del ordenador, debe copiarse el fichero support-files/mysql.server a la ubicacin donde se encuentran los ficheros de inicio del sistema. Puede hallarse ms informacin dentro del mismo script supportfiles/mysql.server y en Seccin 2.9.2.2, Arrancar y parar MySQL automticamente. 12. Pueden establecerse nuevas cuentas empleando el script bin/mysql_setpermission si se instalan los mdulos de Perl DBI y DBD::mysql. Para ms instrucciones consulte Seccin 2.13, Notas sobre la instalacin de Perl. Luego de que todo se ha instalado, se debera inicializar y probar la distribucin por medio del siguiente comando:
shell> /usr/local/mysql/bin/mysqld_safe --user=mysql &
Si este comando fallara inmediatamente y emitiera el mensaje mysqld ended, se podr encontrar ms informacin en el fichero host_name.err, localizado en el directorio de datos. Hay ms informacin acerca de mysqld_safe en Seccin 5.1.3, El script de arranque del servidor mysqld_safe. Nota: Las cuentas que se hallan en las tablas de permisos de MySQL, en principio no estn protegidas con contraseas. Despus de iniciar el servidor se deben establecer contraseas para esas cuentas siguiendo las instrucciones en Seccin 2.9, Puesta en marcha y comprobacin despus de la instalacin.
A continuacin se describen algunas de las opciones de configure ms comunes: Para compilar solamente las bibliotecas cliente y los programas cliente de MySQL, sin el servidor, debe emplearse la opcin --without-server.
shell> ./configure --without-server
Si no se dispone de un compilador de C++, no se podr compilar mysql (es el nico programa cliente que necesita de C++). En este caso, se puede quitar de configure el cdigo que comprueba la existencia del compilador C++ y luego ejecutar ./configure con la opcin -without-server. El proceso de compilacin igualmente intentar generar mysql, pero se puede
84
ignorar cualquier advertencia acerca de mysql.cc. (Si make se detiene, debe intentarse con make -k, que contina con el resto de la generacin an si ocurren errores). Si se deseara generar la biblioteca MySQL incrustada (libmysqld.a), debe utilizarse la opcin -with-embedded-server. Si no se desea que los archivos de registro (logs) y los directorios de bases de datos se ubiquen dentro de /usr/local/var, se debe emplear un comando de configure similar a este:
shell> ./configure --prefix=/usr/local/mysql shell> ./configure --prefix=/usr/local \ --localstatedir=/usr/local/mysql/data
El primer comando cambia el prefijo de instalacin de modo que todo sea instalado en /usr/ local/mysql en lugar de /usr/local. Els egundo comando conserva el prefijo de instalacin por defecto, pero reemplaza la ubicacin predeterminada de los directorios de datos (normalmente, /usr/local/var) y lo establece en /usr/local/mysql/data. Despus de haber compilado MySQL, se pueden cambiar estas opciones con ficheros de opciones. consulte Seccin 4.3.2, Usar ficheros de opciones. Si se est utilizando Unix y se desea que el socket MySQL se ubique en otro directorio que el preeterminado (normalmente en /tmp o /var/run), debe emplearse un comando configure similar a este:
shell> ./configure \ --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock
El nombre de fichero para el socket debe ser una ruta absoluta. Tambin se puede modificar la ubicacin de mysql.sock posteriormente, con un fichero de opciones MySQL. Consulte Seccin A.4.5, Cmo proteger o cambiar el fichero socket de MySQL /tmp/mysql.sock. Se se desea compilar programas con enlazado esttico (por ejemplo, para hacer una distribucin binaria, incrementar la velocidad, o solucionar problemas que ocurren con algunas distribuciones de Red Hat Linux) debe ejecutarse configure de esta manera:
shell> ./configure --with-client-ldflags=-all-static \ --with-mysqld-ldflags=-all-static
Si se est usando gcc y no se han instalado libg++ o libstdc++, se le puede indicar a configure que utilice gcc como compilador de C++:
shell> CC=gcc CXX=gcc ./configure
Cuando se emplea gcc como compilador de C++, este no intenta enlazar con libg++ o libstdc ++. Esta puede ser buena idea incluso si se dispone de estas bibliotecas, ya que algunas versiones de ellas causaron, en el pasado, problemas extraos a usuarios de MySQL. La siguiente lista presenta algunos compiladores y la configuracin de variables de entorno comnmente utilizada con cada uno. gcc 2.7.2:
CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors"
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"
85
En la mayora de los casos, podr obtenerse un binario MySQL razonablemente optimizado usando las opciones de la lista anterior, con el aadido de las siguientes opciones en la lnea de configure:
--prefix=/usr/local/mysql --enable-assembler \ --with-mysqld-ldflags=-all-static
En otras palabras, la lnea completa de configure tendra el siguiente aspecto para todas las versiones recientes 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
Los binarios provistos en el sitio Web de MySQL en http://www.mysql.com/ estn, en su totalidad, compilados con la mxima optimizacin y deberan ajustarse perfectamente a la mayora de los usuarios. Consulte Seccin 2.1.2.5, Binarios de MySQL compilados por MySQL AB. Existen algunas configuraciones que se pueden manipular para hacer un binario ms rpido an, pero se reservan para los usuarios avanzados. Consulte Seccin 7.5.4, Efectos de la compilacin y del enlace en la velocidad de MySQL. Si la generacin falla y emite mensajes de error relativos a que el compilador o el enlazador no son capaces de crear la biblioteca compartida libmysqlclient.so.# (donde '#' es un nmero de versin), se puede resolver el problema pasndole la opcin --disable-shared a configure. En este caso, configure no generar una biblioteca compartida libmysqlclient.so.#. Por defecto, MySQL emplea el conjunto de caracteres latin1 (ISO-8859-1). Para cambiar el conjunto de caracteres por defecto, se utiliza la opcin --with-charset:
shell> ./configure --with-charset=CHARSET
CHARSETpuede ser cualquiera entre los siguientes: 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, or win1251ukr. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. En MySQL 5.0 tambin puede especificarse el tipo de comparacin (collation) estndar. MySQL utiliza la comparacin latin1_swedish_ci por defecto. Para cambiar esto se emplea la opcin -with-collation:
shell> ./configure --with-collation=COLLATION
Para cambiar tanto el conjunto de caracteres como la forma de comparacin, se usan ambas opciones --with-charset y --with-collation. La forma de comparacin debe ser apropiada para el conjunto de caracteres. (Para determinar qu tipos estn disponibles para cada conjunto de carcateres se usa la sentencia SHOW COLLATION). Si se desean convertir caracteres entre el servidor y el cliente, se debera revisar la sentencia SET CHARACTER SET. Consulte Seccin 13.5.3, Sintaxis de SET. Advertencia: si se cambia el conjunto de caracteres luego de haber creado tablas, se debe ejecutar myisamchk -r -q --set-character-set=charset en cada tabla. De otro modo, los ndices podran quedar incorrectamente ordenados. (Esto puede ocurrir si se instala MySQL, se crean algunas tablas, se reconfigura MySQL para usar un conjunto de caracteres diferente, y se lo reinstala). 86
Con la opcin de configure --with-extra-charsets=LIST, pueden definirse conjuntos de caracteres adicionales para ser compilados dentro del servidor. LIST debe ser uno de los siguientes: una lista de nombres de conjuntos de caracteres separados por espacios complex - para incluir todos los conjuntos de caracteres que no pueden ser cargados dinmicamente all - para incluir en los binarios todos los conjuntos de caracteres. Para configurar MySQL con cdigo de depuracin, debe usarse la opcin --with-debug:
shell> ./configure --with-debug
Esto causa la inclusin de un asignador de memoria seguro que puede detectar algunos errores y brinda informacin de lo que est ocurriendo. Consulte Seccin D.1, Depurar un servidor MySQL. Si los programas cliente utilizan subprocesos (threads), tambin se deber compilar una versin a prueba de subprocesos (thread-safe) de la biblioteca cliente de MySQL, con la opcin de configure --enable-thread-safe-client. Esto crea una biblioteca libmysqlclient_r con la cual se podrn enlazar las aplicaciones que emplean subprocesos. Consulte Seccin 24.2.15, Cmo hacer un cliente multihilo. Ahora, a partir de MySQL 5.0.4, es posible generar a MySQL 5.0 con soporte para tablas grandes, utilizando la opcin --with-big-tables. Esta opcin tiene por efecto que las variables utilizadas para llevar la cuenta de las filas de tablas se almacenen empleando un tipo unsigned long long en lugar de unsigned long. Esto permite 32 2 32 mantener tablas con hasta aproximadamente 1.844E+19 ((2 ) ) registros en vez de 2 (~4.295E +09). Antes se haca necesario pasar al compilador el argumento -DBIG_TABLES en forma manual con el fin de habilitar la misma caracterstica. Las opciones que pertenezcan a un sistema en particular se hallan en la seccin de este manual dedicada especficamente a ese sistema. Consulte Seccin 2.12, Notas especficas sobre sistemas operativos.
En Windows, instalarlo de esta manera: Descargar e instalar Cygwin desde http://cygwin.com. Asegurarse de que gcc fue instalado bajo Cygwin. Esto se comprueba emitiendo which gcc. Si no est instalado, ejecutar el gestor de paquetes (package manager) de Cygwin, seleccionar gcc, e instalarlo.
87
Luego, editar el fichero Makefile y modificar la lnea que lee $(CC) $(CFLAGS) -o sfio lz sfio.c para que quede as:
$(CC) $(CFLAGS) -o sfio sfio.c -lz
3. Despus que el cliente gratuito BitKeeper se haya instalado, dirigirse en primer lugar al directorio desde donde se desea trabajar y utilizar el siguiente comando para hacer una copia local de la rama de MySQL 5.0:
shell> sfioball -r+ bk://mysql.bkbits.net/mysql-5.0 mysql-5.0
Normalmente, no es necesario generar la documentacin, dado que ya es suministrada en una variedad de formatos en http://dev.mysql.com/doc/. Los formatos que pueden descargarse all (HTML, PDF, etc.) estn generados diariamente, de modo que no se gana gran cosa generndola en base a los documentos en formato XML DocBook que hay en el directorio mysqldoc. Si de todos modos se deseara copiar el repositorio de documentacin, debe emplearse el siguiente comando:
shell> sfioball -r+ bk://mysql.bkbits.net/mysqldoc mysqldoc
En el ejemplo anterior, el rbol de cdigo fuente se establece dentro del subdirectorio mysql-5.0/ dentro del Si se est detrs de un firewall y solamente pueden iniciarse conexiones HTTP, BitKeeper tambin puede usarse sobre HTTP. Si se necesita usar un servidor proxy, establecer la variable de entorno http_proxy para apuntar al mismo:
shell> export http_proxy="http://your.proxy.server:8080/"
La descarga inicial del rbol de cdigo fuente puede llevar un tiempo, dependiendo de la velocidad de la conexin. Si es as, habr que tener paciencia hasta completar la descarga. 4. Para actualizar la copia local del repositorio MySQL 5.0, debe emplearse este comando:
shell> update bk://mysql.bkbits.net/mysql-5.0
5. Son necesarios: GNU make, autoconf 2.58 (o posterior), automake 1.8, libtool 1.5, y m4 para ejecutar la siguiente serie de comandos. An cuando muchos sistemas operativos vienen con su propia implementacin de make, hay muchas posibilidades de que la compilacin falle con extraos mensajes de error. Por consiguiente, es muy recomendable utilizar GNU make (a veces llamado gmake) en lugar de otros. Afortunadamente, un gran nmero de sistemas operativos se distribuyen con las herramientas GNU preinstaladas o proveen paquetes instalables de las mismas. En cualquier caso, pueden descargarse de las siguientes direcciones: http://www.gnu.org/software/autoconf/
88
http://www.gnu.org/software/automake/ http://www.gnu.org/software/libtool/ http://www.gnu.org/software/m4/ http://www.gnu.org/software/make/ Para configurar MySQL 5.0, tambin se necesitar GNU bison 1.75 o posterior. Las versiones antiguas de bison pueden producir este error:
sql_yacc.yy:#####: fatal error: maximum table size (32767) exceeded
Nota: El mensaje es: "Error fatal: se ha excedido el tamao mximo para la tabla (32767)". El tamao mximo de la tabla no est realmente excedido, el mensaje es consecuencia de errores en versiones antiguas de bison. El siguiente ejemplo muestra los comandos tpicamente requeridos para configurar un rbol de cdigo fuente. El primer comando cd es para posicionarse en el directorio de ms alto nivel en el rbol, debe reemplazarse mysql-5.0 con el nombre de directorio apropiado.
shell> shell> shell> shell> shell> shell> shell> shell> shell> cd mysql-5.0 bk -r edit aclocal; autoheader libtoolize --automake --force automake --force --add-missing; autoconf (cd innobase; aclocal; autoheader; autoconf; automake) (cd bdb/dist; sh s_all) ./configure # Add your favorite options here make
O bien puede usarse BUILD/autorun.sh como un atajo para la siguiente secuencia de comandos:
shell> shell> shell> shell> shell> aclocal; autoheader libtoolize --automake --force automake --force --add-missing; autoconf (cd innobase; aclocal; autoheader; autoconf; automake) (cd bdb/dist; sh s_all)
La lnea de comandos que cambia el directorio dentro de innobase y bdb/dist se usa para configurar los motores de almacenamiento InnoDB y Berkeley DB (BDB). Pueden omitirse si no se necesita soporte para InnoDB o BDB. Si se obtienen algunos mensajes de error extraos durante este paso, debe verificarse si verdaderamente se encuentra instalado libtool. En el subdirectorio BUILD/ se encuentra una coleccin de scripts de configuracin estndar utilizados por MySQL AB. Es posible que resulte ms conveniente utilizar el script BUILD/ compile-pentium-debug que el conjunto de comandos antes mencionado. Para compilar en una arquitectura diferente, debe modificarse el script eliminando los flags que son especficos de Pentium. 6. Cuando la generacin est concluida, debe ejcutarse make install. Debe tenerse cuidado con esto al aplicarlo en un ordenador en produccin; los comandos pueden sobreeescribir la instalacin en uso. Si hay otra instalacin de MySQL, se recomienda ejecutar ./configure con valores diferentes para las opciones --prefix, --with-tcp-port, y --unix-socket-path que aquellos empleados en el servidor en produccin. 7. Ahora se debe "jugar" con la nueva instalacin e intentar que las nuevas caractersticas colapsen con algn error. Debe comenzarse por ejecutar make test. Consulte Seccin 27.1.2, El paquete de pruebas MySQL Test.
89
8. Si se ha llegado a la etapa de make y la distribucin no se compila, debe informarse en la base de datos de errores en http://bugs.mysql.com/. Si se han instalado las ltimas versiones de las herramientas GNU necesarias, y estas caen al intentar procesar los ficheros de configuracin provistos, tambin debe informarse. Sin embargo, si se ejecuta aclocal y se obtiene un error command not found o similar, no debe informarse. En su lugar, hay que asegurarse de que todas las herramientas necesarias estn instaladas y que la variable PATH est correctamente establecida para que el shell las pueda localizar. 9. Luego de la copia inicial del repositorio (sfioball) para obtener el rbol de cdigo fuente, se debe actualizar el repositorio (update) peridicamente para obtener novedades. 10. Para examinar la historia de cambios del rbol, con todas las diferencias, puede verse el fichero BK/ChangeLog localizado en el rbol de cdigo fuente y observar las descripciones ChangeSet listadas. Para examinar una descripcin changeset en particular, se utiliza el comando sfioball para extraer dos revisiones del rbol de cdigo fuente, y luego se utiliza un comando externo diff para compararlas. En caso de hallar diferencias poco claras o tener preguntas acerca del cdigo, no debe dudarse en enviar un correo electrnico a la lista de correo internals de MySQL. Consulte Seccin 1.6.1.1, Las listas de correo de MySQL. Asimismo, si se considera que se tiene una mejor idea sobre cmo realizar algo, debe enviarse un mensaje de correo a la misma lista con la correccin. 11. El cliente gratuito BitKeeper es ditribuido con su cdigo fuente. La nica documentacin disponible para el cliente gratuito es el propio cdigo fuente. Tambin pueden verse cambios, comentarios y cdigo fuente a travs de la Web. Para ver esta informacin en el caso de MySQL 5.0, dirigirse a http://mysql.bkbits.net:8080/mysql-5.0.
Alternativamente, puede utilizarse make distclean. La siguiente lista enumera los problemas ms comunes al compilar MySQL: Si se obtienen errores como los que se muestran cuando se compila sql_yacc.cc, probablemente se trate de memoria insuficiente o espacio de intercambio insuficiente:
Internal compiler error: program cc1plus got fatal signal 11 Out of virtual memory Virtual memory exhausted
90
El problema es que gcc necesita enormes cantidades de memoria para compilar sql_yacc.cc con funciones "inline". Intntese ejecutar configure con la opcin --with-low-memory:
shell> ./configure --with-low-memory
Esta opcin causa que -fno-inline se agregue a los argumentos del compilador si se est utilizando gcc, y -O0 si se est utilizando cualquier otro. Se debera probar la opcin --with-lowmemory an si se tiene tanta cantidad de memoria de espacio de intercambio que no parece posible que sean insuficientes. Este problema se ha observado inclusive en sistemas con configuraciones de hardware generosas. y la opcin --with-low-memory usualmente lo repara. Por defecto, configure asume c++ como nombre del compilador y GNU c++ enlaza con -lg+ +. Si se est empleando gcc, tal comportamiento puede causar problemas como este durante la configuracin:
configure: error: installation or configuration problem: C++ compiler cannot create executables.
Tambin se podran observar problemas durante la compilacion relacionados con g++, libg++, o libstdc++. Una causa para estos problemas es que no se tenga g++, o quiz se tenga g++ pero no libg++, o libstdc++. Se debe inspeccionar el fichero config.log. Este debera contener el motivo exacto por el cual el compilador de C++ no est funcionando. Para eludir estos problemas, se puede utilizar gcc como compilador de C++. Debe ponerse en la variable de entorno CXX el valor "gcc -O3". Por ejemplo:
shell> CXX="gcc -O3" ./configure
Esto funciona porque gcc compila cdigo C++ tan bien como g++, pero no enlaza por defecto con las bibliotecas libg++ o libstdc++. Otra forma de solucionar el problema es instalar g++, libg++, y libstdc++. Sin embargo, se recomiendo no emplear libg++ o libstdc++ con MySQL porque slo incrementar el tamao del ejecutable sin obtener ningn beneficio. Algunas versiones de estas bibliotecas tambin han causado en el pasado problemas extraos a los usuarios de MySQL. Si la compilacin fallara por errores como cualquiera de los siguientes, se debe actualizar la versin de make a GNU make:
making all in mit-pthreads make: Fatal error in reader: Makefile, line 18: Badly formed macro assignment
O bien:
make: file `Makefile' line 18: Must be a separator (:
O bien:
pthread.h: No such file or directory
Se sabe que los programas make de Solaris y FreeBSD son problemticos. La versin 3.75 de GNU make funciona correctamente. Si se desean definir flags para ser usados por los compiladores de C o C++, se debe hacer agregando los flags a las variables de entorno CFLAGS y CXXFLAGS. De este mismo modo pueden especificarse los nombres del compilador utilizando CC y CXX. Por ejemplo:
shell> CC=gcc shell> CFLAGS=-O3
91
Consulte Seccin 2.1.2.5, Binarios de MySQL compilados por MySQL AB para una lista de definiciones de flags que han resultado tiles en varios sistemas. Si se obtiene un mensaje de error como este, se necesitar actualizar el compilador gcc:
client/libmysql.c:273: parse error before `__attribute__'
gcc 2.8.1 funciona correctamente, pero se recomienda utilizar gcc 2.95.2 o egcs 1.0.3a en su lugar. Si se obtienen errores como los siguientes al compilar mysqld, configure no est detectando correctamente el tipo del ltimo argumento pasado a accept(), getsockname(), o 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);
Para corregir esto, debe modificarse el fichero config.h (el cual es generado por configure). Deben buscarse estas lneas:
/* Define as the base type of the last arg to accept */ #define SOCKET_SIZE_TYPE XXX
Hay que cambiar XXX por size_t o int, dependiendo del sistema operativo. (Tener en cuenta que esto debe hacerse cada vez que se ejecuta configure, porque este regenera el fichero config.h.) El fichero sql_yacc.cc se genera a partir de sql_yacc.yy. Normalmente el proceso de compilacin no necesita crear sql_yacc.cc, porque MySQL viene con una copia ya generada. Sin embargo, si se necesita crearlo de nuevo, se podra hallar este error:
"sql_yacc.yy", line xxx fatal: default action causes potential...
Este es un sntoma de que se posee una versin deficiente de yacc. Posiblemente se necesite instalar en su lugar bison (la versin GNU de yacc). En Linux Debian 3.0, se necesita instalar gawk en lugar del predeterminado mawk si se desea compilar MySQL 5.0 con soporte para Bases de Datos Berkeley. Si se necesita depurar mysqld o un cliente MySQL, ejecutar configure con la opcin --withdebug, luego recompilar y enlazar los clientes con la nueva biblioteca. Consulte Seccin D.2, Depuracin de un cliente MySQL. Si se obtiene un error de compilacin en Linux (por ejemplo, en Linux SuSE 8.1 o Linux RedHat 7.2) similar a los siguientes:
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
Por defecto, el script configure intenta determinar el nmero correcto de argumentos empleando g++, el compilador C++ GNU. Este proceso arroja resultados incorrectos si no est instalado g++. Hay dos formas de solucionar esto: Asegurarse de que GNU C++ g++ est instalado. En algunas distribuciones de Linux, el paquete que se necesita se llama gpp; en otras, se llama gcc-c++.
92
Para utilizar gcc como compilador de C++ se debe poner en la variable de entorno CXX el valor gcc:
export CXX="gcc"
La generacin (building) en un directorio que no sea de cdigo fuente no est soportada cuando se usan MIT-pthreads porque se desea minimizar los cambios al cdigo. La comprobacin que determina si se utilizar MIT-pthreads sucede nicamente durante la parte del proceso de configuracin que tiene que ver con el cdigo del servidor. Si se ha configurado la distribucin empleando --without-server para generar solamente el cdigo del cliente, los clientes no saben si se est utilizando MIT-pthreads y emplean conexiones socket Unix por defecto. Dado que los ficheros socket de Unix no funcionan bajo MIT-pthreads en algunas plataformas, esto significa que se deber utilizar -h o --host cuando se ejecuten programas cliente. Cuando se compila MySQL empleado MIT-pthreads, el bloqueo de sistema se deshabilita por defecto por razones de rendimiento. Se le puede indicar al servidor que emplee bloqueo de sistema con la opcin --external-locking. Esto es necesario solamente si se desea poder ejecutar dos servidores MySQL sobre los mismos ficheros de datos, lo cual no es recomendable. Algunas veces, el comando bind() de pthread falla al adosarse a un socket sin emitir mensajes de error (al menos en Solaris). El resultado es que todas las conexiones al servidor fallan. Por ejemplo:
shell> mysqladmin version mysqladmin: connect to server at '' failed; error: 'Can't connect to mysql server on localhost (146)'
La solucin a esto es finalizar el servidor mysqld y reiniciarlo. Esto ha ocurrido solamente cuando se ha detenido el servidor por la fuerza y se lo ha reiniciado inmediatamente. Con MIT-pthreads, la llamada de sistema sleep() no es interrumpida con SIGINT (interrupcin). Esto solamente es perceptible cuando se ejecuta mysqladmin --sleep. Se debe esperar a que la llamada sleep() termine antes de que el pedido de interrupcin sea atendido y el proceso se detenga. Durante el enlazado, se pueden recibir mensajes de advertencia como los siguientes (al menos en Solaris); deben ser ignorados.
93
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
No se ha podido hacer funcionar readline con MIT-pthreads. (Esto no es necesario, pero podra ser de inters para alguien).
94
proceder segn Seccin 2.8.6.2, Crear un paquete de cdigo fuente Windows a partir de la ltima fuente de desarrollo. Si algo no funciona como se esperaba, o se tienen sugerencias para hacer respecto a formas de mejorar el actual proceso de compilacin en Windows, debe enviarse un mensaje a la lista de correo win32. Consulte Seccin 1.6.1.1, Las listas de correo de MySQL.
95
Si se desean compilar otros clientes y enlazarlos con MySQL, se deberan tambin crear varios directorios adicionales:
C:\> C:\> C:\> C:\> mkdir mkdir mkdir mkdir C:\mysql\include C:\mysql\lib C:\mysql\lib\debug C:\mysql\lib\opt
Las pruebas de rendimiento requieren soporte para Perl. Consulte Seccin 2.13, Notas sobre la instalacin de Perl. 2. Desde el directorio workdir, deben copiarse dentro de C:\mysql los siguientes directorios:
C:\> cd \workdir C:\workdir> copy client_release\*.exe C:\mysql\bin C:\workdir> copy client_debug\mysqld.exe C:\mysql\bin\mysqld-debug.exe C:\workdir> xcopy scripts\*.* C:\mysql\scripts /E C:\workdir> xcopy share\*.* C:\mysql\share /E
Si se desean compilar otros clientes y enlazarlos a MySQL, tambin se deberan copiar varias bibliotecas y ficheros de cabecera:
C:\workdir> C:\workdir> C:\workdir> C:\workdir> C:\workdir> C:\workdir> C:\workdir> C:\workdir> 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
Configurar e iniciar el servidor del mismo modo que para la distribucin binaria para Windows. Consulte Seccin 2.3, Instalar MySQL en Windows.
2.8.6.2. Crear un paquete de cdigo fuente Windows a partir de la ltima fuente de desarrollo
Para crear un paquete de cdigo fuente Windows a partir del rbol BitKeeper actual, deben seguirse las siguientes instrucciones. Este procedimiento debe llevarse a cabo en un sistema con Unix o un sistema operativo estilo Unix. Por ejemplo, este procedimiento funciona bien en Linux. 1. Copiar el rbol de cdigo fuente BitKeeper para MySQL 5.0. Para ms informacin sobre cmo copiar el rbol de cdigo fuente, consulte las instrucciones en Seccin 2.8.3, Instalar desde el rbol de cdigo fuente de desarrollo. 2. Configurar y generar la distribucin de modo que se tenga un servidor ejecutable para trabajar con l. Una forma de lograr esto es ejecutar el siguiente comando en el directorio de ms alto nivel del rbol de cdigo fuente:
shell> ./BUILD/compile-pentium-max
3. Luego de asegurarse que el proceso de generacin se complet con xito, ejecutar el siguiente script en el directorio de ms alto nivel del rbol de cdigo fuente:
96
shell> ./scripts/make_win_src_distribution
Este script crea un paquete de cdigo fuente Windows para ser usado en un sistema Windows. Se le pueden pasar diferentes opciones al script segn las necesidades que se tengan. El script acepta las siguientes opciones: --help Muestra un mensaje de ayuda. --debug Imprime informacin acerca de las operaciones que realiza el script, sin crear el paquete. --tmp Especifica una ubicacin temporal. --suffix Sufijo para el nombre del paquete. --dirname Nombre del directorio (intermedio) para copiar ficheros. --silent No imprime la lista de ficheros procesados. --tar Crea un paquete tar.gz en lugar de uno .zip. Por defecto, make_win_src_distribution crea un fichero en formato Zip con el nombre mysql-VERSION-win-src.zip, donde VERSION es la versin del rbol de cdigo fuente. 4. Copiar o subir al ordenador Windows el paquete de cdigo fuente Windows que se acaba de crear. Para compilarlo, utilizar las instrucciones en Seccin 2.8.6.1, Generar MySQL usando VC++.
my_global.h incluye cualquier otro fichero necesario para compatibilidad con Windows (como windows.h) si el programa se compilar en Windows. Se puede enlazar el cdigo con la biblioteca dinmica libmysql.lib, la cual es solamente un wrapper para cargar libmysql.dll sobre demanda, o con la biblioteca esttica mysqlclient.lib. Las bibliotecas cliente de MySQL estn compiladas como bibliotecas con uso de subprocesos, por lo tanto el cdigo del usuario tambin debera ser multi-hilo.
las plataformas, una cuestin importante de seguridad es que, inicialmente, las cuentas en las tablas de permisos no tienen contraseas. Se deberan asignar contraseas para evitar accesos no autorizados al servidor MySQL. Se pueden crear tablas de zonas horarias (time zone) para habilitar el reconocimiento de zonas horarias con nombre. (Actualmente, estas tablas solamente pueden llenarse en Unix. Este problema ser revisado pronto en Windows). Las siguientes secciones incluyen procedimientos de pos-instalacin que son especficos de sistemas Windows y Unix. Otra seccin, Seccin 2.9.2.3, Arrancar y resolver problemas del servidor MySQL, se aplica a todas las plataformas; describe que hacer si ocurren problemas al tratar de iniciar el servidor. Seccin 2.9.3, Hacer seguras las cuentas iniciales de MySQL tambin se aplica a todas las plataformas. Se deberan seguir estas instrucciones para asegurarse de que las cuentas MySQL estn correctamente protegidas mediante contraseas. Cuando se est listo para crear cuentas de usuario adicioniales, se podr encontrar informacin sobre el sistema de control de acceso de MySQL y administracin de cuentas en Seccin 5.6, El sistema de privilegios de acceso de MySQL y Seccin 5.7, Gestin de la cuenta de usuario MySQL.
Si se est empleando una versin de Windows que soporta servicios, y se desea que el servidor se ejecute automticamente al iniciarse Windows, consulte Seccin 2.3.12, Arrancar MySQL como un servicio de Windows.
98
BASEDIR muy probablemente se reemplace por algo similar a /usr/local/mysql o /usr/ local. Los siguientes pasos asumen que se est en este directorio. 2. De ser necesario, ejecutar el programa mysql_install_db para establecer las tablas de permisos MySQL iniciales, las que contienen los privilegios que determinan qu usuarios estn autorizados a conectarse al servidor. Habr que ejecutarlo si se utiliz una distribucin que no lo hace automticamente. Por lo general, mysql_install_db slo requiere ser ejecutado la primera vez que se instala MySQL, de modo que este paso puede obviarse si se est actualizando una instalacin existente. No obstante, mysql_install_db no sobreescribe ninguna tabla, por lo tanto, es seguro utilizarlo en cualquier circunstancia. Para inicializar las tablas de permisos se utilizar uno de los siguientes comandos, dependiendo de si mysql_install_db se encuentra en el directorio bin o scripts:
shell> bin/mysql_install_db --user=mysql shell> scripts/mysql_install_db --user=mysql
El script mysql_install_db crea el directorio de datos, la base de datos mysql que almacena todos los privilegios para el servidor, y la base de datos test que puede emplearse para probar MySQL. El script tambin crea entradas en la tabla de permisos para la cuenta root y la cuenta de usuario annimo. Las cuentas no estn protegidas por contrasea en un principio. Una descripcin de los permisos que tienen se encuentra en Seccin 2.9.3, Hacer seguras las cuentas iniciales de MySQL. Brevemente, estos privilegios le permiten al usuario root de MySQL hacer cualquier
99
cosa, y le permiten a cualquier usuario de MySQL crear o utilizar bases de datos cuyo nombre sea test o comience con test_. Es importante asegurarse de que los directorios y ficheros de bases de datos tienen como propietario a la cuenta de inicio de sesin mysql, para que el servidor tenga acceso de lectura y escritura a los mismos. Para cerciorarse de esto, si mysql_install_db se ejecuta mientras se est como root del sistema operativo, hay que usar la opcin --user como se muestra. En otro caso, el script se deber ejecutar mientras se est como usuario mysql del sistema operativo, en cuyo caso se puede omitir la opcin --user. mysql_install_db crea varias tablas en la base de datos mysql, incluyendo user, db, host, tables_priv, columns_priv, y func, entre otras. Consulte Seccin 5.6, El sistema de privilegios de acceso de MySQL para una descripcin completa. Si no se desea tener la base de datos test, se la puede eliminar con mysqladmin -u root drop test luego de iniciar el servidor. Si ocurren problemas con mysql_install_db, consulte Seccin 2.9.2.1, Problemas en la ejecucin de mysql_install_db. Hay algunas alternativas para ejecutar el script mysql_install_db que se provee con la distribucin de MySQL: Si se desea que los privilegios iniciales sean diferentes de los establecidos por defecto, se puede modificar mysql_install_db antes de ejecutarlo. Sin embargo, es preferible utilizar GRANT y REVOKE para modificar los privilegios despus que las tablas de permisos se hayan creado. En otras palabras, se puede ejecutar mysql_install_db, y posteriormente emplear mysql -u root mysql para conectarse al servidor como usuario root de MySQL y aplicar las sentencias GRANT y REVOKE que sean necesarias. Si se desea instalar MySQL en varios ordenadores con los mismos privilegios, se pueden colocar las sentencias GRANT y REVOKE en un fichero y ejecutarlo como un script utilizando mysql despus de ejecutar mysql_install_db. Por ejemplo:
shell> bin/mysql_install_db --user=mysql shell> bin/mysql -u root < your_script_file
De este modo se evita teclear las sentencias en cada ordenador. Es posible regenerar las tablas de permisos completamente aunque ya estn creadas. Se puede necesitar esto si se est aprendiendo a usar GRANT y REVOKE y se han hecho tantas modificaciones tras la ejecucin de mysql_install_db que se desea vaciar las tablas de permisos y comenzar de nuevo. Para regenerar las tablas de permisos, eliminar todos los ficheros .frm, .MYI, y .MYD en el directorio que contiene la base de datos mysql. (Este es el directorio llamado mysql dentro del directorio de datos, el cual aparece listado como el valor datadir cuando se ejecuta mysqld --help.) Luego debe ejecutarse nuevamente el script mysql_install_db Se puede iniciar mysqld manualmente utilizando la opcin --skip-grant-tables e ingresar los permisos manualmente utilizando mysql:
shell> bin/mysqld_safe --user=mysql --skip-grant-tables & shell> bin/mysql mysql
Desde mysql, ejecutar manualmente los comandos contenidos en mysql_install_db. Al finalizar hay que asegurarse de ejecutar mysqladmin flush-privileges o mysqladmin reload para indicarle al servidor que lea nuevamente las tablas de permisos. Ntese que al no utilizar mysql_install_db, no solamente hay que cargar manualmente el contenido de las tablas de permisos, sino que tambin hay que crearlas primero. 100
Es importante que el servidor MySQL sea ejecutado utilizando una cuenta de sistema operativo sin privilegios (distinta a root). Para cerciorarse de esto, se debe usar la opcin --user si se ejecuta mysql_safe habiendo iniciado sesin del sistema operativo como root. En otro caso, se debera ejecutar el script mientras se ha iniciado sesin como mysql, en cuyo caso se puede omitir la opcin --user. Mayores instrucciones para ejecutar MySQL como un usuario sin privilegios se encuentran en Seccin A.3.2, Cmo ejecutar MySQL como usuario normal. Si se omite la creacin de las tablas de permisos antes de llegar a este paso, aparecer el siguiente mensaje en el fichero de registro de error cuando se inicie el servidor:
mysqld: Can't find file: 'host.frm'
Si ocurren otros problemas al iniciar el servidor, consulte Seccin 2.9.2.3, Arrancar y resolver problemas del servidor MySQL. 4. Utilizar mysqladmin para verificar que el servidor se encuentra en ejecucin. Los siguientes comandos proporcionan formas simples de saber si el servidor est activo y responde a conexiones:
shell> bin/mysqladmin version shell> bin/mysqladmin variables
La salida producida por mysqladmin version vara dependiendo de la plataforma y la versin de MySQL, pero debera ser similar a esto:
shell> bin/mysqladmin version mysqladmin Ver 8.41 Distrib 5.0.9-beta, for pc-linux-gnu on i686 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 UNIX socket Uptime: 5.0.9-beta-Max 10 Localhost via UNIX socket /var/lib/mysql/mysql.sock 14 days 5 hours 5 min 21 sec
Threads: 1 Questions: 366 Slow queries: 0 Opens: 0 Flush tables: 1 Open tables: 19 Queries per second avg: 0.000
Para ver qu otras tareas pueden hacerse con mysqladmin, se lo debe invocar con la opcin -help. 5. Verificar que se pueda detener el servidor:
shell> bin/mysqladmin -u root shutdown
6. Verificar que se pueda reiniciar el servidor. Hacerlo mediante mysqld_safe o invocando directamente a mysqld. Por ejemplo:
shell> bin/mysqld_safe --user=mysql --log &
Si mysqld_safe fallara, consultar Seccin 2.9.2.3, Arrancar y resolver problemas del servidor MySQL. 7. Ejecutar algunas pruebas sencillas para comprobar que se puede traer informacin desde el servidor. La salida debera ser similar a lo que se muestra aqu:
shell> bin/mysqlshow
101
+-----------+ | Databases | +-----------+ | mysql | | test | +-----------+ shell> bin/mysqlshow mysql Database: mysql +---------------------------+ | Tables | +---------------------------+ | columns_priv | | db | | func | | help_category | | help_keyword | | help_relation | | help_topic | | host | | proc | | procs_priv | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+ shell> bin/mysql -e "SELECT Host,Db,User FROM db" mysql +------+--------+------+ | host | db | user | +------+--------+------+ | % | test | | | % | test_% | | +------+--------+------+
8. Hay un conjunto de pruebas de rendimiento en el directorio sql-bench (dentro del directorio de instalacin de MySQL) que puede utilizarse para comparar el desempeo de MySQL en distintas plataformas. Este conjunto de pruebas est escrito en Perl. Utiliza el mdulo Perl DBI para proporcionar una interface independiente de la base de datos a varias bases de datos, y algunos otros mdulos adicionales de Perl tambin son requeridos para ejecutar las pruebas. Se deben tener los siguientes mdulos instalados:
DBI DBD::mysql Data::Dumper Data::ShowTable
Estos mdulos pueden ser obtenidos desde CPAN (http://www.cpan.org/). Tambin, consulte Seccin 2.13.1, Instalacin de Perl en Unix. El directorio sql-bench/Results contiene los resultados de muchas ejecuciones a travs de diferentes bases de datos y plataformas. Para ejecutar todos los tests, deben introducirse estos comandos:
shell> cd sql-bench shell> perl run-all-tests
Si no se encuentra el directorio sql-bench, probablemente se ha instalado MySQL empleando otros ficheros RPM que no son el RPM de cdigo fuente (El RPM de cdigo fuente incluye el directorio de pruebas de rendimiento sql-bench) En este caso, se deber primero instalar el conjunto de pruebas de rendimiento antes de poder utilizarlo. Para MySQL 5.0, hay un RPM separado con pruebas de rendimiento llamado mysql-bench-VERSION-i386.rpm que contiene el cdigo de prueba y los datos.
102
Si se posee una distribucin de cdigo fuente, tambin hay pruebas en su subdirectorio tests. Por ejemplo, para ejecutar auto_increment.tst, debe ejecutarse este comando desde el directorio de ms alto nivel en la distribucin de cdigo fuente:
shell> mysql -vvf test < ./tests/auto_increment.tst
El resultado esperado del test se encuentra en el fichero ./tests/auto_increment.res. 9. En este punto, se debera tener el servidor en funcionamiento. Sin embargo, ninguna de las cuentas iniciales de MySQL tiene una contrasea, as que se les debe asignar empleando las instrucciones halladas en Seccin 2.9.3, Hacer seguras las cuentas iniciales de MySQL. En MySQL 5.0, el procedimiento de instalacin crea zonas horarias en la base de datos mysql. No obstante, se deben llenar las tablas en forma manual. Las instrucciones para hacerlo se encuentran en Seccin 5.9.8, Soporte de zonas horarias en el servidor MySQL.
Esta seccin detalla problemas que podran hallarse cuando se ejecute mysql_install_db: mysql_install_db falla al instalar las tablas de permisos mysql_install_db puede fallar al instalar las tablas de permisos y finalizar despues de mostrar los siguientes mensajes:
Starting mysqld daemon with databases from XXXXXX mysqld ended
En tal caso, se debe examinar el fichero de registro de errores muy cuidadosamente. El registro podra hallarse en el directorio XXXXXX con un nombre similar al mensaje de error, y debera indicar el motivo por el que mysqld no se inici. Si no fuera de ayuda, habr que enviar un informe de error incluyendo el texto del registro. Consulte Seccin 1.6.1.3, Cmo informar de bugs y problemas. Ya hay un proceso mysqld en ejecucin Esto indica que el servidor se est ejecutando, en cuyo caso las tablas de permisos probablemente ya se crearon. De ser as, no es necesario ejecutar mysql_install_db en absoluto, porque slo se hace una vez (cuando se instala MySQL la primera vez). No es posible instalar un segundo servidor mysqld cuando hay uno en ejecucin. Esto puede ocurrir cuando se tiene una instalacin de MySQL y se desea realizar una nueva instalacin en una ubicacin diferente. Por ejemplo, se podra tener una instalacin en produccin y crear una segunda instalacin con fines de prueba. Generalmente, el problema es que el segundo servidor intenta utilizar una interfaz de red que est siendo usada por el primero. En este caso se debera ver uno de los siguientes mensajes de error:
Can't start server: Bind on TCP/IP port: Address already in use Can't start server: Bind on unix socket...
Consulte Seccin 5.11, Ejecutar ms de un servidor MySQL en la misma mquina para ver instrucciones sobre la instalacin de mltiples servidores.
103
No se tiene acceso de escritura a /tmp Si no se tiene acceso de escritura para crear ficheros temporales o un fichero de socket Unix en la ubicacin por defecto (el directorio /tmp), ocurrir un error al ejecutar mysql_install_db o el servidor mysqld. Se pueden especificar distintos directorios temporales y ubicaciones para ficheros socket de Unix ejecutando los siguientes comandos antes de iniciar mysql_install_db o mysqld:
some_tmp_dir debera ser la ruta completa a algn directorio para el cual se tenga permiso de escritura. Luego de hacer esto se debera estar en condiciones de ejecutar mysql_install_db e iniciar el servidor con estos comandos:
shell> bin/mysql_install_db --user=mysql shell> bin/mysqld_safe --user=mysql &
Si mysql_install_db est ubicado en el directorio scripts, debe modificarse el primer comando para que diga scripts/mysql_install_db. Consulte Seccin A.4.5, Cmo proteger o cambiar el fichero socket de MySQL /tmp/ mysql.sock. Consulte Apndice E, Variables de entorno.
Para iniciar o detener el servidor manualmente empleando el script mysql.server, se lo debe invocar con los argumentos start o stop:
shell> mysql.server start shell> mysql.server stop
Antes de que mysql.server inicie el servidor, se posiciona en el directorio de instalacin de MySQL, y luego ejecuta mysqld_safe. Si se desea que el servidor se ejecute como un usuario especfico, debe agregarse la correspondiente opcin user al grupo [mysqld] del fichero de opciones / etc/my.cnf, como se muestra ms adelante en esta seccin. (Es posible que haya que editar mysql.server si se instal una distribucin binaria de MySQL en una ubicacin no estndar. La modificacin consiste en hacer cd al directorio apropiado antes de ejecutar mysqld_safe. En caso de hacer esto, tener en cuenta que la versin modificada de mysql.server puede ser sobreescrita si se actualiza MySQL en el futuro; se debera hacer una copia de la versin modificada para restaurarla.) mysql.server stop detiene el servidor mediante el envo de una seal. Tambin se lo puede detener manualmente ejecutando mysqladmin shutdown. Para iniciar y detener MySQL automticamente, se necesita agregar los comandos de inicio y detencin en los sitios apropiados de los ficheros /etc/rc*. Si se emplea el paquete RPM de servidor para Linux (MySQL-server-VERSION.rpm), el script mysql.server se instala en el directorio /etc/init.d con el nombre mysql. No se necesita instalarlo manualmente. Consulte Seccin 2.4, Instalar MySQL en Linux para ms informacin sobre los paquetes Linux RPM. Algunos vendedores proveen paquetes RPM que instalan un script de inicio con un nombre distinto, como mysqld. Si se instala MySQL desde una distribucin de cdigo fuente o mediante una distribucin binaria que no instala mysql.server automticamente, se lo puede instalar manualmente. El script se encuentra en el directorio support-files dentro del directorio de instalacin de MySQL o en el rbol de cdigo fuente de MySQL. Para instalar mysql.server manualmente, se los debe copiar en el directorio /etc/init.d con el nombre mysql, y luego hacerlo ejecutable. Esto se hace posicionndose dentro del directorio donde est mysql.server y ejecutando estos comandos:
shell> cp mysql.server /etc/init.d/mysql shell> chmod +x /etc/init.d/mysql
Los sistemas Red Hat antiguos utilizan el directorio /etc/rc.d/init.d en lugar de /etc/init.d. Los comandos anteriores deben modificarse de acuerdo a esto. Alternativamente, puede crearse primero /etc/init.d como un vnculo simblico que apunte a /etc/rc.d/init.d:
shell> cd /etc shell> ln -s rc.d/init.d .
Luego de instalar el script, los comandos necesarios para activarlo en el arranque del sistema dependen del sistema operativo. En Linux, puede utilizarse chkconfig:
shell> chkconfig --add mysql
En algunos sistemas Linux, el siguiente comando tmabin parece ser necesario para habilitar completamente al script mysql:
shell> chkconfig --level 345 mysql on
En FreeBSD, los scripts de inicio generalmente se encuentran en /usr/local/etc/rc.d/. La pgina de manual rc(8) establece que los scripts en dicho directorio se ejecutan solamente si su nombre base concuerda con el patrn de nombre de fichero shell *.sh. Cualquier otro fichero o directorio presente dentro del directorio es ignorado sin advertencias. En otras palabras, en FreeBSD, se debera instalar el script mysql.server como /usr/local/etc/rc.d/mysql.server.sh para habilitar el inicio automtico.
105
Como una alternativa a la configuracin anterior, algunos sistemas operativos tambin emplean / etc/rc.local o /etc/init.d/boot.local para iniciar servicios adicionales en el arranque del sistema. Para iniciar MySQL utilizando este mtodo, se puede agregar un comando como el siguiente al fichero de inicio apropiado:
/bin/sh -c 'cd /usr/local/mysql; ./bin/mysqld_safe --user=mysql &'
En otros sistemas operativos, consultar la documentacin para ver cmo instalar scripts de inicio. Se pueden agregar opciones a mysql.server en un fichero global /etc/my.cnf. Un tpico fichero / etc/my.cnf podra verse como este:
[mysqld] datadir=/usr/local/mysql/var socket=/var/tmp/mysql.sock port=3306 user=mysql [mysql.server] basedir=/usr/local/mysql
El script mysql.server acepta las siguientes opciones: basedir, datadir, y pid-file. Si se utilizan, deben estar en un fichero de opciones, no en la lnea de comandos. mysql.server slo acepta en la lnea de comandos las opciones start y stop. La siguiente tabla indica los grupos del fichero de opciones que son leidos por el servidor y por cada script de inicio. Script mysqld mysql.server mysqld_safe Grupos de opciones [mysqld], [server], [mysqld-versin principal] [mysqld], [mysql.server], [server] [mysqld], [server], [mysqld_safe]
[mysqld-versin principal] significa que los grupos con nombres como [mysqld-4.0], [mysqld-4.1], y [mysqld-5.0] son ledos por servidores con nmeros de versin 4.0.x, 4.1.x, 5.0.x y as sucesivamente. Esta caracterstica sirve para especificar opciones que sern ledas solamente por servidores pertenecientes a releases de una determinada serie. Por razones de compatibilidad hacia atrs, mysql.server tambin lee el grupo [mysql_server] y mysqld_safe tambin lee el grupo [safe_mysqld]. No obstante, cuando se emplee MySQL 5.0, se debera actualizar el fichero de opciones para que contenga los grupos [mysql.server] y [mysqld_safe]. Consulte Seccin 4.3.2, Usar ficheros de opciones.
106
a usar motores de almacenamiento con soporte para tablas transaccionales (InnoDB, BDB), hay que asegurarse de que se han configurado segn lo deseado antes de iniciar el servidor: Si se estn empleando tablas InnoDB, hay que remitirse a las opciones de inicio especficas. En MySQL 5.0, InnoDB utiliza valores por defecto para sus opciones de configuracin si no se indica ninguna. Consulte Seccin 15.3, Configuracin de InnoDB. Si se estn usando tablas BDB (Berkeley DB), ser necesario familiarizarse con las diferentes opciones de inicio especficas de BDB. Consulte Seccin 14.4.3, Opciones de arranque de BDB. Cuando el servidor mysqld se inicia, se posiciona en el directorio de datos. Aqu es donde espera encontrar bases de datos y donde grabar sus ficheros de registro. En Unix, tambin grabar aqu el fichero pid (process ID, o identificador de proceso). La ubicacin del directorio de datos se establece en forma fija cuando se compila el servidor. Aqu es donde, por defecto, buscar el directorio de datos. Si el mismo se encuentra en otra parte del sistema, el servidor no funcionar correctamente. Se puede conocer la ubicacin por defecto ejecutando mysqld con las opciones --verbose y --help. Si los valores por defecto no coinciden con la instalacin realizada en el sistema, se los puede sustituir especificando opciones para mysqld o mysqld_safe en la linea de comandos. Tambin se pueden colocar en un fichero de opciones. Para especificar explcitamente la ubicacin del directorio de datos, se emplea la opcin --datadir. Sin embargo, normalmente se le puede indicar a mysqld la ubicacin del directorio base donde est instalado MySQL, y el servidor buscar all el directorio de datos. Esto se hace con la opcin -basedir option. Para verificar los efectos de especificar opciones de ruta, hay que invocar mysqld con dichas opciones seguidas de --verbose y --help. Por ejemplo, posicionndose donde mysqld est instalado, y ejecutando los siguientes comandos, se vern los efectos de iniciar el servidor en el directorio base /usr/local:
shell> ./mysqld --basedir=/usr/local --verbose --help
Se pueden suministrar otras opciones, como --datadir, pero hay que tener en cuenta que -verbose y --help deben aparecer en ltimo lugar. Una vez que se haya logrado determinar la configuracin de ruta deseada, iniciar el servidor sin -verbose y --help. Si mysqld ya est ejecutndose, se puede conocer la configuracin de rutas que est usando mediante la ejecucin de este comando:
shell> mysqladmin variables
O bien:
shell> mysqladmin -h host_name variables
host_name es el nombre del host del servidor MySQL. Si se obtuviera el Errcode 13 (que significa Permission denied (permiso denegado)) al iniciar mysqld, indica que los permisos de acceso al directorio de datos o a su contenido no permiten el acceso del servidor. En este caso, hay que cambiar los permisos sobre los directorios y ficheros involucrados para que el servidor tenga derecho a usarlos. Tambin se puede iniciar el servidor bajo el usuario de sistema operativo root, pero esto puede traer aparejados problemas de seguridad y debera ser evitado. En Unix, hay que posicionarse en el directorio de datos y verificar el propietario del directorio y su contenido para asegurarse de que el servidor tiene acceso. Por ejemplo, si el directorio de datos es / usr/local/mysql/var, usar este comando:
107
Si el directorio de datos o sus ficheros o subdirectorios no tienen como propietario a la cuenta empleada para ejecutar el servidor, cambiar el propietario para que sea esa cuenta:
shell> chown -R mysql /usr/local/mysql/var shell> chgrp -R mysql /usr/local/mysql/var
Si el servidor falla en iniciarse correctamente, verificar el fichero de registro de errores para ver si se puede encontrar la causa. Los ficheros de registro se localizan en el directorio de datos (generalmente, C:\Program Files\MySQL\MySQL Server 5.0\data en Windows, /usr/local/mysql/data en una distribucin binaria de Linux, y /usr/local/var en una distribucin de cdigo fuente de Linux). Se buscan en el directorio de datos los ficheros con un nombre con la forma host_name.err y host_name.log, donde host_name es el nombre del host del servidor. Luego, examinar las ltimas lneas de estos ficheros. En Unix, puede utilizarse tail para mostrarlas:
shell> tail host_name.err shell> tail host_name.log
El registro de errores contiene informacin que indica el motivo por el cual el servidor no ha podido iniciarse. Por ejemplo, es posible ver algo como esto al examinarlo:
000729 14:50:10 000729 14:50:10 000729 14:50:10 bdb: Recovery function for LSN 1 27595 failed bdb: warning: ./test/t1.db: No such file or directory Can't init databases
Esto significa que no se inici mysqld con la opcin --bdb-no-recover y Berkeley DB hall algo incorrecto con sus propios ficheros de registro cuando intent recuperar las bases de datos. Para que sea posible continuar, habra que mover los ficheros de registro Berkeley DB antiguos desde el directorio de bases de datos a alguna otra ubicacin, donde puedan examinarse posteriormente. Los ficheros de registro BDB reciben nombres en secuencia comenzando en log.0000000001, donde el nmero se incrementa cada vez. Si se est ejecutando mysqld con soporte para tablas BDB y mysqld realiza un volcado del ncleo al inicio, podra deberse a problemas con el registro de recuperacin de BDB. En este caso, se puede intentar el inicio de mysqld con --bdb-no-recover. Si esto ayuda, entonces se deberan eliminar todos los ficheros de registro BDB del directorio de datos e intentar el inicio de mysqld nuevamente, sin la opcin --bdb-no-recover. Si ocurriese cualquiera de los siguientes errores, significa que algn otro programa (quiz otro servidor mysqld) est utilizando el puerto TCP/IP o socket Unix que mysqld intenta emplear:
Can't start server: Bind on TCP/IP port: Address already in use Can't start server: Bind on unix socket...
Utilizar ps para determinar si se tiene otro servidor mysqld en ejecucin. Si es as, detener el servidor antes de iniciar mysqld de nuevo. (si hay otro servidor ejecutndose, y realmente se desea tener mltiples servidores, se puede hallar informacin sobre cmo hacerlo en Seccin 5.11, Ejecutar ms de un servidor MySQL en la misma mquina.) Si no hay otro servidor ejecutndose, intntese ejecutar el comando telnet nombre-de-host nmero-puerto-TCP-IP. (El nmero de puerto MySQL por defecto es 3306). Luego presionar Enter un par de veces. Si no se obtiene un mensaje de error como telnet: Unable to connect to remote host: Connection refused, algn otro programa est ocupando el puerto TCP/ IP que mysqld est intentando utilizar. Se necesitar determinar qu programa es y desactivarlo, o bien indicar a mysqld que escuche en un puerto diferente mediante la opcin --port. En este caso, tambin se necesitar especificar el nmero de puerto en los programas cliente cuando se conecten al servidor a travs de TCP/IP. Otra razn por la que el puerto podra ser inaccesible es que se tenga un firewall que bloquee las conexiones a l. Si es as, modificar la configuracin del firewall para permitir el acceso a ese puerto.
108
Si el servidor se inicia pero no es posible conectarse a l, habra que cerciorarse de que se tiene una entrada en /etc/hosts que se vea as:
127.0.0.1 localhost
Estre problema ocurre solamente en sistemas que no tienen una biblioteca para trabajo con subprocesos y para los cuales MySQL debe configurarse para usar MIT-pthreads. Si no es posible iniciar mysqld, se puede generar un fichero de seguimiento para hallar el problema utilizando la opcin --debug. Consulte Seccin D.1.2, Crear ficheros de traza. Consulte Seccin 2.3.14, Resolucin de problemas en la instalacin de MySQL bajo Windows para obtener mayor informacin sobre la resolucin de problemas en instalaciones Windows.
109
Si se desea evitar que los clientes se conecten como annimos sin una contrasea, se les puede establecer contraseas o bien eliminar las cuentas annimas. Se deberan establecer contraseas para las cuentas root de MySQL. Las siguientes instrucciones describen cmo establecer contraseas para las cuentas iniciales de MySQL, primero para las cuentas annimas y luego para las cuentas root. En los ejemplos se debe reemplazar newpwd con el password que realmente se utilizar. Tambin se instruye cmo eliminar las cuentas annimas, si se prefiriera impedir completamente el acceso de usuarios annimos. Podra desearse posponer la aplicacin de contraseas hasta ms tarde, para que no sea necesario ingresarlas mientras se desarrollan tareas adicionales de configuracin o prueba. Sin embargo, hay que asegurarse de establecerlas antes de poner la instalacin en trabajo de produccin real. Para 1800 proteger con contrasea las cuentas annimas, puede emplearse tanto SET PASSWORD como UPDATE. En ambos casos, hay que asegurarse de cifrar el password utilizando la funcin PASSWORD(). Para emplear SET PASSWORD en Windows, hacer lo siguiente:
shell> mysql -u root mysql> SET PASSWORD FOR ''@'localhost' = PASSWORD('newpwd'); mysql> SET PASSWORD FOR ''@'%' = PASSWORD('newpwd');
En la segunda sentencia SET PASSWORD, debe reemplazarse host_name con el nombre del host del servidor. Este es el nombre que aparece en la columna Host del registro correspondiente a root que no es localhost en la tabla user. Si no se puede determinar el nombre de este host, utilizar la siguiente sentencia antes que SET PASSWORD:
mysql> SELECT Host, User FROM mysql.user;
Localizar el registro que tiene a root en la columna User y cualquier otro excepto localhost en la columna Host. Entonces, utilizar ese valor de Host en la segunda sentencia SET PASSWORD. La otra forma de asignar contraseas a las cuentas annimas es utilizando UPDATE para modificar directamente la tabla user. Hay que conectarse al servidor como root y emitir una sentencia UPDATE que asigne un valor a la columna Password en los registros apropiados de la tabla user. El procedimiento es igual en Windows y en Unix. La siguiente sentencia UPDATE asigna una contrasea a las dos cuentas annimas de una sola vez:
shell> mysql -u root mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd') -> WHERE User = ''; mysql> FLUSH PRIVILEGES;
Luego de actualizar las contraseas directamente en la tabla user empleando UPDATE, se le debe indicar al servidor que relea las tablas de privilegios con FLUSH PRIVILEGES. De otro modo, los cambios no tendrn efecto hasta que se reinicie el servidor. Si en lugar de lo anterior se prefiere eliminar las cuentas annimas, hay que hacer lo siguiente:
shell> mysql -u root mysql> DELETE FROM mysql.user WHERE User = ''; mysql> FLUSH PRIVILEGES;
La sentencia DELETE se aplica tanto en Windows como en Unix. En Windows, si solamente se desean remover las cuentas annimas que tengan los mismos privilegios que root, debe hacerse lo siguiente:
110
shell> mysql -u root mysql> DELETE FROM mysql.user WHERE Host='localhost' AND User=''; mysql> FLUSH PRIVILEGES;
Esta cuenta permite el acceso annimo con todos los privilegios, por lo tanto, al removerla se refuerza la seguridad. A la cuenta root se le pueden asignar contraseas en varias formas. En el tratamiento del tema que se hace a continuacin se muestran tres mtodos: Usar la sentencia SET PASSWORD Usar el programa cliente de lnea de comandos mysqladmin Usar la sentencia UPDATE Para asignar contraseas empleando SET PASSWORD, hay que conectarse al servidor como root y emitir dos sentencias SET PASSWORD, asegurndose de cifrar la contrasea con la funcin PASSWORD(). En Windows se hace as:
shell> mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd'); mysql> SET PASSWORD FOR 'root'@'%' = PASSWORD('newpwd');
En Unix, as:
shell> mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd'); mysql> SET PASSWORD FOR 'root'@'host_name' = PASSWORD('newpwd');
En la segunda sentencia SET PASSWORD, se debe reemplazar host_name con el nombre del host del servidor. Es el mismo nombre de host que se utiliz al asignar contraseas a las cuentas annimas. Para establecer contraseas en las cuentas root empleando mysqladmin, ejecutar los siguientes comandos:
shell> mysqladmin -u root password "newpwd" shell> mysqladmin -u root -h host_name password "newpwd"
Estos comandos se aplican tanto a Windows como a Unix. En el segundo comando, host_name debe reemplazarse con el nombre del host del servidor. Las comillas dobles que encierran la contrasea no son siempre necesarias, pero se las debe usar si la contrasea contiene espacios u otros caracteres que sean especiales para el intrprete de comandos. Tambin puede usarse UPDATE para modificar directamente la tabla user. La siguiente sentencia UPDATE establece una contrasea para ambas cuentas root de una sola vez:
shell> mysql -u root mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd') -> WHERE User = 'root'; mysql> FLUSH PRIVILEGES;
La sentencia UPDATE se aplica tanto a Windows como a Unix. Luego de establecer las contraseas, se las deber suministrar en cada conexin al servidor. Por ejemplo, si se desea emplear mysqladmin para detener el servidor, se debera hacer mediante este comando:
shell> mysqladmin -u root -p shutdown Enter password: (enter root password here)
Nota: En caso de olvidar la contrasea de root despues de establecerla, el procedimiento para reinicializarla se cubre en Seccin A.4.1, Cmo reiniciar la contrasea de root.
111
Para configurar nuevas cuentas, se debe usar la sentencia GRANT. Para instrucciones consulte Seccin 5.7.2, Aadir nuevas cuentas de usuario a MySQL.
112
Si ocurriesen problemas como que el nuevo servidor mysqld no se iniciara o que no fuera posible conectarse sin usar una contrasea, hay que cerciorarse de que no exista un fichero my.cnf perteneciente a la instalacin anterior. Se puede verificar con la opcin --print-defaults (por ejemplo, mysqld --print-defaults). Si ste imprimiera algo ms que el nombre del programa, significa que se tiene un fichero my.cnf an activo, que est afectando la operacin del cliente o del servidor. Es una buena idea recompilar y reinstalar el mdulo Perl DBD::mysql cada vez que se instale un nuevo release de MySQL. Lo mismo se aplica a otras interfaces con MySQL, como la extensin mysql de PHP y el mdulo MySQLdb de Python.
113
Cambio incompatible: Las tablas MyISAM e InnoDB que tengan columnas DECIMAL y se crearon con MySQL 5.0.3 a 5.0.5 aparecern corruptas tras una actualizacin a MySQL 5.0.6. Debe hacerse un volcado de dichas tablas con mysqldump antes de actualizar, y volver a generarlas luego de la actualizacin. (La misma incompatibilidad ocurrira con estas tablas si fueran creadas en MySQL 5.0.6 y se hiciera un regreso a las versiones de MySQL entre 5.0.3 y 5.0.5). Cambio incompatible: a partir de MySQL 5.0.3, el servidor ya no carga por defecto las funciones definidas por el usuario, a menos que tengan por lo menos un smbolo auxiliar (por ejemplo, un smbolo xxx_init o xxx_deinit) adems del smbolo principal de la funcin. Este comportamiento puede omitirse con la opcin --allow-suspicious-udfs. Consulte Seccin 27.2.3.6, Precauciones de seguridad en funciones definidas por usuarios. Incompatible change: El registro (log) de actualizacin fue eliminado en MySQL 5.0. Si anteriormente se lo tena habilitado, se debera habilitar el registro binario (binary log) en su lugar. Cambio incompatible: Fue quitado el soporte para el motor de almacenamiento ISAM. Si se tenan tablas ISAM, se debern convertir antes de actualizar. Por ejemplo, para convertir una tabla ISAM a fin de utilizar el motor de almacenamiento MyISAM, se emplea esta sentencia:
ALTER TABLE tbl_name ENGINE = MyISAM;
Debe emplearse una sentencia similar para cada tabla ISAM existente en las bases de datos. Cambio incompatible: Se ha quitado de MySQL 5.0 el soporte para opciones RAID en tablas MyISAM. Si se tienen tablas que utilicen estas opciones, se deberan convertir antes de actualizar. Una forma de hacerlo es realizar un volcado de la tabla con mysqldump, editar el fichero creado para eliminar todas las opciones RAID en las sentencias CREATE TABLE, y luego volver a generar las tablas a partir del fichero. Otra posibilidad es utilizar CREATE TABLE new_tbl ... SELECT raid_tbl para crear una nueva tabla a partir de la tabla RAID. Sin embargo, la parte CREATE TABLE de la sentencia debe contener suficiente informacin para regenerar los atributos de columna as como los ndices, o los atributos de columna podran perderse y los ndices no aparecer en la nueva tabla. Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE. Los ficheros .MYD para tablas RAID en una determinada base de datos, son almacenados bajo el directorio de la base de datos, en subdirectorios que tienen nombres consistentes en dos dgitos hexadecimales en el rango de 00 a ff. Luego de convertir todas las tablas que emplean opciones RAID, estos subdirectorios seguirn existiendo pero pueden eliminarse. Hay que cerciorarse de que estn vacos, y borrarlos manualmente. (Si no estn vacos, es seal de que alguna tabla RAID ha quedado sin convertir). En MySQL 5.0.6, fue modificado el registro binario de procedimientos almacenados y triggers. Este cambio incide sobre la seguridad, la replicacin, y la recuperacin de datos, como se trata en Seccin 19.3, Registro binario de procedimientos almacenados y disparadores. SQL Changes: Las columnas DECIMAL ahora se almacenan en un formato ms eficiente. Para convertir una tabla a fin de utilizar el nuevo tipo DECIMAL, se le debera aplicar una sentencia ALTER TABLE. Esta sentencia tambin cambiar las columnas VARCHAR de la tabla para que utilicen el nuevo tipo de columna VARCHAR. Para informacin acerca de posibles incompatibilidades con aplicaciones preexistentes, consulte Captulo 23, Matemticas de precisin. MySQL 5.0.3 y posteriores emplean matemtica de precisin cuando realizan clculos con valores DECIMAL (64 dgitos decimales) y para redondear nmeros de valor exacto. Consulte Captulo 23, Matemticas de precisin. A partir de MySQL 5.0.3, los espacios sobrantes no se quitan de los valores almacenados en columnas VARCHAR y VARBINARY. Las longitudes mximas para columnas VARCHAR y VARBINARY en MySQL 5.0.3 son de 65.535 caracteres y 65.535 bytes, respectivamente.
114
Nota: Si se crea una tabla con los nuevos tipos de columnas VARCHAR o VARBINARY en MySQL 5.0.3 o posterior, la tabla ser inutilizable si se regresa a una versin anterior a la 5.0.3. Debe hacerse un volcado de la tabla antes de instalar la versin anterior y volver a generarla luego. A partir de MySQL 5.0.3, BIT es un tipo de dato separado, no un sinnimo para TINYINT(1). Consulte Seccin 11.1.1, Panormica de tipos numricos. MySQL 5.0.2 incorpora varios modos SQL que permiten un control ms estricto sobre el rechazo de registros que tengan valores invlidos o perdidos. Consulte Seccin 5.3.2, El modo SQL del servidor y Seccin 1.7.6.2, Restricciones (constraints) sobre datos invlidos. Si se desea habilitar este control pero continuar usando la capacidad de MySQL para almacenar fechas incorrectas, como '2004-02-31', se debera iniciar el servidor con la opcin -sql_mode=TRADITIONAL,ALLOW_INVALID_DATES. A partir de MySQL 5.0.2, las palabras clave SCHEMA y SCHEMAS son aceptadas como sinnimos de DATABASE y DATABASES respectivamente. (Mientras que schemata es gramaticalmente correcta e incluso aparece en algunos nombres de tablas y bases de datos de sistema de MySQL 5.0, no puede ser utilizada como palabra clave en la entrada de sentencias). Las variables de usuario no son case sensitive en MySQL 5.0. En MySQL 4.1, SET @x = 0; SET @X = 1; SELECT @x; creaba dos variables y retornaba 0. En MySQL 5.0, crea una sola variable y devuelve 1. Cambios en la API de C: El flag reconnect en la estructura MYSQL es establecido en 0 por mysql_real_connect(). Solamente experimentan un cambio aquellos programas cliente que no establecen explcitamente este flag a 0 o 1 luego de mysql_real_connect(). Tener habilitada la reconexin automtica por defecto se considera muy riesgoso (debido a que los bloqueos de tablas, las tablas temporales, las variables de usuario y las variables de sesin se pierden luego de la reconexin).
Se debe ejecutar este script mientras el servidor est en ejecucin. Intenta conectarse como root al servidor en localhost. Si la cuenta root requiere una contrasea, la misma debe indicarse en la lnea de comandos. Para MySQL 5.0 la contrasea se indica de este modo:
shell> mysql_fix_privilege_tables --password=root_password
El script mysql_fix_privilege_tables ejecuta todas las acciones necesarias para convertir las tablas de permisos hacia el formato 5.0. Durante su ejecucin podran verse algunas alertas del tipo Duplicate column name, pero deben ignorarse. Despus de ejecutar el script, el servidor debe ser detenido y reiniciado. MySQL 5.0 para Windows incluye un script SQL llamado mysql_fix_privilege_tables.sql que puede ejecutarse empleando el cliente mysql. Si la instalacin de MySQL est ubicada en C: \Program Files\MySQL\MySQL Server 5.0, el comando se vera as:
C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysql -u root -p mysql
115
Si la instalacin se localizara en cualquier otro directorio, habr que ajustar la ruta apropiadamente. El comando mysql solicitar la contrasea para el usuario root; hay que ingresarla. Al igual que en el procedimiento para Unix, se podran observar algunas alertas Duplicate column name a medida que mysql procesa las sentencias en el script mysql_fix_privilege_tables.sql, pero pueden ignorarse. Luego de ejecutar el script, hay que detener y reiniciar el servidor. Si se est actualizando a MySQL 5.0.1 o posterior, el procedimiento de actualizacin de las tablas de permisos que se acaba de describir agrega columnas relacionadas con las vistas, para los privilegios CREATE VIEW y SHOW VIEW. Estos privilegios existen a nivel global y a nivel de base de datos. Sus valores iniciales se establecen de esta forma: En MySQL 5.0.2 o posterior, mysql_fix_privilege_tables copia el valor de Create_priv de la tabla user dentro de las columnas Create_view_priv y Show_view_priv. En 5.0.1, los permisos relacionados con vistas no estn habilitados para ninguna cuenta, por lo que no se puede utilizar GRANT para otorgar estos permisos a las cuentas que deban tenerlos. Para solventar esto, hay que conectarse al servidor como root y utilizar las siguientes sentencias para otorgarle estos privilegios a las cuentas root en forma manual, a travs de UPDATE:
mysql> UPDATE mysql.user SET Show_view_priv = 'Y', Create_view_priv = 'Y' -> WHERE User = 'root'; mysql> FLUSH PRIVILEGES;
Luego de esto, root se podr usar GRANT para otorgar privilegios de vistas a otras cuentas. Nota: Se deben emplear las sentencias tal como se indican; GRANT ALL no tiene efecto en los niveles global y de base de datos, porque GRANT requiere que realmente se posean los privilegios que se otorgan.
Si se desea copiar una base de datos desde un ordenador remoto a travs de una red lenta, se puede utilizar:
shell> mysqladmin create nombre_bd shell> mysqldump -h 'otro_ordenador' --opt --compress nombre_bd | mysql nombre_bd
Tambin se puede almacenar el resultado en un fichero, luego transferirlo al ordenador de destino, y cargar el fichero en la base de datos. Por ejemplo, para volcar una base de datos hacia un fichero en el ordenador de origen:
116
(El fichero creado en este ejemplo est comprimido). Se debe transferir hacia el ordenador de destino el fichero con el contenido de la base de datos y ejecutar estos comandos all:
shell> mysqladmin create nombre_bd shell> gunzip < nombre_bd.contenidos.gz | mysql nombre_bd
Tambin se puede emplear mysqldump y mysqlimport para transferir la base de datos. Para tablas grandes, esto ser mucho ms rpido que simplemente utilizar mysqldump. En los siguientes comandos, DUMPDIR representa la ruta completa al directorio donde se depositar la salida de mysqldump. En primer lugar, crear el directorio para los ficheros de salida y volcar la base de datos:
shell> mkdir DUMPDIR shell> mysqldump --tab=DUMPDIR nombre_bd
Luego, transferir los ficheros desde el directorio DUMPDIR hacia el directorio correspondiente en el ordenador de destino, y all cargar los ficheros en MySQL:
shell> mysqladmin create nombre_bd crea la base de datos shell> cat DUMPDIR/*.sql | mysql nombre_bd crea las tablas en la base de datos shell> mysqlimport nombre_bd DUMPDIR/*.txt carga los datos en las tablas # # #
Adems, no hay que olvidar copiar la base de datos mysql, porque es la que contiene las tablas de permisos. Posiblemente, los comandos en el ordenador de destino se deban ejecutar como usuario root de MySQL hasta que la base de datos mysql est en su lugar. Luego de importar la base de datos mysql en el ordenador de destino, ejecutar mysqladmin flush-privileges para que el servidor vuelva a cargar la informacin de la tabla de permisos.
117
Normalmente, el sntoma de que un cambio en el formato de las tablas era incompatible con el downgrading es que no se pueden abrir las tablas. En tal caso, utilizar el siguiente procedimiento: 1. Detener el antiguo servidor MySQL, hacia el que se est tratando de hacer el downgrading. 2. Reiniciar el nuevo servidor MySQL, desde el cual se est tratando de hacer el downgrading. 3. Volcar las tablas que aparecen inaccesibles para el antiguo servidor, empleando mysqldump para crear un fichero de volcado. 4. Detener el nuevo servidor MySQL y reiniciar el antiguo. 5. Cargar el fichero de volcado en el viejo servidor. Las tablas deberan ser accesibles.
En tal caso, hacer lo siguiente: 1. Iniciar MySQL 5.0.4 (o posterior) 2. Ejecutar mysql_fix_privilege_tables, el cual cambiar la tabla mysql.user a un formato que puedan entender tanto MySQL 4.1 como 5.0. 3. Detener el servidor MySQL. 4. Iniciar MySQL 4.1 Si el procedimiento anterior falla, el siguiente debera funcionar: 1. Iniciar MySQL 5.0.4 (o posterior). 2. Ejecutar mysqldump --opt --add-drop-table mysql > /tmp/mysql.dump. 3. Detener el servidor MySQL. 4. Iniciar MySQL 4.1 con la opcin --skip-grant. 5. Ejecutar mysql mysql < /tmp/mysql.dump. 6. Ejecutar mysqladmin flush-privileges.
118
Advertencia: Se detectaron algunos problemas extraos con Linux 2.2.14 y MySQL sobre sistemas SMP (multiprocesamiento simtrico). Tambin se tiene informacin de algunos usuarios que encontraron serios problemas de estabilidad al ejecutar MySQL con el kernel 2.2.14. Si se est empleando este kernel, se debera actualizar a la versin 2.2.19 (o posterior) o 2.4. Si se cuenta con un ordenador con mltiples CPUs, habra que considerar seriamente el uso del kernel 2.4, ya que representa un notable incremento de velocidad. Tambin es ms estable. Al emplear LinuxThreads, se debera ver un mnimo de tres procesos mysqld en ejecucin. De hecho, son hebras (threads). Uno corresponde al gestor de LinuxThreads, otro es para manejar conexiones, y uno ms para manejar advertencias y seales.
Esto puede solventarse mediante la ejecucin de mysql_install_db --force, lo cual evita que se ejecute la prueba de resolveip en mysql_install_db. La contraparte de esto es que no se pueden utilizar nombres de host en las tablas de permisos: excepto localhost, se deben usar nmeros d eIP en su lugar. Si se est utilizando una versin de MySQL que no soporta la opcin --force, se debe quitar manualmente la prueba resolveip de mysql_install empleando un editor de textos. Tambin se puede hallar el siguiente error cuando se ejecuta mysqld con la opcin --user:
getpwnam: No such file or directory
Para resolver esto, iniciar mysqld mediante el comando su en lugar de especificar la opcin -user. Esto provoca que el sistema cambie el ID de usuario del proceso mysqld, as no debe hacerlo mysqld. Otra solucin, que resuelve ambos problemas, es no usar una distribucin binaria. En su lugar se debe obtener una distribucin de cdigo fuente de MySQL (en formatos RPM o tar.gz). En algunas versiones 2.2 de Linux puede producirse el error Resource temporarily unavailable cuando los clientes establezcan un nmero elevado de nuevas conexiones TCP/IP al servidor mysqld. La razn es que Linux tiene un retraso entre el momento en que se cierra un socket TCP/IP y el momento en que el sistema lo libera realmente. Slo hay capacidad para una cantidad limitada de conexiones, por eso se produce el error de recursos no disponibles (resource-unavailable) si los clientes intentan realizar demasiadas conexiones TCP/IP en un perodo corto de tiempo. Por 119
ejemplo, este error puede verse cuando se ejecuta la prueba de rendimiento test-connect sobre TCP/IP. Se ha indagado sobre este problema en diferentes listas de correo de Linux pero nunca se ha obtenido una solucin convincente. El nico fix conocido es para clientes que emplean conexiones persistentes, o, si se estn ejecutando el servidor y los clientes en el mismo ordenador, emplear conexiones a travs de ficheros socket de Unix en lugar de conexiones TCP/IP.
120
linuxthreads con patch -p0 </tmp/linuxthreads-2.2.2.patch. Es de esperar que sea incluido de alguna forma en futuras versiones de glibc 2.2. De cualquier modo, si enlaza con glibc 2.2.2, an ser necesario corregir STACK_SIZE y PTHREAD_THREADS_MAX. Es de esperar que los valores por defecto de stos sean llevados en el futuro a un nmero ms aceptable para configuraciones MySQL de altas prestaciones, de modo que los comandos necesarios para recompilarlo se reduzcan a ./configure; make; make install. Se recomienda que se usen estos parches para producir una versin esttica, especial, de libpthread.a y emplearla solamente para enlazado dinmico con MySQL. Se sabe que los mencionados parches son seguros para MySQL y mejoran significativamente su rendimiento, pero no se puede decir nada acerca de sus efectos sobre otras aplicaciones. Enlazar otras aplicaciones que requieran LinuxThreads con la versin esttica parcheada o hacer una versin mixta e instalarla en el sistema, es por cuenta del usuario y a su riesgo. Si se experimenta cualquier problema extrao durante la instalacin de MySQL, o algunas utilidades comunes se congelan, es muy probable que est relacionado con las bibliotecas o el compilador. Si este es el caso, utilizar el binario de MySQL AB resolver el problema. Si el usuario compila sus propios programas cliente, es posible que vea los siguientes errores en tiempo de ejecucin:
ld.so.1: fatal: libmysqlclient.so.#: open failed: No such file or directory
Este problema puede evitarse de alguna de estas maneras: Enlazando clientes con el flag -Wl,r/full/path/to/libmysqlclient.so en lugar de Lpath). Copiando libmysqclient.so a la carpeta /usr/lib. Agregando la ruta del directorio donde se ubica libmysqlclient.so a la variable de entorno LD_RUN_PATH antes de ejecutar el cliente. Si se emplea el compilador Fujitsu (fcc/FCC), se puede tener algn problema al compilar MySQL porque los ficheros de cabecera de Linux estn muy orientados a gcc. La siguiente lnea de configure debera funcionar con 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
121
Si se poseen ms de 16 MB de ram, se debera agregar a los scripts de inicio algo como lo siguiente (por ejemplo, mysql.server en SuSE Linux):
echo 65536 > /proc/sys/fs/file-max echo 8192 > /proc/sys/fs/dquot-max echo 1024 > /proc/sys/fs/super-max
Los comandos echo tambin pueden ejecutarse como root,desde la lnea de comandos, pero los valores establecidos se perdern la prxima vez que se reinicie el ordenador. De manera alternativa, estos parmetros pueden configurarse al inicio usando la herramienta sysctl, la cual es usada por muchas distribuciones de Linux (incluyendo SuSE Linux 8.0 y posteriores). Colocar los siguientes valores en un fichero llamado /etc/sysctl.conf:
# Incrementa algunos valores para MySQL fs.file-max = 65536 fs.dquot-max = 8192 fs.super-max = 1024
Esto elevar a 8192 el lmite del servidor para el nmero total de conexiones y ficheros abiertos. La constante STACK_SIZE de Linuxthreads controla el espacio de la pila de subprocesos en el espacio de direcciones. Necesita ser lo suficientemente grande como para brindar bastante lugar para cada pila individual de subprocesos, pero lo suficientemente pequea para mantener la pila de algunos subprocesos ejecutndose fuera de los datos globales de mysqld. Desafortunadamente, la experiencia demostr que la implementacin Linux de mmap() desasigna una regin previamente asignada (mapped), si se solicita asignar (map) una direccin actualmente en uso, poniendo a cero los datos de toda la pgina en lugar de retornar un error. De modo que la seguridad de mysqld o cualquier otra aplicacin hebrada depende de la "caballerosidad" del cdigo que crea los subprocesos. El usuario debe tomar medidas para cerciorarse que el nmero de procesos en ejecucin en cualquier momento dado es lo suficientemente bajo como para que las pilas de procesos se mantengan lejos del montn (heap) global. Con mysqld esto debera hacerse, estableciendo un valor razonable para la variable max_connections. Si el usuario compila por s mismo a MySQL, puede aplicar un parche a LinuxThreads para un mejor uso de la pila. Consulte Seccin 2.12.1.3, Notas sobre la distribucin de cdigo fuente para Linux. Si no se desea aplicar un parche a LinuxThreads, se deber establecer max_connections a un valor no mayor de 500, o incluso menos si se tienen un gran buffer de claves, grandes tablas de montn (heap tables) o alguna otra cosa que obligue a mysqld a reservar gran cantidad de memoria,o si se est ejecutando un kernel 2.2 con un parche de 2Gb. Si se est empleando la versin binaria en RPM, se puede establecer en forma segura max_connections a un valor de 1500, asumiendo que no hay grandes buffers de claves, o grandes tablas de montn (heap tables) con muchos datos. Mientras ms se reduzca STACK_SIZE en LinuxThreads, ms subprocesos podrn crearse sin problemas. Se recomiendan valores ente 128KB y 256KB. Si se utilizan muchas conexiones simultneas, puede sufrirse una caracterstica del kernel 2.2, que intenta prevenir ataques de bomba de bifurcacin (fork bomb) penalizando los procesos que bifurcan o clonan un proceso hijo. Esto provoca que MySQL no escale bien a medida que se incrementa el nmero de clientes simultneos. En sistemas con una nica CPU, esto se manifiesta a travs de lentitud en la creacin de procesos; puede llevar largo tiempo conectarse a MySQL (hasta un minuto) y puede llevar lo mismo para detenerlo. En sistemas con mltiples CPUs, se observ una cada gradual en la velocidad de las consultas a medida que aumenta el nmero de clientes. En la bsqueda de una solucin, se recibi un parche para el kernel de parte de un usuario que lo necesit para su sitio web. Este parche puede descargarse de http://www.mysql.com/Downloads/Patches/linux-fork.patch.
122
MySQL AB prob ampliamente este parche tanto en sistemas en desarrollo como en produccin. Funcion incrementando notablemente el rendimiento de MySQL sin causas problemas, por lo tanto se lo recomienda a los usuario que an ejecuten servidores de altas prestaciones en kernels 2.2. Este problema se resolvi en el kernel 2.4, de modo que si no se est satisfecho con el rendimiento actual del sistema, en lugar de aplicar un parche al kernel 2.2, podra ser ms sencillo actualizarlo a 2.4. En sistemas SMP (multiprocesamiento simtrico), la actualizacin tambin favorecer el desempeo de SMP adems de corregir el error. Al probar MySQL con un kernel 2.4 en un ordenador de dos procesadores, se hall que MySQL escala mucho mejor. Hasta 1,000 clientes prcticamente no se producen retrasos en el rendimiento de las consultas, y el factor de escalado de MySQL (calculado como el mximo rendimiento respecto al rendimiento de un cliente) fue 180%. Se observaron resultados similares en un ordenador de cuatro procesadores: hasta 1,000 clientes prcticamente no se producen retrasos en el rendimiento de las consultas, y el factor de escalado de MySQL fue de 300%. Al basarse en estos resultados, definitivamente se recomienda que los servidores de alta prestacin ejecutando un kernel 2.2 se actualicen a 2.4. A fin de obtener el mximo rendimiento, es esencial ejecutar el proceso mysqld con la prioridad ms alta posible en kernel 2.4. Esto puede lograrse agregando un comando renice -20 $$ a mysqld_safe. En las pruebas sobre un ordenador de 4 procesadores, el aumento de la prioridad produjo un 60% de incremento en el rendimiento con 400 clientes. En la actualidad, MySQL AB se halla recolectando informacin sobre el desempeo de MySQL sobre un kernel 2.4 en sistemas de cuatro y ocho procesadores. Si se tiene acceso a tales sistemas, y se han hecho algunas pruebas de rendimiento, por favor envese un mensaje de correo electrnico a <benchmarks@mysql.com> con los resultados. Estos sern revisados para su inclusin en este manual. Si con ps se advierte un proceso mysqld muerto, generalmente significa un error en MySQL o una tabla corrupta. Consulte Seccin A.4.2, Qu hacer si MySQL sigue fallando (crashing). Para que se genere un volcado de ncleo en Linux cuando mysqld finalice imprevistamente con una seal SIGSEGV, debe iniciarse mysqld con la opcin --core-file. Tambin es probable que se necesite aumentar el espacio para el fichero de volcado de ncleo mediante el agregado de ulimit -c 1000000 a mysqld_safe o iniciando mysqld_safe con --core-file-size=1000000. Consulte Seccin 5.1.3, El script de arranque del servidor mysqld_safe.
123
Simplemente hay que hacer lo que el mensaje dice (Error de sintaxis en sched.h. Cambie _P a __P en el fichero /usr/include/sched.h) Agregar un carcter de subrayado adicional al nombre de macro _P que tiene solamente uno, y reintentar. Pueden aparecer algunas advertencias durante la compilacin. Las que se listan a continuacin, pueden ignorarse:
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'
Si mysqld realiza siempre un volcado de ncleo al iniciarse, el problema puede estar en una versin antigua de /lib/libc.a. Debe intentarse renombrando el fichero, luego borrar sql/mysqld y ejecutar nuevamente el comando make install. Luego reintentar. Este problema se inform en algunas instalaciones de Slackware. Si se obtiene el siguiente error al enlazar mysqld, significa que la biblioteca libg++.a no se instal correctamente:
/usr/lib/libc.a(putc.o): In function `_IO_putc': putc.o(.text+0x0): multiple definition of `_IO_putc'
124
Algunos problemas conocidos al ejecutar MySQL en Linux-Alpha: La depuracin de aplicaciones multihilo como MySQL no funciona en gdb 4.18. Debe emplearse gdb 5.1 en su lugar. Si se intenta enlazar estticamente mysqld cuando se utiliza gcc, la imagen resultante realiza un volcado de ncleo al iniciarse. Esto significa que no se debe emplear --with-mysqld-ldflags=all-static con gcc.
En IA-64, los clientes binarios de MySQL utilizan bibliotecas compartidas. Esto significa que si se instala la distribucin binaria provista por MySQL AB en otra ubicacin que no sea /usr/local/ mysql, se deber agregar la ruta donde est instalado libmysqlclient.so, ya sea en el fichero / etc/ld.so.conf o en la variable de entorno LD_LIBRARY_PATH. Consulte Seccin A.3.1, Problemas al enlazar a la biblioteca de clientes MySQL.
125
El binario provisto por MySQL para Mac OS X est compilado sobre Darwin 6.3 con la siguiente lnea en configure:
CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc \ CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors \ -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql \ --with-extra-charsets=complex --enable-thread-safe-client \ --enable-local-infile --disable-shared
En este caso se debera actualizar a una versin ms reciente del compilador. Tambin podra resolverse este problema insertando la siguiente lnea en el fichero config.cache:
ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'}
Si se esta empleando Solaris en una SPARC, el compilador recomendado es gcc 2.95.2 o 3.2. Se lo puede descargar de http://gcc.gnu.org/. Hay que notar que egcs 1.1.1 y gcc 2.8.1 no funcionan confiablemente en SPARC. La lnea recomendada en configure al utilizar gcc 2.95.2 es:
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 se tiene un sistema UltraSPARC, se puede mejorar el rendimiento en un 4% agregando -mcpu=v8 -Wa,-xarch=v8plusa a las variables de entorno CFLAGS y CXXFLAGS. Si se tiene el compilador Forte 5.0 (o posterior) de Sun, se puede ejecutar configure de esta manera:
126
CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt" \ CXX=CC CXXFLAGS="-noex -mt" \ ./configure --prefix=/usr/local/mysql --enable-assembler
Para crear un binario de 64 bits con el compilador Forte de Sun, deben utilizarse las siguientes opciones de configuracin:
CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v9" \ CXX=CC CXXFLAGS="-noex -mt -xarch=v9" ASFLAGS="-xarch=v9" \ ./configure --prefix=/usr/local/mysql --enable-assembler
Para crear un binario de 64 bits para Solarios utilizando gcc, debe agregarse -m64 a CFLAGS y CXXFLAGS y quitar --enable-assembler de la linea de configure. En las pruebas de rendimiento MySQL, se obtuvo un incremento del 4% en la velocidad en una UltraSPARC cuando se utiliz Forte 5.0 en modo de 32 bits, comparado con gcc 3.2 con el flag mcpu. Si se crea un binario mysqld de 64 bits, es un 4% ms lento que el binario de 32 bits, pero puede manejar ms subprocesos y memoria. Al utilizar Solaris 10 para x86_64, cualquier sistema de ficheros (filesystem) donde se deseen almacenar ficheros InnoDB debera ser montado con la opcin forcedirectio. (Por defecto, el montaje se realiza sin esta opcin) Si no se hace de este modo, el rendimiento caer significativamente al usar el motor de almacenamiento InnoDB en dicha plataforma. Si se tienen problemas con fdatasync o sched_yield, se podrn solucionar agregando LIBS=lrt en la lnea de configure. Para compiladores anteriores a WorkShop 5.3, se podra tener que editar el script configure, cambiando esta lnea:
#if !defined(__STDC__) || __STDC__ != 1
Si se inicia __STDC__ con la opcin -Xc, el compilador de Sun no podr compilar con el fichero de cabecera pthread.h de Solaris. Esto es un error de Sun (en el compilador o en el fichero). Si mysqld emite el siguiente mensaje de error cuando se lo ejecuta, es porque se lo ha compilado con el compilador de Sun sin habilitar la opcin de multihilo -mt:
libc internal error: _rmutex_unlock: rmutex not held
Agregar -mt a CFLAGS y CXXFLAGS y recompilar. Si se est utilizando la versin SFW de gcc (que viene con Solaris 8), se debe agregar /opt/sfw/ lib a la variable de entorno LD_LIBRARY_PATH antes de ejecutar configure. Si se est empleando el gcc disponible en sunfreeware.com, pueden tenerse muchos problemas. Para evitarlo, se debera recompilar gcc y GNU binutils en el ordenador donde se los ejecutar. Si se obtiene el siguiente mensaje de error al compilar MySQL con gcc, significa que gcc no est configurado para la versin en uso 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'
Lo ms apropiado para hacer en este caso es conseguir la versin ms nueva de gcc y compilarlo con el gcc que se tiene. Al menos en Solaris 2.5, casi todas las versiones binarias de gcc tienen ficheros
127
de cabecera antiguos e inutilizables que hacen caer a todos los programas que usan subprocesos y posiblemente tambin a otros programas. Solaris no provee versiones estticas de todas las bibliotecas del sistema (libpthreads y libdl), de modo que no se puede compilar MySQL con --static. Si se intenta hacer tal cosa, se obtendr uno de los siguientes errores:
ld: fatal: library -ldl: not found undefined reference to `dlopen' cannot find -lrt
Si se enlaza con los programas cliente MySQL del usuario, se puede ver el siguiente error en tiempo de ejecucin:
ld.so.1: fatal: libmysqlclient.so.#: open failed: No such file or directory
Este problema puede evitarse por medio de alguno de estos mtodos: Enlazar clientes con el flag -Wl,r/full/path/to/libmysqlclient.so en lugar de -Lpath). Copiar libmysqclient.so al directorio /usr/lib. Antes de ejecutar el cliente, agregar a la variable de entorno LD_RUN_PATH la ruta del directorio donde se localiza libmysqlclient.so. Si ocurren problemas con configure al intentar enlazar con -lz cuando no se tiene instalado zlib, hay dos opciones: Si se desea tener la capacidad de usar el protocolo de comunicacin comprimido, se deber conseguir zlib desde ftp.gnu.org e instalarlo. Ejecutar configure con la opcin --with-named-z-libs=no cuando se compile MySQL. Si se est utilizando gcc y se tienen problemas con la carga de funciones definidas por el usuario (UDFs) en MySQL, hay que intentar agregar -lgcc a la lnea donde se enlaza la UDF. Si se desea que MySQL inicie automticamente, se debe copiar support-files/mysql.server a /etc/init.d y crear un vnculo simblico hacia l, llamado /etc/rc3.d/S99mysql.server. Si demasiados procesos intentan conectarse muy rpidamente a mysqld, se ver este error en el log de MySQL:
Error in accept: Protocol error
Se puede intentar iniciar el servidor con la opcin --back_log=50 como una forma de solucin. (Utilizar -O back_log=50 en versiones anteriores a MySQL 4). Solaris no soporta ficheros de ncleo para aplicaciones setuid(), de forma que no se lograr un fichero de ncleo a partir de mysqld si se est empleando la opcin --user.
128
definition
Si ocurre eso, puede solucionarse copiando /usr/include/widec.h a .../lib/gcc-lib/os/ gcc-version/include y cambiando la lnea 41:
#if !defined(lint) && !defined(__lint)
Colocando esta:
#if !defined(lint) && !defined(__lint) && !defined(getwc)
Como alternativa, puede editarse directamente el fichero /usr/include/widec.h. En cualquiera de las dos formas, se debe eliminar config.cache y ejecutar configure nuevamente. Si se obtienen los siguientes errores al ejecutar make, es debido a que configure no detect correctamente el fichero curses.h (probablemente a causa del error en /usr/include/widec.h):
In file included from mysql.cc:50: /usr/include/term.h:1060: syntax error before `,' /usr/include/term.h:1081: syntax error before `;'
La solucin es hacer algo de lo siguiente: Configure con CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H ./configure. Editar /usr/include/widec.h como se indic anteriormente y ejecutar de nuevo configure. Quitar la lnea #define HAVE_TERM del fichero config.h y ejecutar de nuevo make. Si el enlazador no puede hallar -lz cuando enlaza programas cliente, probablemente el problema sea que el fichero libz.so se instal en /usr/local/lib. Este problema puede resolverse con alguno de los siguientes mtodos: Agregar /usr/local/lib a LD_LIBRARY_PATH. Agregar un vnculo a libz.so desde /lib. Si se est utilizando Solaris 8, se puede instalar el opcional zlib desde el CD de distribucin del sistema operativo. Ejecutar configure con la opcin --with-named-z-libs=no cuando se compila MySQL.
Esto evita inconvenientes con la biblioteca libstdc++ y con excepciones de C++. Si esto no funciona, se deber compilar una versin de depuracin y ejecutarla con un fichero de seguimiento (trace) o bajo gdb. Consulte Seccin D.1.3, Depurar mysqld con gdb.
129
130
Si se tiene conocimiento de que configure utiliza MIT-pthreads, se debera leer las notas para MITpthreads. Consulte Seccin 2.8.5, Notas sobre MIT-pthreads. Si se obtiene un error de make install donde anuncia que no se puede hallar el fichero /usr/ include/pthreads, es porque configure no detect que se necesitan MIT-pthreads. Para solucionar este problema, debe eliminarse config.cache, y luego ejecutar nuevamente configure con la opcin --with-mit-threads. Se debe estar seguro de que la configuracin de resolucin de nombres es la correcta. De otras maneras, se pueden experimentar demoras o fallas al conectarse a mysqld. Tambin hay que verificar que sea correcta la entrada para localhost en el fichero /etc/hosts. El fichero debera comenzar con una lnea similar a esta:
127.0.0.1 localhost localhost.your.domain
Se sabe que FreeBSD tiene en forma predeterminada un lmite de manejadores de ficheros muy bajo. Consulte Seccin A.2.17, No se encontr el fichero. Hay que iniciar el servidor utilizando la opcin --open-files-limit para mysqld_safe, o elevar en el fichero /etc/login.conf el lmite para el usuario mysqld y recompilarlo con cap_mkdb /etc/login.conf. Tambin hay que asegurarse de establecer la clase apropiada de usuario en el fichero de contraseas si no se est empleando el predeterminado (utilizar chpass mysqld-user-name). Consulte Seccin 5.1.3, El script de arranque del servidor mysqld_safe. Si se dispone de mucha memoria,se podra considerar la recompilacin del kernel para permitirle a MySQL utilizar ms de 512Mb de RAM. Para ms informacin, ver la opcin MAXDSIZ en el fichero de configuracin LINT. Si se tienen problemas con la fecha actual en MySQL, podra ser de ayuda establecer al valor de la variable TZ. Consulte Apndice E, Variables de entorno.
131
Debe intentarse emplear ulimit -v 80000 y ejecutar make nuevamente. Si esto no funciona y se est utilizando bash, cambiar a csh o sh; algunos usuarios de BSDI han informado problemas con bash y el comando ulimit. Si se est empleando gcc, tambin se tendr que utilizar el flag --with-low-memory para configure para poder compilar sql_yacc.cc. Si se tienen problemas con la fecha actual en MySQL, podra ser de ayuda establecer al valor de la variable TZ. Consulte Apndice E, Variables de entorno.
Si se desea se puede cambiar la ubicacin de los directorios, o no especificar ninguna opcin para que se usen los valores predeterminados. Si se tienen problemas de rendimiento bajo un uso intensivo, intntese usar la opcin --skipthread-priority con mysqld. Esto ejecuta todos los subprocesos con la misma prioridad. En BSDI Versin 3.1, esto dar mejor rendimiento al menos hasta que BSDI mejore su programador de subprocesos. Si se obtiene el error virtual memory exhausted al compilar, se debera intentar con ulimit v 80000 y ejecutar make nuevamente. Si esto no funciona y se est utilizando bash, cambiar a csh o sh; algunos usuarios de BSDI han informado problemas con bash y el comando ulimit.
132
Esto soluciona el problema de obtener EWOULDBLOCK EWOULDBLOCK de recv() y EBADF de accept() en aplicaciones con subprocesos o hebradas (threaded). Si se est empleando gcc 2.95.1 en un sistema HP-UX 11.x sin parches, se podra obtener el siguiente error:
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:
El problema es que HP-UX no define pthreads_atfork() en forma consistente. Tiene prototipos conflictivos en /usr/include/sys/unistd.h:184 y /usr/include/sys/pthread.h:440. Una solucin es copiar /usr/include/sys/unistd.h dentro de mysql/include y editar unistd.h y cambiarlo para que coincida con la definicin en pthread.h. Hay que hallar esta lnea:
extern int pthread_atfork(void (*prepare)(), void (*parent)(), void (*child)());
133
void (*child)(void));
Si se est empleando el compilador HP-UX, se puede utilizar el siguiente comando (el cual fue probado con cc B.11.11.04):
CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure \ --with-extra-character-set=complex
Si se obtiene el siguiente error desde configure, verificar si no se tiene la ruta al compilador K&R antes que la ruta al compilador HP-UX para C y C++:
checking for cc option to accept ANSI C... no configure: error: MySQL requires an ANSI C compiler (and a C++ compiler). Try gcc. See the Installation chapter in the Reference Manual.
Otra razn que puee impedir la compilacin es que no se hayan definido los flags +DD64 tal como se ha descripto. Otra posibilidad para HP-UX 11 es emplear los binarios MySQL provistos en http://dev.mysql.com/ downloads, los cuales fueron compilados y probados por MySQL AB. Tambin se han recibido informes de que los binarios de MySQL provistos con HP-UX 10.20 se ejecutan correctamente en HPUX 11. Si se encuentran problemas, se debera verificar si HP-UX tiene todos los parches necesarios.
Estas opciones se emplean para compilar la distribucin MySQL que se encuentra en http://wwwfrec.bull.com/. Si se cambia el -O3 por -O2 en la linea de configure anterior, tambin habr que quitar la opcin qstrict. Esto es una limitacin en el compilador de C de IBM. Si se est empleando gcc o egcs para compilar MySQL, se debe utilizar el flag -fno-exceptions, porque la gestin de excepciones en gcc/egcs no es apta para subprocesos. (Esto se prob con egcs 1.1.) Tambin hay algunos problemas conocidos con el ensamblador de IBM, el cual puede generar cdigo defectuoso cuando se lo usa con gcc. Se recomienda usar la siguiente lnea de configure con egcs y gcc 2.95 en AIX:
134
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
La opcin -Wa,-many se necesita para que el proceso de compilacin tenga xito. IBM est al tanto de este problema pero no tiene urgencia por resolverlo porque hay disponible una solucin alternativa. No se sabe si -fno-exceptions se requiere con gcc 2.95, pero como MySQL no utiliza excepciones y la opcin genera cdigo ms rpido, se recomienda usarlo siempre con egcs / gcc. Si se obtiene un problema con el cdigo ensamblador, hay que cambiar la opcin -mcpu=xxx para que concuerde con la CPU del usuario. Generalmente puede necesitarse power2, power, o powerpc. O bien podra necesitarse 604 o 604e. No est confirmado, pero se sospecha que power puede muy bien ser seguro la mayora de las veces, incluso en un ordenador de 2 procesadores. Si se desconoce el tipo de CPU que se posee, ejecutar un comando uname -m. Este produce una cadena con un aspecto similar a 000514676700, con el formato xxyyyyyymmss, donde xx y ss son siempre 00, yyyyyy es un identificador nico de sistema, y mm es el identificar de la arquitectura de la CPU. La tabla con estos valores se encuentra en http://www16.boulder.ibm.com/pseries/en_US/cmds/ aixcmds5/uname.htm. Esto proporciona el tipo y modelo del ordenador que se est usando. Si se tienen problemas con seales (MySQL termina abruptamente al someterlo a carga intensiva), puede tratarse de un error del SO relacionado con subprocesos y seales. En este caso, hay que indicarle a MySQL que no utilice seales, configurndolo como sigue:
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
Esto no afecta el rendimiento de MySQL, pero tiene el efecto secundario de que no se pueden terminar procesos de clientes que estn durmiendo (sleeping) en una conexin usando mysqladmin kill o mysqladmin shutdown. El cliente terminar cuando emita su siguiente comando. En algunas versiones de AIX, el enlazado con libbind.a provoca que getservbyname() haga un volcado de ncleo. Este es un error en AIX y debera informarse a IBM. Para AIX 4.2.1 y gcc, se deben hacer los siguientes cambios. Despus de configurar, editar config.h y include/my_config.h y cambiar la lnea que dice:
#define HAVE_SNPRINTF 1
a esto:
#undef HAVE_SNPRINTF
Si se necesita asginar mucha memoria para el proceso mysqld, no basta con utilizar ulimit -d unlimited. Tambin habr que modificar mysqld_safe agregando una lnea como la siguiente:
export LDR_CNTRL='MAXDATA=0x80000000'
Se puede encontrar ms informacin acerca de usar grandes cantidades de memoria en http:// publib16.boulder.ibm.com/pseries/en_US/aixprggd/genprogc/lrg_prg_support.htm.
135
Al compilar readline, se pueden obtener advertencias sobre definiciones duplicadas. Estas pueden ignorarse. Al compilar mysqld, se producen algunas advertencias del tipo implicit declaration of function que pueden ignorarse.
Pueden ser ignoradas sin problemas. Ocurren porque configure slo puede detectar errores y no advertencias. Si se inicia el servidor directamente desde la lnea de comandos, se podra tener el problema de que finalice al terminar la sesin de usuario en el SO. (Cuando se termina la sesin, los procesos pendientes reciben una seal SIGHUP). Si eso sucede, debe intentarse iniciar el servidor de esta manera:
nohup mysqld [options] &
nohup provoca que el comando a continuacin ignore cualquier seal SIGHUP enviada desde la terminal. Alternativamente, se puede iniciar el servidor ejecutando mysqld_safe, lo cual invoca a mysqld usando nohup. Consulte Seccin 5.1.3, El script de arranque del servidor mysqld_safe. Si se tiene un problema al compilar mysys/get_opt.c, qutese la linea #define _NO_PROTO del comienzo de dicho fichero. Si se est empleando el compilador CC de Compaq, la siguiente lnea de configure debera funcionar:
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 \
136
Si al compilar mysql se tienen problemas con libtool usando bibliotecas compartidas como se indic, se puede evitar el problema empleando estos comandos:
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
Si ocurren problemas con el fichero c_asm.h, se puede crear y utilizar un fichero c_asm.h "silencioso" con:
touch include/c_asm.h CC=gcc CFLAGS=-I./include \ CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql
Tener en cuenta que los siguientes problemas con el programa ld pueden ser corregidos descargando el ltimo conjunto de parches para DEC (Compaq) desde: http://ftp.support.compaq.com/ public/unix/. En OSF/1 V4.0D y el compilador "DEC C V5.6-071 on Digital Unix V4.0 (Rev. 878)", el compilador tiene algn comportamiento extrao (smbolos asm indefinidos) /bin/ld tambin parece estar defectuoso (durante el enlazado de mysqld ocurren errores del tipo _exit undefined). En estos sistemas se opt por compilar MySQL con la siguiente lnea de configure, reemplazando /bin/ld con la versin para OSF 4.OC.
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
En algunas versiones OSF/1, la funcin alloca() est defectuosa. Esto se soluciona quitando la lnea de config.h que define 'HAVE_ALLOCA'. La funcin alloca() puede tener tambin un prototipo incorrecto en /usr/include/alloca.h. Esta advertencia resultante de esa situacin puede ignorarse. configure utiliza automticamente la siguiente libreria de subprocesos: --with-named-threadlibs="-lpthread -lmach -lexc -lc".
137
Si se tienen problemas con seales (MySQL termina abruptamente al someterlo a carga intensiva), puede tratarse de un error del SO relacionado con subprocesos y seales. En este caso, hay que indicarle a MySQL que no utilice seales, configurndolo como sigue:
CFLAGS=-DDONT_USE_THR_ALARM \ CXXFLAGS=-DDONT_USE_THR_ALARM \ ./configure ...
Esto no afecta el rendimiento de MySQL, pero tiene el efecto secundario de que no se pueden terminar procesos de clientes que estn durmiendo (sleeping) en una conexin usando mysqladmin kill o mysqladmin shutdown. El cliente terminar cuando emita su siguiente comando. Con gcc 2.95.2, se puede encontrar el siguiente error de compilacin:
sql_acl.cc:1456: Internal compiler error in `scan_region', at except.c:2566 Please submit a full bug report.
Para solucionar esto, habra que posicionarse en el directorio sql, y cortar y pegar la ltima lnea de gcc, pero cambiando -O3 por -O0 (o agregando -O0 inmediatamente despus de gcc si no se tiene ninguna opcin -O en la lnea de compilacin). Luego de hacer esto, se puede volver al directorio principal (top-level) y ejecutar nuevamente make.
Es posible que haya que quitar la definicin de algunos smbolos en config.h luego de ejecutar configure y antes de compilar. En algunas implementaciones de Irix, la funcin alloca() est defectuosa. Si el servidor mysqld termina abruptamente en algunas sentencias SELECT, debern quitarse de config.h las lneas que definen HAVE_ALLOC y HAVE_ALLOCA_H. Si mysqladmin create no funciona, habr que quitar de config.h la lnea que define HAVE_READDIR_R. Tambin es posible que haya que quitar la lnea HAVE_TERM_H. SGI recomienda que se instalen en conjunto todos los parches de esta pgina: http://support.sgi.com/ surfzone/patches/patchset/6.2_indigo.rps.html Como mnimo, se deberan instalar las ltimas versiones del kernel, de rld, y de libc. Definitivamente sern necesarios todos los parches POSIX de esta pgina, para dar soporte a pthreads: http://support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html Si se obtiene el siguiente error al compilar mysql.cc:
"/usr/include/curses.h", line 82: error(1084): invalid combination of type
Habr que teclear lo siguiente en el directorio principal del rbol de cdigo fuente de MySQL:
extra/replace bool curses_bool < /usr/include/curses.h > include/curses.h
138
make
Tambin se informaron problemas de sincronizacin (scheduling). Si slo se est ejecutando un proceso, el rendimiento es bajo. Esto se evita iniciando otro cliente. Esto puede conducir a un incremento en la velocidad de dos a diez veces de ese momento en adelante para el otro hilo. Es este un problema difcil de entender con los suprocesos de Irix; habr que improvisar para hallar soluciones hasta que sea arreglado. Si se est compilando con gcc, se puede usar el siguiente comando de configure:
CC=gcc CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql --enable-thread-safe-client \ --with-named-thread-libs=-lpthread
Lo siguiente funciona en Irix 6.5.11 con compiladores nativos Irix C y C++ versin 7.3.1.2.
CC=cc CXX=CC CFLAGS='-O3 -n32 -TARG:platform=IP22 -I/usr/local/include \ -L/usr/local/lib' CXXFLAGS='-O3 -n32 -TARG:platform=IP22 \ -I/usr/local/include -L/usr/local/lib' \ ./configure --prefix=/usr/local/mysql --with-innodb --with-berkeley-db \ --with-libwrap=/usr/local \ --with-named-curses-libs=/usr/local/lib/libncurses.a
gcc puede descargarse de ftp://ftp.sco.com/pub/openserver5/opensrc/gnutools-5.0.7Kj. Este sistema de desarrollo requiere el Suplemento del Entorno de Ejecucin de OpenServer (OpenServer Execution Environment Supplement) oss646B en OpenServer 5.0.6 y oss656B y las bibliotecas OpenSource halladas en gwxlibs. Todas las herramientas OpenSource estn en el directorio opensrc, en ftp://ftp.sco.com/pub/openserver5/opensrc/. MySQL AB recomienda utilizar el ltimo release en produccin de MySQL. SCO proporciona parches del sistema operativo en ftp://ftp.sco.com/pub/openserver5 para OpenServer 5.0.[0-6] y ftp://ftp.sco.com/pub/openserverv5/507 para OpenServer 5.0.7. SCO proporciona informacin sobre problemas de seguridad solucionados en ftp://ftp.sco.com/pub/ security/OpenServer para OpenServer 5.0.x. El mximo tamao de fichero en un sistema OpenServer 5.0.x es 2GB. La memoria total que puede direccionarse para buffers de streams, clists, y bloqueo de registros, no puede exceder de 60MB en OpenServer 5.0.x. Los buffers de streams son direccionados en pginas de 4096 bytes, los clists en pginas de 70 bytes, y los bloqueos de registros en pginas de 64 bytes, de modo que:
(NSTRPAGES * 4096) + (NCLIST * 70) + (MAX_FLCKREC * 64) <= 62914560
Seguir este procedimiento para configurar la opcin Servicios de Base de Datos (Database Services). Si no se est seguro si una aplicacin requiere esto, ver la documentacin de la aplicacin.
139
1. Iniciar sesin como root. 2. Habilitar el driver SUDS mediante la edicin del fichero /etc/conf/sdevice.d/suds. Cambiar la N del segundo prrafo por una Y. 3. Utilizar mkdev aio o el Gestor de Hardware/Kernel (Hardware/Kernel Manager) para habilitar el soporte de entrada/salida asincrnica, y enlazar nuevamente el kernel. Para permitir a los usuarios reservar memoria para usar con este tipo de E/S, actualizar el fichero aiomemlock(F). Este fichero debera actualizarse para que incluya los nombre de los usuarios que pueden utilizar ESA (Entrada Salida Asincrnica, o AIO, Asynchronoys I/O) y las mximas cantidades de memoria que pueden reservar. 4. Muchas aplicaciones usan binarios setuid de forma que solamente se necesita especificar un nico usuario. Ver la documentacin provista con la aplicacin para ver si este es su caso. Despus de completar este proceso, reiniciar el sistema para crear un nuevo kernel que incorpore estos cambios. Por defecto, las entradas en /etc/conf/cf.d/mtune estn configuradas as:
Value Default ----------NBUF 0 NHBUF 0 NMPBUF 0 MAX_INODE 0 MAX_FILE 0 CTBUFSIZE 128 MAX_PROC 0 MAX_REGION 0 NCLIST 170 MAXUP 100 NOFILES 110 NHINODE 128 NAUTOUP 10 NGROUPS 8 BDFLUSHR 30 MAX_FLCKREC 0 PUTBUFSZ 8000 MAXSLICE 100 ULIMIT 4194303 * Streams Parameters NSTREAM 64 NSTRPUSH 9 NMUXLINK 192 STRMSGSZ 16384 STRCTLSZ 1024 STRMAXBLK 524288 NSTRPAGES 500 STRSPLITFRAC 80 NLOG 3 NUMSP 64 NUMTIM 16 NUMTRW 16 * Semaphore Parameters SEMMAP 10 SEMMNI 10 SEMMNS 60 SEMMNU 30 SEMMSL 25 SEMOPM 10 SEMUME 10 SEMVMX 32767 SEMAEM 16384 * Shared Memory Parameters SHMMAX 524288 SHMMIN 1 SHMMNI 100 FILE 0 Min --24 32 12 100 100 0 50 500 120 15 60 64 0 0 1 50 2000 25 2048 1 9 1 4096 1024 4096 0 50 3 1 1 1 10 10 60 10 25 10 10 32767 16384 131072 1 100 100 Max --450000 524288 512 64000 64000 256 16000 160000 16640 16000 11000 8192 60 128 300 16000 20000 100 4194303 32768 9 4096 524288 1024 524288 8000 100 3 256 8192 8192 8192 8192 8192 8192 150 1024 25 32767 16384 2147483647 1 2000 64000
140
0 0 0
4 50 500
Se recomienda establecer estos valores de la siguiente manera: NOFILES debera ser 4096 o 2048. MAXUP debera ser 2048. Para hacer cambios al kernel, posicionarse con cd en el directorio /etc/conf/bin y utilizar ./ idtune nombre parmetro para realizar los cambios. Por ejemplo, para cambiar SEMMS a un valor de 200, ejecutar estos comandos como usuario root:
# cd /etc/conf/bin # ./idtune SEMMNS 200
Se recomienda optimizar el sistema, pero los valores a utilizar dependern del nmero de usuarios que acceden a la aplicacin o base de datos y el tamao de la base de datos (esto es, el pool de buffer utilizado). Lo siguiente modifica los parmetros de kernel definidos en /etc/conf/cf.d/ stune: SHMMAX (valor recomendado: 128MB) and SHMSEG (valor recomendado: 15). Estos parmetros inciden en el motor de base de datos MySQL para la creacin de pools de buffers de usuario). NOFILES y MAXUP deberan establecerse en por lo menos 2048. MAXPROC debera establecerse al menos en 3000/4000 (dependiendo del nmero de usuarios) o ms. Tambin se recomienda el empleo de la siguiente frmula para calcular el valor para SEMMSL, SEMMNS y SEMMNU:
SEMMSL = 13
El 13 es lo que se hall como el mejor valor para Progress y MySQL. SEMMNS = SEMMSL * cantidad de servidores de bases de datos a ejecutarse en el sistema. Establecer SEMMNS al valor de SEMMSL multiplicado por la cantidad de servidores de bases de datos (mximo) que se ejecutan en el sistema al mismo tiempo.
SEMMNU = SEMMNS
Establecer el valor de SEMMNU al mismo valor que tiene SEMMNS. Posiblemente se pueda establecer a un 75% del valor de SEMMNS, pero esta es una estimacin conservadora. Se necesitar instalar al menos las "Bibliotecas de Desarrollo de Aplicaciones y Enlazador OpenServer de SCO" ("SCO OpenServer Linker and Application Development Libraries") o el Sistema de Desarrollo de OpenServer (OpenServer Development System) para ejecutar gcc. No se puede simplemente emplear el sistema de desarrollo GCC sin instalar alguno de los mencionados. Antes se deber obtener el paquete FSU Pthreads e instalarlo. Puede descargarse de http:// moss.csc.ncsu.edu/~mueller/ftp/pub/PART/pthreads.tar.gz. Tambin puede descargarse un paquete precompilado en ftp://ftp.zenez.com/pub/zenez/prgms/FSU-threads-3.14.tar.gz. FSU Pthreads puede compilarse con SCO Unix 4.2 con tcpip, o utilizando OpenServer 3.0 u OpenDesktop 3.0 (OS 3.0 ODT 3.0) con el SCO Development System instalado utilizando un buen port de GCC 2.5.x. Hay muchos problemas que ocurren sin un buen port. El port para este producto necesita el SCO Unix Development System. Sin l, no se tendrn las bibliotecas y el enlazador que se necesitan. Tambin se requiere el fichero SCO-3.2v4.2-includes.tar.gz. Este fichero contiene los cambios a los ficheros de inclusin de SCO Development que se necesitan para lograr compilar MySQL. Habr que reemplazar los ficheros de inclusin existentes en el sistema con estos ficheros
141
de cabecera modificados. Pueden descargarse de ftp://ftp.zenez.com/pub/zenez/prgms/SCO-3.2v4.2includes.tar.gz. Todo lo que se debera necesitar para compilar FSU Pthreads es ejecutar GNU make. El Makefile en FSU-threads-3.14.tar.gz est configurado para crear FSU-threads. Se puede ejecutar ./configure en el directorio threads/src y seleccionar la opcin SCO OpenServer. Este comando copia Makefile.SCO5 a Makefile. Luego, se ejecuta make. Para instalar en el directorio predeterminado /usr/include, iniciar sesin como root, luego posicionarse con cd en el directorio thread/src y ejecutar make install. Recordar que debe usarse GNU make para crear MySQL. Nota: Si no se inicia mysqld_safe como usuario root, se deberan obtener solamente por defecto los 110 ficheros abiertos por proceso. mysqld deja constancia de esto en el fichero de registro (log). Con SCO 3.2V4.2, se debera usar FSU Pthreads versin 3.14 o posterior. El siguiente comando configure debera funcionar:
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"
Se pueden tener problemas con algunos ficheros de inclusin. En este caso, pueden hallarse nuevos ficheros de inclusin especficos para SCO en ftp://ftp.zenez.com/pub/zenez/prgms/SCO-3.2v4.2includes.tar.gz. Se debera descompactar este fichero en el directorio include del rbol de cdigo fuente de MySQL. Notas relativas a SCO development: MySQL debera detectar automticamente FSU Pthreads y enlazar mysqld con -lgthreads lsocket -lgthreads. Las bibliotecas de desarrollo SCO son reentrantes (compartidas por varios usuarios o procesos, una condicin indispensable en la programacin de multitarea) en FSU Pthreads. SCO afirma que sus bibliotecas de funciones son reentrantes, por lo tanto deben ser reentrantes con FSU Pthreads. FSU Pthreads en OpenServer intenta utilizar el esquema de SCO para hacer bibliotecas reentrantes. FSU Pthreads (al menos la versin en ftp::/ftp.zenez.com) viene enlazada con GNU malloc. Si ocurren problemas con el uso de memoria, asegurarse de que gmalloc.o est incluido en libgthreads.a y libgthreads.so. En FSU Pthreads, las siguientes llamadas de sistema son compatibles con pthreads: read(), write(), getmsg(), connect(), accept(), select(), y wait(). El parche CSSA-2001-SCO.35.2 (habitualmente listado como erg711905-dscr_remap security patch (version 2.0.0)) interrumpe los subprocesos FSU y deja inestable a mysqld. Hay que removerlo si se desea ejecutar mysqld en un ordenador con OpenServer 5.0.6. SCO proporciona parches del sistema operativo OpenServer 5.0.x en ftp://ftp.sco.com/pub/ openserver5. Las soluciones a problemas de seguridad y libsocket.so.2 para OpenServer 5.0.x estn en ftp:// ftp.sco.com/pub/security/OpenServer y ftp://ftp.sco.com/pub/security/sse. Soluciones de seguridad para Pre-OSR506. Tambin, la solucin para telnetd en ftp:// stage.caldera.com/pub/security/openserver/ o ftp://stage.caldera.com/pub/security/openserver/ CSSA-2001-SCO.10/ as como libsocket.so.2 y libresolv.so.1 con instrucciones para instalar en sistemas pre-OSR506.
142
Probablemente sea una buena idea instalar estos parches antes de compilar o utilizar MySQL. A partir de Legend/OpenServer 6.0.0 se dispone de subprocesos nativos y se elimin el lmite de 2GB para el tamao de los ficheros.
La versin de Berkeley DB que viene con UnixWare 7.1.4 u OpenServer 6.0.0 no se utiliza cuando se compila MySQL. En su lugar, MySQL utiliza su propia versin de Berkeley DB. El comando configure necesita compilar tanto una biblioteca esttica como una dinmica en src_directory/ bdb/build_unix/, pero no utiliza la versin de Berkeley DB que MySQL necesita. La solucin es la siguiente. 1. Configurar para MySQL como de costumbre. 2. cd bdb/build_unix/ 3. cp -p Makefile to Makefile.sav 4. Emplear las mismas opciones y ejecutar ../dist/configure. 5. Ejecutar gmake. 6. cp -p Makefile.sav Makefile 7. Posicionarse en el directorio principal o raz de cdigo fuente y ejecutar gmake. Esto posibilita que tanto la biblioteca dinmica como la esttica sean creadas y funcionen. SCO proporciona parches de sistema operativo en ftp://ftp.sco.com/pub/unixware7 para UnixWare 7.1.1, ftp://ftp.sco.com/pub/unixware7/713/ para UnixWare 7.1.3, ftp://ftp.sco.com/pub/unixware7/714/ para UnixWare 7.1.4, y ftp://ftp.sco.com/pub/openunix8 para OpenUNIX 8.0.0. SCO proporciona informacin sobre soluciones a problemas de seguridad en ftp://ftp.sco.com/pub/ security/OpenUNIX para OpenUNIX y ftp://ftp.sco.com/pub/security/UnixWare para UnixWare. En forma predeterminada, el mximo tamao de fichero en un sistema UnixWare 7.1.1 es de 1GB, pero en UnixWare 7.1.4 es de 1TB con VXFS. Algunas utilidades del Sistema Operativo tienen una limitacin de 2GB. El mximo tamao posible para ficheros de UnixWare 7 es 1TB con VXFS. En UnixWare 7.1.4 no se necesita ninguna accin en especial para que soporte ficheros de gran tamao, pero para habilitarlo en versiones anteriores de UnixWare 7.1.x, hay que ejecutar fsadm.
# # # # # # # fsadm -Fvxfs -o largefiles / fsadm / * Nota ulimit unlimited cd /etc/conf/bin ./idtune SFSZLIM 0x7FFFFFFF ./idtune HFSZLIM 0x7FFFFFFF ./idbuild -B
** Nota ** Nota
143
* Este comando debera informar "largefiles". ** El valor 0x7FFFFFFF representa "infinito" (sin lmite) para esos valores.
Reiniciar el sistema empleando shutdown. por defecto, las entradas en /etc/conf/cf.d/mtune estn establecidas en:
Value ----SVMMLIM HVMMLIM SSTKLIM HSTKLIM Default ------0x9000000 0x9000000 0x1000000 0x1000000 Min --0x1000000 0x1000000 0x2000 0x2000 Max --0x7FFFFFFF 0x7FFFFFFF 0x7FFFFFFF 0x7FFFFFFF
Se recomienda ajustar el sistema, pero los valores de los parmetros a emplear dependen del nmero de usuarios que accedern a la aplicacin o la base de datos y el tamao de la base de datos (es decir, el uso que se har del buffer pool -un cach de tablas y pginas-). Lo que sigue modifica los parmetros del kernel definidos en /etc/conf/cf.d/stune: SHMMAX (valor recomendado: 128MB) y SHMSEG (valor recomendado: 15). Estos parmetros influyen en la forma en que el motor de bases de datos crea los buffer pools. SFNOLIM y HFNOLIM deberan ser como mximo 2048. NPROC debera establecerse a por lo menos 3000/4000 (dependiendo del nmero de usuarios). Tambin se recomienda emplear la siguiente frmula para calcular los valores de SEMMSL, SEMMNS, y SEMMNU:
SEMMSL = 13
13 es el valor que se hall como el mejor para Progress y MySQL. SEMMNS = SEMMSL * cantidad de servidores de bases de datos a ejecutar en el sistema. Establecer SEMMNS al valor de SEMMSL multiplicado por el nmero mximo de servidores que se ejecutarn en el sistema al mismo tiempo. SEMMNU = SEMMNS Establecer el valor de SEMMNU al mismo valor que tiene SEMMNS. Posiblemente se pueda establecer a un 75% del valor de SEMMNS, pero esta es una estimacin conservadora.
144
Mejora dramtica del rendimiento. OpenServer 6.0.0 tiene las siguientes particularidades: /bin es para comandos que se comportan exactamente del mismo modo que OpenServer 5.0.x. /u95/bin es para comandos que estn ms en conformidad con los estndares, por ejemplo el soporte para el Sistema de Ficheros Grandes o LFS (Large File System). /udk/bin es para comandos que se comportan igual que en UnixWare 7.1.4. por defecto, el soporte para LFS. La siguiente es una gua para configurar PATH en OpenServer 6. Si el usuario desea el OpenServer 5.0.x tradicional entonces PATH debera ser en primer lugar /bin. Si el usuario desea soporte para LFS entonces el PATH debera ser /u95/bin:/bin. Si desea primariamente soporte para UnixWare 7, debera ser /udk/bin:/u95/bin:/bin:. Se recomienda utilizar el ltimo release de produccin de MySQL En OpenServer Versin 6.0.x se ha logrado compilar MySQL con el siguiente comando configure:
CC="cc" CFLAGS="-I/usr/local/include" \ CXX="CC" CXXFLAGS="-I/usr/local/include" \ ./configure --prefix=/usr/local/mysql \ --enable-thread-safe-client --with-berkeley-db=./bdb \ --with-innodb --with-openssl --with-extra-charsets=complex \ --enable-readline
La versin de Berkeley DB que viene con UnixWare 7.1.4 u OpenServer 6.0.0 no se utiliza cuando se compila MySQL. En su lugar, MySQL utiliza su propia versin de Berkeley DB. El comando configure necesita compilar tanto una biblioteca esttica como una dinmica en src_directory/ bdb/build_unix/, pero no utiliza la versin de Berkeley DB que MySQL necesita. La solucin es la siguiente. 1. Configurar para MySQL como de costumbre. 2. cd bdb/build_unix/ 3. cp -p Makefile to Makefile.sav 4. Emplear las mismas opciones y ejecutar ../dist/configure. 5. Ejecutar gmake. 6. cp -p Makefile.sav Makefile 7. Posicionarse en el directorio principal o raz de cdigo fuente y ejecutar gmake. Esto posibilita que tanto la biblioteca dinmica como la esttica sean creadas y funcionen. OpenServer 6.0.0 tambin necesita parches para el rbol de cdigo fuente MySQL y el parche para config.guess aplicado sobre bdb/dist/config.guess. Los parches pueden descargarse de ftp://ftp.zenez.com/pub/zenez/prgms/mysql-4.1.12-osr6-patches.tar.gz y de ftp://ftp.zenez.com/pub/ zenez/prgms/mysql-4.x.x-osr6-patches. Hay un fichero README para obtener ayuda. Los parches del sistema operativo OpenServer 6 son proporcionados por SCO en ftp://ftp.sco.com/ pub/openserver6. SCO proporciona informacin sobre soluciones a problemas de seguridad en ftp://ftp.sco.com/pub/ security/OpenServer.
145
En forma predeterminada, el mximo tamao de fichero en un sistema OpenServer 6.0.0 es de 1TB. Algunas utilidades del Sistema Operativo tienen una limitacin de 2GB. El mximo tamao posible para ficheros de UnixWare 7 es 1TB con VXFS o HTFS. En forma predeterminada, las entradas en /etc/conf/cf.d/mtune estn establecidas en:
Value ----SVMMLIM HVMMLIM SSTKLIM HSTKLIM Default ------0x9000000 0x9000000 0x1000000 0x1000000 Min --0x1000000 0x1000000 0x2000 0x2000 Max --0x7FFFFFFF 0x7FFFFFFF 0x7FFFFFFF 0x7FFFFFFF
Se recomienda ajustar el sistema, pero los valores de los parmetros a emplear dependen del nmero de usuarios que accedern a la aplicacin o la base de datos y el tamao de la base de datos (es decir, el uso que se har del buffer pool -un cach de tablas y pginas-). Lo que sigue modifica los parmetros del kernel definidos en /etc/conf/cf.d/stune: SHMMAX (Valor recomendado: 128MB) y SHMSEG (Valor recomendado: 15). Estos parmetros influyen en la forma en que el motor de bases de datos crea los buffer pools. SFNOLIM y HFNOLIM deberan tener un valor mximo de 2048. NPROC debera ser por lo menos 3000/4000 (dependiendo de la cantidad de usuarioa). Tambin se recomienda emplear la siguiente frmula para calcular los valores de SEMMSL, SEMMNS, y SEMMNU:
SEMMSL = 13
13 es el valor que se hall como el mejor para Progress y MySQL. SEMMNS = SEMMSL * cantidad de servidores de bases de datos a ejecutar en el sistema. Establecer SEMMNS al valor de SEMMSL multiplicado por el nmero mximo de servidores que se ejecutarn en el sistema al mismo tiempo. SEMMNU = SEMMNS Establecer el valor de SEMMNU al mismo valor que tiene SEMMNS. Posiblemente se pueda establecer a un 75% del valor de SEMMNS, pero esta es una estimacin conservadora.
Al emplear MySQL en OS/2 Warp 3, se requiere el FixPack 29 o posterior. Con OS/2 Warp 4, se necesita el FixPack 4 o posterior. Este es un requisito de la biblioteca Pthreads. MySQL Debe ser
146
instalado en una particin con un tipo que soporte nombres de fichero largos, tal como HPFS, FAT32, y otros. El script INSTALL.CMD debe ejecutarse desde la lnea de comandos de OS/2, CMD.EXE, y podra no funcionar con shells de remplazo como 4OS2.EXE. El script scripts/mysql-install-db ha cambiado su nombre. Se llama install.cmd y es un script REXX, el cual establece la configuracin de seguridad por defecto de MySQL y crea en el Workplace Shell [nombre que recibe el sistema de ventanas de OS/2] los conos de MySQL. El soporte para mdulo dinmico se compila pero no est completamente testeado. Los mdulos dinmicos se deben compilar empleando la biblioteca de tiempo de ejecucin de Pthreads.
gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \ -o example udf_example.cc -L../lib -lmysqlclient udf_example.def mv example.dll example.udf
Nota: debido a limitaciones en OS/2, el nombre (sin incluir extensin) de un mdulo UDF no debe exceder de 8 caracteres. Los mdulos se almacenan en el directorio /mysql2/udf; el script safemysqld.cmd coloca este directorio en la variable de entorno BEGINLIBPATH. Al utilizar mdulos UDF, se ignora cualquier extensin que se especifique. Se asume .udf. Por ejemplo, en Unix, el mdulo compartido podra llamarse example.so y la carga de una funcin contenida en l se hara as:
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME 'example.so';
147
shell> perl -MCPAN -e shell cpan> install DBI cpan> install DBD::mysql
La instalacin de DBD::mysql ejecuta una cantidad de pruebas. Estas pruebas intentan conectarse al servidor MySQL local, empleando el nombre de usuario y contrasea por defecto. (El nombre de usuario por defecto es el nombre usado para iniciar sesin en Unix, y en Windows es ODBC. La contrasea por defecto es sin contrasea.). Si no se puede conectar al servidor con estos valores (por ejemplo si la cuenta tiene una contrasea establecida), la prueba falla. Se puede emplear force install DBD::mysql para ignorar las pruebas fallidas. DBI requiere el mdulo Data::Dumper. Es posible que est instalado, de lo contrario, se debera instalar antes que DBI. Otra posibilidad es descargar las distribuciones de mdulos en forma de ficheros tar comprimidos y compilar los mdulos manualmente. Por ejemplo, para descompactar y compilar una distribucin DBI, debe usarse un procedimiento como el siguiente: 1. Descompactar la distribucin en el directorio actual:
shell> gunzip < DBI-VERSION.tar.gz | tar xvf -
Este comando crea un directorio llamado DBI-VERSION. 2. Hay que posicionarse en el directorio de ms alto nivel de la distribucin descompactada:
shell> cd DBI-VERSION
3. Compilar la distribucin:
shell> shell> shell> shell> perl Makefile.PL make make test make install
El comando make test es importante porque verifica que el mdulo est funcionando. Ntese que, al ejecutar este comando durante la instalacin de DBD::mysql para ejercitar el cdigo de la interfaz, el servidor MySQL debe estar funcionando o de lo contrario la prueba fallar. Es buena idea recompilar y reinstalar la distribucin de DBD::mysql cada vez que se instale un nuevo release de MySQL, en particular si se advierte que todos los scripts DBI fallan luego de actualizar el servidor. Si no se tienen privilegios para instalar los mdulos Perl en el directorio del sistema, o si se desean instalar los mdulos en forma local, la siguiente referencia puede ser til: http:// servers.digitaldaze.com/extensions/perl/modules.html#modules Ver bajo el ttulo Installing New Modules that Require Locally Installed Modules.
148
Este procedimiento debera funcionar con ActiveState Perl Versin 5.6 o posterior. Si no se puede hacer funcionar el procedimiento, se debera en su lugar instalar el driver MyODBC y conectarse al servidos MySQL a travs de ODBC:
use DBI; $dbh= DBI->connect("DBI:ODBC:$dsn",$user,$password) || die "Got error $DBI::errstr when connecting to $dsn\n";
Agregar -L/usr/lib/gcc-lib/... -lgcc al comando de enlazado cuando se compila mysql.so (verificar la salida de make para mysql.so al compilar el cliente Perl). La opcin -L debera especificar la ruta donde se localiza libgcc.a. Otra causa de este problema es que Perl y MySQL no estn compilados (ambos) con gcc. En este caso, se puede resolver la desigualdad compilando a los dos con gcc. Al ejecutar las pruebas, puede verse el siguiente error de DBD::mysql:.
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.
149
Esto significa que se necesita incluir la biblioteca de compresin -lz en la lnea de enlazado. Puede hacerse cambiando la siguiente linea en el fichero lib/DBD/mysql/Install.pm. Copiar libmysqlclient.so al directorio donde se ubican las otras bibliotecas compartidas (probablemente, /usr/lib or /lib). Modificar las opciones -L usadas para compilar DBD::mysql para que reflejen la ubicacin real de libmysqlclient.so. En Linux, puede agregarse al fichero /etc/ld.so.conf la ruta donde se localiza libmysqlclient.so. Agregar a la variable de entorno LD_RUN_PATH el directorio donde se ubica libmysqlclient.so. Algunos sistemas utilizan LD_LIBRARY_PATH en lugar de LD_RUN_PATH. Hay que notar que si hay otras bibliotecas que el enlazador no puede hallar, se necesitarn modificar las opciones -L. Por ejemplo, si no se puede hallar libc:
$sysliblist .= " -lm";
Cambiar la lnea a:
$sysliblist .= " -lm -lz";
Despues de esto, debe ejecutarse make realclean y proceder con la instalacin desde el principio. Si se desea instalar DBI en SCO, se tendr que editar el fichero Makefile en DBI-xxx y en cada subdirectorio. Notar que lo que sigue asume que se tiene gcc 2.95.2 o posterior:
OLD: 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 NEW: 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
Estos cambios se necesitan porque el cargador dinmico (dynaloader) de Perl no cargar los mdulos DBI si fueron compilados con icc o cc. Si se desea utilizar el mdulo Perl en un sistema que no posee soporte para enlazado dinmico (como SCO), se deber generar una versin esttica de Perl que incluya DBI y DBD::mysql. La forma en que esto funciona es: se genera una versin de Perl con el cdigo DBI enlazado y se la instala por encima del Perl actual. Luego se lo utiliza para compilar una versin de Perl que adicionalmente tiene includo el cdigo de DBD, y se lo instala. En SCO, se debern configurar las siguientes variables de entorno:
LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib
O bien:
LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\ /usr/progressive/lib:/usr/skunk/lib LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\
150
En primer lugar hay que crear un Perl que incluya un mdulo DBI enlazado estticamente mediante la ejecucin de estos comandos en el directorio donde se ubica la distribucin de DBI:
shell> shell> shell> shell> perl Makefile.PL -static -config make make install make perl
Luego debe instalarse el nuevo Perl. La salida de make perl indica exactamente el comando make necesario para llevar a cabo la instalacin. En SCO, este es make -f Makefile.aperl inst_perl MAP_TARGET=perl. A continuacin, emplear el recin creado Perl para crear otro Perl que tmabin incluya un DBD::mysql creado estticamente, mediante la ejecucin de estos comandos en el directorio donde se ubica la distribucin DBD::mysql:
shell> shell> shell> shell> perl Makefile.PL -static -config make make install make perl
Finalmente, se debera instalar este nuevo Perl. De nuevo, la salida de make perl indicar el comando a emplear.
151
152
Este captulo asume que mysql est instalado en el ordenador y que est disponible un servidor MySQL al cual conectarse. Si no es as, consulte con su administrador MySQL. (Si Usted es el administrador, necesitar consultar otras secciones de este manual). Se describe el proceso de configurar y utilizar una base de datos. Si slo le interesa acceder a una base de datos existente, es posible que quiera omitir las secciones que muestran cmo crear una base de datos y las tablas que contiene. Dado que este captulo es una gua de aprendizaje, muchos detalles son necesariamente omitidos. Para informacin detallada sobre los temas que se tratan, consulte las secciones relevantes del manual.
153
Entrar consultas
conexin, tambin se deber especificar el nombre de host. Consulte con su administrador para saber los parmetros de conexin (nombre de usuario, contrasea y host) que debe emplear. Una vez que conozca los parmetros apropiados, debera poder conectarse de este modo:
shell> mysql -h host -u user -p Enter password: ********
host y user representan el nombre del ordenador donde se est ejecutando el servidor de bases de datos MySQL y el nombre de usuario de la cuenta que se usar para conectarse. Reemplcelos por los valores apropiados para elcaso. Los asteriscos (********) representan la contrasea, debe ingresarse cuando mysql muestra Enter password:. Si todo funciona bien, se ver una informacin de ingreso seguida por el prompt 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 25338 to server version: 5.0.9-beta-standard Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>
El prompt anuncia que mysql est listo para procesar comandos. Algunas instalaciones de MySQL permiten conectarse como usuario annimo (sin nombre) si el servidor se est ejecutando en el ordenador local. Si esto sucede en su caso, deberia poder conectarse al servidor ejecutando mysql sin ningn parmetro:
shell> mysql
Despus de haberse conectado, puede desconectarse en cualquier momento escribiendo QUIT (o \q) en el prompt mysql>:
mysql> QUIT Bye
En Unix, tambin puede desconectarse presionando Control-D. La mayora de los ejemplos en las secciones siguientes asumen que ya se ha conectado al servidor. Por eso muestran el prompt mysql>.
154
Entrar consultas
Un comando normalmente consiste en una sentencia SQL seguida de punto y coma. (Hay excepciones donde el punto y coma puede omitirse. QUIT, mencionado anteriormente, es una de ellas. Luego conocer otras.) Cuando ingresa un comando, mysql lo enva al servidor para ser ejecutado e imprime los resultados. A continuacin muestra de nuevo el prompt mysql> para informarle que est listo para otro comando. mysql imprime los resultados de la consulta en forma tabulada (filas y columnas). La primera fila contiene etiquetas para las columnas. Las filas siguientes son los resultados de la consulta. Generalmente, el nombre de cada columna es el nombre del campo que trae desde la base de datos. Si est trayendo el valor de una expresin, en lugar del contenido de un campo o columna de una tabla (como en el ejemplo anterior), mysql etiqueta la columna usando el texto de la expresin. mysql informa cuntas filas fueron devueltas y cunto tiempo le tom ejecutarse a la consulta, lo cual da una idea aproximada del rendimiento del servidor. Estos valores son imprecisos porque representan tiempo de reloj corriente (no tiempo de CPU), y adems porque estn afectados por factores como la carga del servidor o la latencia de red. (Para simplificar los ejemplos de este capitulo, a partir de ahora no se mostrar la lnea rows in set.) Las palabras clave pueden ingresarse en cualquier combinacin de minsculas y maysculas. Las siguientes consultas son equivalentes:
mysql> SELECT VERSION(), CURRENT_DATE; mysql> select version(), current_date; mysql> SeLeCt vErSiOn(), current_DATE;
Aqui tiene otra consulta que demuestra que mysql puede usarse como calculadora:
mysql> SELECT SIN(PI()/4), (4+1)*5; +------------------+---------+ | SIN(PI()/4) | (4+1)*5 | +------------------+---------+ | 0.70710678118655 | 25 | +------------------+---------+ 1 row in set (0.02 sec)
Las consultas mostradas hasta ahora han sido relativamente cortas, sentencias de una sola lnea. Se puede inclusive ingresar mltiples sentencias en una misma lnea. Solamente deben separarse con punto y coma:
mysql> SELECT VERSION(); SELECT NOW(); +----------------+ | VERSION() | +----------------+ | 5.0.7-beta-Max | +----------------+ 1 row in set (0.00 sec) +---------------------+ | NOW() | +---------------------+ | 2005-07-11 17:59:36 | +---------------------+ 1 row in set (0.00 sec)
No es necesario que un comando sea ingresado en una sola lnea, de ese modo, comandos extensos que requieren varias lineas no son un problema. mysql determina cuando una sentencia ha llegado a l final observando si termina en un punto y coma, no si se lleg al final de la lnea fsica. (En otras palabras, mysql acepta un formato libre para las entradas: recolecta lineas pero no las ejecuta hasta que encuentra el punto y coma.) Aqui tiene una sentencia de mltiples lneas:
mysql> SELECT -> USER()
155
Entrar consultas
-> , -> CURRENT_DATE; +---------------+--------------+ | USER() | CURRENT_DATE | +---------------+--------------+ | jon@localhost | 2005-07-11 | +---------------+--------------+ 1 row in set (0.00 sec)
Observe en este ejemplo que el prompt cambia de mysql> a -> despus que se ha ingresado la primera lnea de una consulta de mltiples lneas. Esta es la forma en que mysql advierte que no se ha completado la sentencia y an espera por el resto. El prompt es un aliado, puesto que suministra informacin valiosa. Si se emplea, siempre se sabr lo que mysql est esperando. Si durante el ingreso de un comando decide que no quiere ejecutarlo, canclelo tipeando \c:
mysql> SELECT -> USER() -> \c mysql>
Una vez ms observe el prompt. Cambia a mysql> despus de que ingresa \c, informndole que mysql est listo para un nuevo comando. La siguiente tabla muestra cada uno de los indicadores que podr ver y sintetiza lo que dicen acerca del estado en que se encuentra mysql: Prompt mysql> -> '> "> `> /*> Significado Listo para un nuevo comando. Esperando la siguiente lnea en un comando de mltiples lneas. Esperando la siguiente lnea, se encuentra abierta una cadena que comienza con apostrofo ('''). Esperando la siguiente lnea, se encuentra abierta una cadena que comienza con comillas dobles ('"'). Esperando la siguiente lnea, se encuentra abierta una cadena que comienza con tilde ('`'). Esperando la siguiente lnea, se encuentra abierto un comentario que comienza con /*.
El prompt /*> fue introducido en la serie 5.0 a partir de MySQL 5.0.6. Es frecuente que se origine una sentencia de mltiples lineas cuando accidentalmente le da entrada a un comando de una sola lnea pero olvida terminarlo con punto y coma. En ese caso, mysql aguarda por ms caracteres:
mysql> SELECT USER() ->
Si esto le ocurre (considera que ha ingresado una sentencia completa pero solamente obtiene un prompt ->), la mayora de las veces es porque mysql est esperando por el punto y coma. Si no advierte lo que el indicador trata de decirle, podra demorar un buen tiempo en hacer lo que necesita. Ingrese un punto y coma para completar la sentencia, y mysql la ejecutar:
mysql> SELECT USER() -> ; +--------------------+ | USER() | +--------------------+ | joesmith@localhost | +--------------------+
Los prompts '> y "> aparecen durante el ingreso de cadenas. Puede escribir cadenas delimitadas por ''' o '"' (por ejemplo, 'hola' o "adios"), y mysql le permite ingresar cadenas divididas en mltiples
156
lneas. Cuando ve un prompt '> o "> significa que ha comenzado a ingresar una cadena comenzando con ''' o '"' pero no ha ingresado el correspondiente caracter de terminacin. A menudo esto significa que inadvertidamente omiti este carcter. Por ejemplo:
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30; '>
Si ingresa esta sentencia SELECT, presiona ENTER y espera por el resultado, nada ocurrir. En lugar de asombrarse por el tiempo que consume la consulta, note lo que el prompt '> le est diciendo. Indica que mysql espera por el final de una cadena inconclusa. (Ve el error en la sentencia? La cadena 'Smith no tiene el apstrofo de cierre.) Qu hacer llegado a este punto? Lo ms simple es cancelar el comando. No obstante, no puede simplemente teclear \c en este caso, porque mysql interpretara que es parte de la cadena que est introduciendo. En lugar de eso, teclee el carcter de cierre que falta y entonces escriba \c.>:
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30; '> '\c mysql>
El prompt cambia de nuevo a mysql>, informando que mysql est listo para un nuevo comando. El prompt `> es similar a '> y "> , pero informa que est pendiente de completar un identificador delimitado por tildes. Es importante conocer el significado de estos indicadores, ya que si por error se ingresa una cadena incompleta, todo lo que se ingrese posteriormente ser aparentemente ignorado por mysql incluyendo el comando QUIT. Esto puede ser sumamente desconcertante, en particular si no se conoce lo que debe hacer para terminar la lnea y cancelar el comando.
157
Probablemente la lista obtenida sea distinta en su ordenador, pero es casi seguro que tendr las bases de datos mysql y test. La base de datos mysql es necesaria porque es la que describe los privilegios de acceso de los usuarios. La base de datos test se provee para que los usuarios hagan pruebas. Tenga en cuenta que si no tiene el privilegio SHOW DATABASES, no podr ver todas las bases de datos que hay en el servidor. Consulte Seccin 13.5.1.3, Sintaxis de GRANT y REVOKE. Si la base de datos test existe, intente acceder a ella:
mysql> USE test Database changed
Advierta que, al igual que QUIT, USE no necesita que ponga un punto y coma al final (aunque puede hacerlo si lo desea). La sentencia USE tiene otra particularidad: debe escribirse en una sola linea. Puede colocar los ejemplos siguientes en la base de datos test, si tiene acceso a ella, pero si trabaja en un ambiente compartido, lo que deposite all puede ser fcilmente borrado por alguien ms que tenga el acceso. Por este motivo, debera pedirle a su administrador permiso para usar una base de datos propia. Suponga que quiere llamarla menagerie. El administrador necesitar ejecutar un comando como este:
mysql> GRANT ALL ON menagerie.* TO 'su_nombre_mysql'@'su_host_cliente';
Donde su_nombre_mysql es el nombre de usuario que se le asign, y su_host_cliente es el host u ordenador desde donde se conectar.
En ambientes Unix, los nombres de las bases de datos son case sensitive (al contrario que las palabras clave), de modo que siempre debe referirse a su base de datos como menagerie, y no Menagerie, MENAGERIE, o una variante similar. Esto tambin se aplica a los nombres de tablas. Esta restriccin no existe en Windows, aunque puede utilizar el mismo esquema de maysculas cuando se refiera a bases de datos y tablas en una consulta dada. Al crear una base de datos, sta no se selecciona para su uso, debe hacerlo explicitamente. Para convertir a menagerie en la base de datos actual, use este comando:
mysql> USE menagerie Database changed
Las bases de datos slo necesitan ser creadas una sola vez, pero deben ser seleccionadas cada vez que se inicia una sesin de mysql. Puede hacerse a travs del comando USE como se muestra en el ejemplo, o puede indicar la base de datos en la linea de comandos al ejecutar mysql. Simplemente debe indicar el nombre de la base de datos a continuacin de los parmetros que necesite ingresar. Por ejemplo:
shell> mysql -h host -u user -p menagerie Enter password: ********
Advierta en el comando anterior que menagerie no es la contrasea. Si se quisiera suministrar la contrasea en la linea de comandos, despus de la opcin -p, debe hacerse sin dejar espacios en
158
blanco (por ejemplo, -pmypassword, no -p mypassword). De todos modos, colocar la contrasea en la linea de comandos no es recomendable porque lo expone a la vista de otros usuarios.
La parte difcil es decidir cmo debera ser la estructura de su base de datos: qu tablas necesitar, y qu columnas habr en cada tabla. Querr una tabla para contener un registro por cada mascota. Esta tabla puede llamarse pet, y debera contener, como mnimo, el nombre de cada animal. Dado que el nombre no es muy relevante por s mismo, tendra que tener ms informacin. Por ejemplo, si ms de una persona en su familia tendr mascotas, querr listar tambin el dueo de cada animal. Y algunos otros datos descriptivos bsicos, como especie y sexo. Qu hacer con la edad? Podra ser de inters, pero no es un buen dato para almacenar en una base de datos. La edad cambia a medida que pasa el tiempo, lo cual significa que debera actualizar la base de datos a menudo. En lugar de esto, es mejor almacenar un valor fijo, como la fecha de nacimiento. De este modo, cada vez que requiera saber la edad, podr calcularla como la diferencia entre la fecha de nacimiento y la fecha actual. MySQL provee funciones para realizar clculos con fechas, por lo que no es dificultoso. Almacenar la fecha de nacimiento en lugar de la edad tiene otras ventajas: Puede usar la base de datos para tareas como generar recordatorios para los prximos cumpleaos de mascotas. (Si piensa que este tipo de consultas no es importante, considere que es lo mismo que hara en un contexto de base de datos de negocios para identificar aquellos clientes a los que habr que enviar una tarjeta por su cumpleaos, para conseguir ese toque personal con la asistencia del ordenador). Puede calcular edades en relacin a otras fechas adems de la actual. Por ejemplo, almacenar la fecha de muerte de una mascota le posibilita calcular la edad que tena a ese momento. Probablemente pensar en otros tipos de informacin que resultaran tiles dentro de la tabla pet pero los identificados hasta ahora son suficientes: name (nombre), owner (propietario), species (especie), sex (sexo), birth (nacimiento) y death (muerte). Debe usar la sentencia CREATE TABLE para especificar la estructura de una tabla:
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
El tipo de dato VARCHAR es una buena eleccin para las columnas name, owner, y species porque los datos que all se almacenan no son de longitud uniforme. En realidad no es necesario que todas estas columnas tengan la misma longitud ni que sta sea 20. En MySQL 5.0.3 y versiones posteriores, normalmente se puede adoptar cualquier longitud entre 1 y 65535, segn lo que se crea ms razonable. (Nota: Anteriormente a MySQL 5.0.3, el lmite de longitud era 255.) Si en el futuro debiera aumentar la longitud de estos campos, MySQL tiene la sentencia ALTER TABLE. Hay varios tipos de datos que podran usarse para representar el sexo en los registros de animales, tal como 'm' y 'f', o 'male' (masculino) y 'female' (femenino). Lo ms simple es usar los caracteres 'm' y 'f'. Es obvio el uso del tipo de dato DATE para las columnas birth y death. Luego de crear una tabla, SHOW TABLES debera producir una salida:
mysql> SHOW TABLES; +---------------------+
159
Para verificar que la tabla ha sido creada en la forma esperada, utilice la sentencia DESCRIBE:
mysql> DESCRIBE pet; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
DESCRIBE puede ser utilizada en cualquier momento, por ejemplo, si olvida los nombres o el tipo de dato de las columnas de la tabla.
Dado que est comenzando con una tabla vaca, una forma fcil de completarla es creando un fichero de texto que contenga una lnea por cada animal, y luego insertando el contenido del fichero en la tabla mediante una sola sentencia. Para esto, debera crear un fichero de texto llamado pet.txt, conteniendo un registro por linea, con cada valor separado por un carcter de tabulacin, y dispuestos en el orden en el cual se especificaron las columnas en la sentencia CREATE TABLE. Para valores ausentes (como sexo desconocido o fechas de muerte de animales con vida), puede usar valores NULL. Para representar estos valores en el archivo de texto, utilice \N (barra diagonal y N mayscula). Por ejemplo, el registro de Whistler se vera del modo siguiente (el espacio en blanco entre cada valor es un solo carcter de tabulacin): name Whistler owner Gwen species bird sex \N birth 1997-12-09 death \N
Para cargar el fichero pet.txt dentro de la tabla pet, utilice este comando:
mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;
160
Si trabaja en Windows, con un editor que emplea \r\n (retorno de carro + nueva linea) como caracteres de fin de lnea, debera usar:
mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet -> LINES TERMINATED BY '\r\n';
(En un ordenador Apple bajo OS X, probablemente quiera utilizar LINES TERMINATED BY '\r'.) Opcionalmente puede especificar en la sentencia LOAD DATA los caracteres que actuarn como separador de campo y fin de lnea, pero los valores por defecto son tabulacin y nueva lnea. Estos son suficientes para que la sentencia lea correctamente el fichero pet.txt Si ocurre un error al ejecutar la sentencia, probablemente se deba a que su instalacin de MySQL no tiene habilitada por defecto la capacidad de manejar archivos locales. Consulte Seccin 5.5.4, Cuestiones relacionadas con la seguridad y LOAD DATA LOCAL para obtener informacin sobre cmo cambiar esto. Cuando lo que desea es agregar nuevos registros de a uno por vez, la sentencia INSERT resulta de utilidad. De esta sencilla manera, se suministran valores para cada columna, dispuestos en el orden en el cual se especificaron las columnas en la sentencia CREATE TABLE statement. Suponga que Diane obtiene un nuevo hamster llamado "Puffball". Se podra agregar un nuevo registro, usando la sentencia INSERT de este modo:
mysql> INSERT INTO pet -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
Observe que las cadenas alfanumricas y las fechas son representados como cadenas delimitadas por apstrofos. Tambin, con INSERT, se pueden insertar valores NULL directamente, para indicar un valor ausente. No se debe utilizar \N como se hace con LOAD DATA. A partir de este ejemplo queda demostrado que lleva mucho ms trabajo realizar una carga inicial de registros empleando varias sentencias INSERT que si se hace mediante la sentencia LOAD DATA.
seleccionar_esto es lo que se quiere ver. Puede ser una lista de columnas, o * para indicar todas las columnas. desde_tablaindica la tabla donde estn los datos a recuperar. La clusula WHERE es opcional. Si est presente, condiciones representa las condiciones que cada registro debe cumplir para retornar como resultado.
161
+----------+--------+---------+------+------------+------------+
Esta forma de SELECT es til si se quiere revisar la tabla completa, por ejemplo, despues de haberla cargado con un conjunto de datos inicial. Por ejemplo, puede ocurrir que la fecha de nacimiento de Bowser no parezca correcta. Consultando los papeles de pedigri, se descubre que el ao correcto de nacimiento es 1989, no 1979. Existen al menos dos formas de solucionarlo: Editando el fichero pet.txt para corregir el error, vaciando la tabla y volviendola a llenar con los datos. Para esto se usan las sentencias DELETE y LOAD DATA:
mysql> DELETE FROM pet; mysql> LOAD DATA LOCAL INFILE 'pet.txt' INTO TABLE pet;
No obstante, si opta por esto, deber volver a cargar el registro de Puffball. Corrigiendo nicamente el registro errneo. Para esto se usa la sentencia UPDATE:
mysql> UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
UPDATE modifica solo el registro en cuestin y no requiere que se vuelva a llenar la tabla.
La salida confirma que el ao fue correctamente registrado como 1989, ya no es 1979. Normalmente, las comparaciones de cadenas no son case sensitive, por eso puede escribir el nombre como 'bowser', 'BOWSER', etc. El resultado de la consulta ser el mismo. Se pueden indicar condiciones a cumplir por cualquier columna, no solamente por name. Por ejemplo, si quisiera saber qu animales han nacido luego de 1998, necesita evaluar la columna birth:
mysql> SELECT * FROM pet WHERE birth > '1998-1-1'; +----------+-------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+-------+ | Chirpy | Gwen | bird | f | 1998-09-11 | NULL | | Puffball | Diane | hamster | f | 1999-03-30 | NULL | +----------+-------+---------+------+------------+-------+
162
La consulta anterior emplea el operador lgico AND. Tambin existe el operador OR:
mysql> SELECT * FROM pet WHERE species = 'snake' OR species = 'bird'; +----------+-------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+-------+ | Chirpy | Gwen | bird | f | 1998-09-11 | NULL | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | | Slim | Benny | snake | m | 1996-04-29 | NULL | +----------+-------+---------+------+------------+-------+
AND and OR pueden ser combinadas, si bien AND tiene mayor precedencia que OR. Si utiliza ambos operadores, es buena idea emplear parntesis para indicar explicitamente la forma en que las condiciones deben agruparse:
mysql> SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm') -> OR (species = 'dog' AND sex = 'f'); +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
Observe que esta sentencia retorna el campo owner de cada registro, y algunos de ellos aparecen ms de una vez. Para reducir la salida, recupere solamente una vez cada registro repetido, agregando la palabra clave DISTINCT:
mysql> SELECT DISTINCT owner FROM pet; +--------+
163
Puede emplearse una clsula WHERE para combinar la seleccin de ciertas filas y de ciertas columnas. Por ejemplo, para obtener nicamente la fecha de nacimiento de perros y gatos, ejecute esta consulta:
mysql> SELECT name, species, birth FROM pet -> WHERE species = 'dog' OR species = 'cat'; +--------+---------+------------+ | name | species | birth | +--------+---------+------------+ | Fluffy | cat | 1993-02-04 | | Claws | cat | 1994-03-17 | | Buffy | dog | 1989-05-13 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 | +--------+---------+------------+
Por lo general, cuando se trata de columnas de tipo carcter, la ordenacin, al igual que otras operaciones de comparacin no es case-sensitive. Significa que el orden permanece indefinido para las columnas que son idnticas excepto por sus maysculas y minsculas. Puede no obstante forzar a que una columna se ordene en forma sensible a maysculas empleando el modificador BINARY: ORDER BY BINARY columna. El sentido de ordenacin, por defecto, es ascendente, con los valores ms pequeos primero. Para ordenar en sentido inverso (descendente), agregue la palabra clave DESC luego del nombre de la columna por la que ordena:
mysql> SELECT name, birth FROM pet ORDER BY birth DESC; +----------+------------+ | name | birth | +----------+------------+ | 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 |
164
Puede ordenar basndose en varias columnas, y cada columna en un sentido diferente. Por ejemplo, para ordenar por tipo de animal en sentido ascendente y, dentro de cada tipo, ordenar por nacimiento en sentido descendente (los animales ms jvenes primero) utilice la siguiente consulta:
mysql> SELECT name, species, birth FROM pet -> ORDER BY species, birth DESC; +----------+---------+------------+ | name | species | birth | +----------+---------+------------+ | Chirpy | bird | 1998-09-11 | | Whistler | bird | 1997-12-09 | | Claws | cat | 1994-03-17 | | Fluffy | cat | 1993-02-04 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 | | Buffy | dog | 1989-05-13 | | Puffball | hamster | 1999-03-30 | | Slim | snake | 1996-04-29 | +----------+---------+------------+
Advierta que la palabra clave DESC se aplica sobre la columna inmediatamente anterior (birth); no afecta el sentido de ordenacin de la columna species.
En el ejemplo anterior, YEAR() trae la parte correspondiente al ao de una fecha, y RIGHT() trae los 5 primeros caracteres contando desde la derecha, que representan la parte MM-DD de la fecha. La porcin de la expresin que compara los valores MM-DD devuelve 1 o 0, lo cual se corresponde con la diferencia de 1 ao a restar de la edad si el dia de la fecha devuelto por CURDATE() ocurre antes que la fecha de nacimiento birth. La expresin completa es un tanto confusa para usar como encabezado, por lo que se emplea un alias (age) para que el encabezado sea ms comprensible. La consulta funciona bien, pero los resultados podran revisarse ms fcilmente si las filas se presentaran en algn orden. Esto puede hacerse agregando la clusula ORDER BY name para ordenar por nombre la salida:
mysql> SELECT name, birth, CURDATE(),
165
-> (YEAR(CURDATE())-YEAR(birth)) -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) -> AS age -> FROM pet ORDER BY name; +----------+------------+------------+------+ | name | birth | CURDATE() | age | +----------+------------+------------+------+ | Bowser | 1989-08-31 | 2003-08-19 | 13 | | Buffy | 1989-05-13 | 2003-08-19 | 14 | | Chirpy | 1998-09-11 | 2003-08-19 | 4 | | Claws | 1994-03-17 | 2003-08-19 | 9 | | Fang | 1990-08-27 | 2003-08-19 | 12 | | Fluffy | 1993-02-04 | 2003-08-19 | 10 | | Puffball | 1999-03-30 | 2003-08-19 | 4 | | Slim | 1996-04-29 | 2003-08-19 | 7 | | Whistler | 1997-12-09 | 2003-08-19 | 5 | +----------+------------+------------+------+
Para ordenar la salida por edad (age) en lugar de por nombre (name), solo hay que utilizar una clusula ORDER BY diferente:
mysql> SELECT name, birth, CURDATE(), -> (YEAR(CURDATE())-YEAR(birth)) -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) -> AS age -> FROM pet ORDER BY age; +----------+------------+------------+------+ | name | birth | CURDATE() | age | +----------+------------+------------+------+ | Chirpy | 1998-09-11 | 2003-08-19 | 4 | | Puffball | 1999-03-30 | 2003-08-19 | 4 | | Whistler | 1997-12-09 | 2003-08-19 | 5 | | Slim | 1996-04-29 | 2003-08-19 | 7 | | Claws | 1994-03-17 | 2003-08-19 | 9 | | Fluffy | 1993-02-04 | 2003-08-19 | 10 | | Fang | 1990-08-27 | 2003-08-19 | 12 | | Bowser | 1989-08-31 | 2003-08-19 | 13 | | Buffy | 1989-05-13 | 2003-08-19 | 14 | +----------+------------+------------+------+
Una consulta similar se utiliza para determinar la edad a la fecha de muerte de los animales. Se determinan los animales que han muerto verificando si el valor de la columna death es NULL. Entonces, para todos los valores no NULL calcula la diferencia entre las fechas de muerte (death) y nacimiento (birth):
mysql> SELECT name, birth, death, -> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5)) -> AS age -> FROM pet WHERE death IS NOT NULL ORDER BY age; +--------+------------+------------+------+ | name | birth | death | age | +--------+------------+------------+------+ | Bowser | 1989-08-31 | 1995-07-29 | 5 | +--------+------------+------------+------+
La consulta utiliza la expresin death IS NOT NULL en lugar de death <> NULL porque NULL es un valor especial, que no puede ser comparado mediante los operadores lgicos habituales. Este tema se trata ms extensamente ms adelante. Consultar Seccin 3.3.4.6, Trabajar con valores NULL. Qu tal si se quisiera saber qu animales cumplen aos el prximo mes? Para esta clase de clculos, el ao y el da son irrelevantes; simplemente se desea extraer de la columna birth la parte correspondiente al mes. MySQL cuenta con varias funciones para extraer partes de fechas, como YEAR(), MONTH(), y DAYOFMONTH(). MONTH() es la funcin apropiada para este caso. Para verla en funcionamiento, ejecute una consulta que muestra tanto el valor de birth como el de MONTH(birth):
mysql> SELECT name, birth, MONTH(birth) FROM pet; +----------+------------+--------------+ | name | birth | MONTH(birth) |
166
+----------+------------+--------------+ | 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 | +----------+------------+--------------+
Encontrar los animales que cumplen aos el mes siguiente es tambin sencillo. Suponga que el mes actual es abril. De modo que su nmero es 4, y se buscan los animales nacidos en Mayo (mes 5), de esta forma:
mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5; +-------+------------+ | name | birth | +-------+------------+ | Buffy | 1989-05-13 | +-------+------------+
Esto se complica ligeramente cuando el mes actual es Diciembre. No se puede simplemente sumarle 1 al nmero del mes (12) y buscar animales nacidos en el mes 13, porque no existe tal mes. En lugar de eso, se debe buscar por animales nacidos en Enero (mes 1). Se puede incluso escribir la consulta de forma que funcione sin importar cual es el mes actual. As, no se necesitar indicar un mes en particular en la consulta. DATE_ADD() sirve para sumar un intervalo de tiempo a una fecha dada. Si se adiciona un mes al valor de CURDATE(), y se extrae el mes mediante MONTH(), el resultado ser el mes en el que se buscarn cumpleaos:
mysql> SELECT name, birth FROM pet -> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
Una manera alternativa de alcanzar el mismo resultado es sumar 1 al mes actual para obtener el mes siguiente (despus de emplear la funcin mdulo (MOD) para dejar el nmero de mes en 0 si resultara ser 12:
mysql> SELECT name, birth FROM pet -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
Advierta que MONTH devuelve un nmero entre 1 y 12. Y MOD(algun_valor,12) devuelve un nmero entre 0 y 11. La suma debe ser realizada despus de MOD(), en otro caso se estara pasando de Noviembre (11) a Enero (1).
Claramente, no se obtienen valores significtivos a partir de estas comparaciones. Use en su lugar los operadores IS NULL y IS NOT NULL:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL; +-----------+---------------+ | 1 IS NULL | 1 IS NOT NULL |
167
+-----------+---------------+ | 0 | 1 | +-----------+---------------+
Observe que en MySQL, 0 o NULL se intepretan como falso, y cualquier otro valor, como verdadero. El valor por defecto para una operacin booleana es 1. Este tratamiento especial de NULL es debido a que, en la seccin anterior, fue necesario determinar qu animales ya no estaban vivos utilizando death IS NOT NULL en lugar de death <> NULL. Dos valores NULL son considerados iguales por la clusula GROUP BY. Cuando se realiza un ORDER BY, los valores NULL se presentan en primer lugar si se emplea ORDER BY ... ASC, y al final si se ordena con ORDER BY ... DESC. Un error muy comn cuando se trabaja con valores NULL es asumir que es imposible insertar un valor cero o una cadena vaca en una columna definida como NOT NULL, pero no es as. Los mencionados son efectivamente valores, mientras que NULL significa "no hay un valor". Puede comprobar esto fcilmente empleando IS [NOT] NULL como se muestra aqu:
mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL; +-----------+---------------+------------+----------------+ | 0 IS NULL | 0 IS NOT NULL | '' IS NULL | '' IS NOT NULL | +-----------+---------------+------------+----------------+ | 0 | 1 | 0 | 1 | +-----------+---------------+------------+----------------+
Por lo tanto, es totalmente posible insertar cadenas vacias o ceros en columnas marcadas como NOT NULL, ya que son valores NOT NULL. Consultar Seccin A.5.3, Problemas con valores NULL.
168
| name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | +----------+-------+---------+------+------------+------------+
Para encontrar nombres que contengan exactamente 5 caracteres, use 5 veces el carcter patrn '_':
mysql> SELECT * FROM pet WHERE name LIKE '_____'; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
Los otros patrones que pueden emplearse con MySQL usan expresiones regulares extendidas. Cuando busque coincidencias con este tipo de patrones, use los operadores REGEXP y NOT REGEXP (o bien los sinnimos RLIKE y NOT RLIKE). Algunas caractersticas de las expresiones regulares extendidas: '.' detecta coincidencia con cualquier carcter individual. Una clase de carcter '[...]' detecta coincidencia con cualquier carcter entre los corchetes. Por ejemplo, '[abc]' coincidir con 'a', 'b', o 'c'. Para hacer referencia a un rango de caracteres, use un guin. '[a-z]' detecta coincidencia con cualquier letra, mientras que '[0-9]' lo hace con cualquier dgito. '*' detecta coincidencia con cero o ms apariciones de los caracteres que lo preceden. Por ejemplo, 'x*' detecta cualquier nmero de caracteres 'x', '[0-9]*' detecta cualquier cantidad de dgitos, y '.*' coincidir con cualquier nmero de cualquier carcter. REGEXP tendr xito si el patrn suministrado encuentra coincidencia en cualquier parte del valor examinado (esto difiere de LIKE en que este ltimo solo tiene xito si el patrn concuerda con todo el valor). Para lograr que un patrn detecte coincidencias solamente al principio o al final del valor examinado, utilice '^' al principio o '$' al final del patrn. Para demostrar el funcionamiento de las expresiones regulares extendidas, las consultas con LIKE expuestas anteriormente se han reescrito utilizando REGEXP. Para hallar nombres que comiencen con 'b', use '^' para buscar coincidencia al principio del valor:
mysql> SELECT * FROM pet WHERE name REGEXP '^b'; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+
En MySQL 5.0, si realmente quiere forzar a que la comparacin realizada por REGEXP sea case sensitive, utilice la palabra clave BINARY para convertir a una de las cadenas en una cadena binaria. Esta consulta solamente encontrar coincidencia con 'b' minsculas al comienzo de un nombre:
mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b';
Para hallar nombres finalizados en 'fy', emplee '$' para buscar la coincidencia en el final del nombre:
mysql> SELECT * FROM pet WHERE name REGEXP 'fy$'; +--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+
169
| Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+
Debido a que un patrn de expresin regular encuentra coincidencia sin importar el lugar del valor donde se produce, en la consulta previa no es necesario colocar un comodn a cada lado del patrn para obtener coincidencia en cualquier parte del valor, como hubiera sucedido de utilizar un patrn SQL Para hallar nombres conteniendo exactamente cinco caracteres, use '^' y '$' para obligar a que la coincidencia deba estar al principio y al final del nombre, y cinco instancias de '.' entre ellas.
mysql> SELECT * FROM pet WHERE name REGEXP '^.....$'; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
La consulta anterior tambin se podra haber escrito empleando el operador '{n}' repetir-n-veces:
mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$'; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
Anteriormente se recuperaban los nombres de la gente que posea mascotas. Se puede usar COUNT() para hallar cuantas mascotas tiene cada propietario:
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; +--------+----------+ | owner | COUNT(*) | +--------+----------+ | Benny | 2 |
170
Observe el uso de GROUP BY para agrupar todos los registros de cada propietario. Sin dicha clusula, todo lo que se hubiera obtenido sera un mensaje de error:
mysql> SELECT owner, COUNT(*) FROM pet; ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
COUNT() y GROUP BY son tiles para presentar datos en varias formas. Los siguientes ejemplos muestran diferentes operaciones: Cantidad de animales por especies:
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species; +---------+----------+ | species | COUNT(*) | +---------+----------+ | bird | 2 | | cat | 2 | | dog | 3 | | hamster | 1 | | snake | 1 | +---------+----------+
(En esta salida, NULL indica "sexo desconocido") Cantidad de animales por combinacin de especies y sexo:
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | NULL | 1 | | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
No es necesario examinar una tabla entera cuando se emplea COUNT(). Por ejemplo, la consulta anterior, se podria limitar a perros y gatos de esta manera:
mysql> SELECT species, sex, COUNT(*) FROM pet -> WHERE species = 'dog' OR species = 'cat' -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 |
171
+---------+------+----------+
O si desea la cantidad de animales de cada sexo contando solamente los que tienen sexo conocido:
mysql> SELECT species, sex, COUNT(*) FROM pet -> WHERE sex IS NOT NULL -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
Como se hizo con la tabla pet, es ms fcil realizar la carga inicial de datos si se crea un archivo de texto delimitado con tabulaciones que contenga la informacin a agregar: name 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 litter litter litter vet vet kennel kennel birthday birthday birthday Gave him a new chew toy Gave him a new flea collar First birthday remark 4 kittens, 3 female, 1 male 5 puppies, 2 female, 3 male 3 puppies, 3 female needed beak straightened broken rib
Con base en lo que se ha aprendido a partir de las consultas efectuadas sobre la tabla pet, se debera poder recuperar registros de la tabla event; los principios son los mismos. Pero en un
172
momento dado la tabla event por s sola es insuficiente para responder las preguntas que pueden formularse. Suponga que se desea saber a qu edad tuvo sus cras cada mascota. Anteriormente se aprendi a calcular edades a partir de dos fechas. La fecha en que la mascota tuvo sus crias est en la tabla event, pero para calcular su edad, se necesita su fecha de nacimiento, la cual est localizada en la tabla pet. Esto significa que la consulta requiere ambas tablas:
mysql> SELECT pet.name, -> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age, -> remark -> FROM pet, event -> WHERE pet.name = event.name AND event.type = 'litter'; +--------+------+-----------------------------+ | name | age | remark | +--------+------+-----------------------------+ | Fluffy | 2 | 4 kittens, 3 female, 1 male | | Buffy | 4 | 5 puppies, 2 female, 3 male | | Buffy | 5 | 3 puppies, 3 female | +--------+------+-----------------------------+
Hay varias cosas para observar en esta consulta: La clusula FROM menciona dos tablas porque la consulta necesita traer datos de ambas Cuando se combina (tambin se denomina join -unin, en ingls-) informacin desde mltiples tablas, se necesita indicar qu registro de una tabla se combinar con qu registro de la otra. Esto es sencillo porque ambas tablas tienen una columna name. La consulta emplea la clusula WHERE para hacer coincidir registros de las dos tablas basndose en el valor de name. Dado que la columna name aparece en ambas tablas, se debe especificar a cul tabla pertenece la columna al hacer referencia a ella. Esto se hace anteponiendo el nombre de la tabla al nombre de la columna. No es necesario tener dos tablas diferentes para establecer una unin. A veces es til combinar una tabla consigo misma, si se desea comparar entre s registros de una misma tabla. Por ejemplo, para formar parejas de mascotas para reproduccin, podra unir la tabla pet consigo misma para generar pares de animales macho y hembra de la misma especie:
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species -> FROM pet AS p1, pet AS p2 -> WHERE p1.species = p2.species AND p1.sex = 'f' AND p2.sex = 'm'; +--------+------+--------+------+---------+ | name | sex | name | sex | species | +--------+------+--------+------+---------+ | Fluffy | f | Claws | m | cat | | Buffy | f | Fang | m | dog | | Buffy | f | Bowser | m | dog | +--------+------+--------+------+---------+
En la consulta anterior se especificaron alias para la tabla con el fin de indicar a qu instancia de la tabla pertenece cada columna referenciada.
173
Si an no se hubiese seleccionado ninguna base de datos, el resultado sera NULL. Para conocer las tablas contenidas en la base de datos actual (por ejemplo, si no se est seguro del nombre de una tabla) se usa el siguiente comando:
mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | event | | pet | +---------------------+
Si lo que se desea es ver la estructura de una tabla, el comando DESCRIBE es til; muestra informacin acerca de cada columna de la tabla:
mysql> DESCRIBE pet; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
Field contiene el nombre de la columna, Type es el tipo de dato, NULL seala si la columna puede contener valores NULL, Key indica si la columna est indexada, y Default informa el valor por defecto de la columna. Si una tabla tiene ndices, SHOW INDEX FROM tbl_name muestra informacin sobre ellos.
Si est ejecutando mysql en Windows y el archivo contiene algunos caracteres que causan problemas, el comando es as:
C:\> mysql -e "source batch-file"
Si se necesitara incluir parmetros de conexin en la lnea de comandos, el comando podra verse as:
shell> mysql -h host -u user -p < batch-file Enter password: ********
Cuando se procede de este modo lo que se est haciendo es crear un archivo script, que luego es ejecutado. Si se desea que el script contine su ejecucin aunque alguna de sus sentencias produzca errores, se debe usar la opcin de lnea de comandos --force. Por qu usar scripts? Algunas razones:
174
Si se utiliza una consulta repetidamente (por ejemplo cada da o cada semana), hacer un script evitar volver a teclearla cada vez que se desea ejecutarla. Se pueden crear nuevas consultas a partir de otras existentes que se le parezcan, copiando y editando el archivo de script. El modo por lotes tambin puede ser til cuando se est creando una consulta, en especial si tiene comandos de mltiples lneas o mltiples sentencias. Si se comete un error, no se necesita reteclearlo todo, sino slo editar el script para corregir el error, y volver a ejecutarlo mediante mysql. Si se ejecuta una consulta que produce una salida muy extensa, se puede ejecutar a traves de un paginador en lugar de verla desaparecer rpidamente por la parte superior de la pantalla:
shell> mysql < batch-file | more
Se puede distribuir el script a otras personas, para que puedan tambien ejecutar los comandos. Algunas situaciones no permiten la interactividad, por ejemplo, cuando se ejecuta una consulta a travs de una tarea de cron (en Unix). En este caso, debe emplearse el modo por lotes. El formato de salida es ms breve cuando se usa modo por lotes que cuando se utiliza mysql interactivamente. Por ejemplo, la salida devuelta para SELECT DISTINCT species FROM pet se ve as cuando se ejecuta en modo interactivo:
+---------+ | species | +---------+ | bird | | cat | | dog | | hamster | | snake | +---------+
Si desea obtener el formato por lotes para una salida producida interactivamente, utilice mysql -t. Para incluir en la salida los comandos que se ejecutan, utilice mysql -vvv. Tambin pueden ejecutarse archivos de script desde el prompt mysql utilizando los comandos source o \.
mysql> source filename; mysql> \. filename
175
(En la mayora de las instalaciones de MySQL, podr emplear la base de datos test). Puede crear e ingresar datos a la tabla del ejemplo utilizando estas sentencias:
mysql> -> -> -> -> mysql> -> -> 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);
Otra solucin es ordenar las columnas por precio, en forma descendente, y obtener solamente el primer registro utilizando la clusula LIMIT, especfica de MySQL:
SELECT article, dealer, price FROM shop ORDER BY price DESC LIMIT 1;
Nota: Si hubiera varios artculos que presenten el precio ms alto, cada uno a 19.95, la solucin LIMIT slo mostrara el primero de ellos.
176
SELECT article, MAX(price) AS price FROM shop GROUP BY article +---------+-------+ | article | price | +---------+-------+ | 0001 | 3.99 | | 0002 | 10.99 | | 0003 | 1.69 | | 0004 | 19.95 | +---------+-------+
3.6.4. Los registros de un grupo que tienen el mximo valor en alguna columna
Tarea: Para cada artculo, encontrar el o los distribuidores con el precio ms alto. En MySQL 5.0 (y en SQL estndar), este problema puede resolverse con una subconsulta como esta:
SELECT article, dealer, price FROM shop s1 WHERE price=(SELECT MAX(s2.price) FROM shop s2 WHERE s1.article = s2.article);
177
Esta sintaxis crea una columna; no crea ninguna clase de ndice o campo clave. Esta sintaxis causar un error si se la emplea durante la definicin de una tabla InnoDB. Una columna creada de esta forma se puede utilizar como columna de unin, como se muestra aqu:
CREATE TABLE person ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(60) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE shirt ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, style ENUM('t-shirt', 'polo', 'dress') NOT NULL, color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL, owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id), PRIMARY KEY (id) ); INSERT INTO person VALUES (NULL, 'Antonio Paz'); SELECT @last := LAST_INSERT_ID(); INSERT (NULL, (NULL, (NULL, INTO shirt VALUES 'polo', 'blue', @last), 'dress', 'white', @last), 't-shirt', 'blue', @last);
INSERT INTO person VALUES (NULL, 'Lilliana Angelovska'); SELECT @last := LAST_INSERT_ID(); INSERT (NULL, (NULL, (NULL, (NULL, INTO shirt VALUES 'dress', 'orange', @last), 'polo', 'red', @last), 'dress', 'blue', @last), 't-shirt', 'white', @last);
SELECT * FROM person; +----+---------------------+ | id | name | +----+---------------------+ | 1 | Antonio Paz | | 2 | Lilliana Angelovska | +----+---------------------+ SELECT * FROM shirt; +----+---------+--------+-------+ | id | style | color | owner | +----+---------+--------+-------+ | 1 | polo | blue | 1 | | 2 | dress | white | 1 | | 3 | t-shirt | blue | 1 | | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | | 7 | t-shirt | white | 2 | +----+---------+--------+-------+
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 |
178
+----+-------+--------+-------+
Cuando se usa de esta manera, la clusula REFERENCES no es mostrada en la salida de SHOW CREATE TABLE o DESCRIBE:
SHOW CREATE TABLE shirt\G *************************** 1. row *************************** Table: shirt Create Table: CREATE TABLE `shirt` ( `id` smallint(5) unsigned NOT NULL auto_increment, `style` enum('t-shirt','polo','dress') NOT NULL, `color` enum('red','blue','orange','white','black') NOT NULL, `owner` smallint(5) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1
El uso de REFERENCES como comentario o "recordatorio" en la definicin de una columna funciona en tablas MyISAM y BerkeleyDB.
Esto se ha optimizado a partir de MySQL 5.0.0. Consulte Seccin 7.2.6, Index Merge Optimization. En MySQL 5.0 tambien se puede resolver eficientemente este problema utilizando una UNION que combine la salida de dos sentencias SELECT separadas. Consulte Seccin 13.2.7.2, Sintaxis de UNION. Cada sentencia SELECT busca en solamente una clave y puede ser optimizada:
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';
La tabla del ejemplo contiene valores de ao, mes y dia que representan las visitas de los usuarios a la pgina. Para determinar en cuntos das diferentes del mes se produjeron las visitas, se emplea esta consulta:
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month;
La cual devuelve:
+------+-------+------+ | year | month | days | +------+-------+------+ | 2000 | 01 | 3 | | 2000 | 02 | 2 | +------+-------+------+
179
Utilizacin de AUTO_INCREMENT
La consulta calcula cuantos das diferentes aparecen en la tabla para cada combinacin de ao y mes, removiendo automticamente las entradas duplicadas.
Lo cual devuelve:
+----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | lax | | 5 | whale | | 6 | ostrich | +----+---------+
Para obtener el valor AUTO_INCREMENT ms recientemente generado se puede utilizar la funcion SQL LAST_INSERT_ID() o la funcin del API de C mysql_insert_id(). Estas funciones son especficas de cada conexin, de modo que su valor de retorno no es afectado por las inserciones realizadas a travs de otras conexiones. Nota: Para una insercin de mltiples filas, LAST_INSERT_ID()/mysql_insert_id() retornan el valor AUTO_INCREMENT de la primera de las filas insertadas. Esto permite que las inserciones de mltiples filas sean reproducidas correctamente en otros servidores en una configuracin de replicacin. Para tablas MyISAM y BDB se puede especificar AUTO_INCREMENT sobre una columna secundaria en un ndice de mltiples columnas. En este caso, el valor generado para la columna AUTO_INCREMENT es calculado como MAX(auto_increment_column)+1 WHERE prefix=given-prefix. Esto es til cuando se desea colocar datos en grupos ordenados.
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) ); 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;
Lo cual devuelve:
+--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich |
180
+--------+----+---------+
Ntese que en este caso (cuando la columna AUTO_INCREMENT es parte de un ndice de mltiples columnas), los valores AUTO_INCREMENT son reutilizados si se elimina la fila con el valor AUTO_INCREMENT ms alto en cualquier grupo. Esto ocurre incluso para tablas MyISAM, en las que los valores AUTO_INCREMENT normalmente no son reutilizados Si la columna AUTO_INCREMENT es parte de varios ndices, MySQL generar valores secuenciales empleando el ndice que comienza con la columna AUTO_INCREMENT, si hay uno. Por ejemplo, si la tabla animals contiene los ndices PRIMARY KEY (grp, id) e INDEX (id), MySQL ignorara el ndice PRIMARY KEY al generar valores secuenciales. Como resultado, la tabla contendra una secuencia simple, sin considerar el valor grp.
181
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 screening 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;
Algunas explicaciones: CONCAT(p1.id, p1.tvab) + 0 AS tvid Se desea ordenar por la concatenacin de id y tvab en orden numrico. El agregado de 0 al resultado provoca que MySQL lo trate como un nmero. columna id Identifica una pareja de gemelos. Es un campo clave en todas las tablas.
182
columna tvab Identifica a un gemelo en una pareja. Toma un valor de 1 o 2. columna ptvab Es lo inverso de tvab. Cuando tvab. vale 1, este vale 2, y viceversa. El motivo de su existencia es para ahorrar tipeo y facilitarle a MySQL la optimizacin de la consulta. Esta consulta muestra, entre otras cosas, cmo realizar bsquedas en una tabla a partir de la misma tabla con una unin (p1 y p2). En el ejemplo, esto se usa para verificar cundo una pareja de gemelos murieron antes de cumplir los 65 aos. Si sucede eso, la fila no se devuelve. Todo lo mencionado anteriormente existe en todas las tablas con informacin relativa a gemelos. Hay un ndice definido sobre los campos id,tvab (en todas las tablas) y sobre id,ptvab (person_data) para realizar las consultas ms rpidamente. En nuestra mquina de produccin (un UltraSPARC a 200Mhz), esta consulta devuelve cerca de 150-200 filas y toma menos de un segundo. La cantidad actual de registros en las tablas usadas en la consulta: Table person_data lentus twin_project twin_data informant_data harmony postal_groups Rows 71074 5291 5286 2012 663 381 100
Existen programas que permiten autenticar usuarios a partir de una base de datos MySQL y tambin escribir ficheros de log en una tabla MySQL. Se puede modificar el formato de logging de Apache para que MySQL pueda interpretarlo, colocando lo siguiente en el fichero de configuracin de Apache:
LogFormat \ "\"%h\",%{%Y%m%d%H%M%S}t,%>s,\"%b\",\"%{Content-Type}o\", \"%U\",\"%{Referer}i\",\"%{User-Agent}i\"" \
Para cargar dentro de MySQL un fichero de log en dicho formato, se puede emplear una sentencia como esta:
LOAD DATA INFILE '/local/access_log' INTO TABLE tbl_name FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
La tabla destino debera ser creada de forma que contenga las columnas tal como las especifica la lnea LogFormat.
184
185
Estos programas son comentados posteriormente en Captulo 8, Programas cliente y utilidades MySQL. Programas que operan independientemente del servidor: myisamchk ejecuta operaciones de mantenimiento de tablas. myisampack genera tablas comprimidas, de slo lectura. mysqlbinlog es una herramienta para procesar archivos de registro binario (binary logs). perror informa el significado de un cdigo de error. myisamchk es comentado posteriormente en Captulo 5, Administracin de bases de datos. Los dems programas tienen su descripcin en Captulo 8, Programas cliente y utilidades MySQL. La mayora de las distribuciones de MySQL incluyen todos los programas mencionados, con excepcin de los que son especficos de cada plataforma. (Por ejemplo, los scripts de inicio de servidor no son necesarios en Windows). Otra excepcin es que las distribuciones RPM son ms especializadas. Existe una RPM para el servidor, otra para los programas cliente, etc. En el caso de no hallar uno o ms programas, consulte Captulo 2, Instalar MySQL para ver informacin sobre los tipos de distribuciones y su contenido. Es posible que se necesite realizar una instalacin adicional.
Los argumentos precedidos por guiones son las opciones del programa. Estas opciones, habitualmente, especifican el tipo de conexin al servidor o afectan el modo de operacin del programa. Las opciones tienen una sintaxis que se describe en Seccin 4.3, Especificar opciones de programa. Los argumentos que no son opciones (que no estan precedidos por guiones) suministran informacin adicional al programa. Por ejemplo, el programa mysql interpreta que el primer argumento no opcin proporcionado es el nombre de la base de datos a utilizar, de forma que el comando mysql test indica que se desea emplear la base de datos test. Las secciones siguientes, donde se describe individualmente cada programa, informan las opciones que es posible utilizar y el significado de los argumentos no opcin adicionales. Algunas opciones son comunes a un nmero de programas. Las ms corrientes son --host, --user, y --password, las cuales especifican parmetros de conexin. Indican el ordenador host donde se est ejecutando el servidor de bases de datos MySQL, y el nombre de usuario y contrasea de la cuenta MySQL empleada para acceder. Estas tres opciones son aplicables a todos los programas cliente MySQL, permiten especificar el servidor al cual conectarse y qu cuenta usar para ello. Es posible que necesite invocar a los programas MySQL utilizando la ruta al directorio bin en el que estn instalados. Este es el caso ms probable si obtiene un mensaje de error program not found cada vez que se intenta ejecutar un programa MySQL desde cualquier directorio que no sea bin.
186
A fin de hacer ms conveniente el uso de MySQL, puede agregar la ruta al directorio bin dentro de la variable de entorno PATH. Entonces, para ejecutar un programa slo se necesitar ingresar su nombre, no la ruta completa. Consulte la documentacin especfica de su intrprete de comandos para obtener instrucciones sobre cmo establecer el valor de PATH, dado que la sintaxis para establecer variables de entorno es propia de cada uno.
187
una forma corta como -ppass_val o como -p. Sin embargo, en la forma corta, si se suministra una contrasea debe figurar a continuacin de la letra de opcin sin espacios intermedios. La razn de esto es que, si hay un espacio a continuacin de la letra de opcin, el programa no tiene modo de saber si el argumento que sigue es la contrasea o alguna otra clase de argumento. Por esto, los siguientes dos comandos tienen significados completamente diferentes:
shell> mysql -ptest shell> mysql -p test
El primer comando le dice a mysql que utilice la contrasea test, pero no indica una base de datos por defecto. El segundo le dice a mysql que solicite la contrasea y que utilice test como base de datos por defecto. Algunas opciones controlan comportamientos que deben habilitarse o deshabilitarse. Por ejemplo, el cliente mysql soporta una opcin --column-names que determina si se mostrar o no una fila con los nombres de cada columna al principio de los resultados de una consulta. Por defecto, esta opcin se encuentra habilitada. Sin embargo, en algunos casos se podria desear que permanezca inhabilitada, por ejemplo cuando la salida producida por mysql debe ser enviada a otro programa que espera slo datos y no una linea inicial de encabezados. Para deshabilitar los nombres de columnas, se especifica la opcin empleando cualquiera de estas formas:
--disable-column-names --skip-column-names --column-names=0
Los prefijos --disable y --skip y el sufijo =0 tienen el mismo efecto: deshabilitar la opcin. El modo enabled (habilitado) de la opcin puede ser especificado en cualquiera de estas formas:
--column-names --enable-column-names --column-names=1
Si una opcin se antecede con el prefijo --loose, el programa no terminar con un error si no es capaz de reconocer la opcin, en lugar de ello emitir una advertencia:
shell> mysql --loose-no-such-option mysql: WARNING: unknown option '--no-such-option'
El prefijo --loose puede ser til cuando se ejecutan programas pertenecientes a mltiples versiones de MySQL en el mismo ordenador. Es particularmente til cuando se utiliza un fichero de opciones. Una opcin que puede no ser reconocida por todas las versiones de un programa, se antecede con el prefijo --loose (o bien loose en el caso de un fichero de opciones). Aquellas versiones de un programa que no reconozcan la opcin emitirn una advertencia y la ignorarn. Nota: Esta estrategia requiere que las versiones involucradas sean la 4.0.2 o posteriores, dado que antes de esa versin no exista el prefijo --loose. Otra opcin que puede ser ocasionalmente til con mysql es -e o --execute, la cual se utiliza para enviar sentencias SQL al servidor. Las sentencias deben estar colocadas entre comillas (dobles o simples). No obstante, si se desea incluir dentro de la consulta valores colocados entre comillas, habra que emplear comillas dobles para delimitar la consulta y simples para los valores en su interior. Cuando se utiliza esta opcin, mysql retorna al prompt del intrprete de comandos inmediatamente despus de ejecutar la sentencia. Por ejemplo, para obtener una lista de cuentas de usuario, puede hacerse lo siguiente:
shell> mysql -u root -p -e "SELECT User, Host FROM user" mysql Enter password: ****** +------+-----------+ | User | Host | +------+-----------+
188
| | gigan | | root | gigan | | | localhost | | jon | localhost | | root | localhost | +------+-----------+ shell>
Observe que el nombre de la base de datos mysql fue pasado como un argumento separado. Sin embargo, la misma consulta se hubiera ejecutado indicando mysql -u root -p -e "SELECT User, Host FROM mysql.user" en el intrprete de comandos. De este modo se pueden ejecutar mltiples sentencias SQL, si se las separa con punto y coma:
shell> mysql -u root -p --execute="SELECT Name FROM Country WHERE Name LIKE 'AU%';SELECT COUNT(*) FROM Enter password: ****** +-----------+ | Name | +-----------+ | Australia | | Austria | +-----------+ +----------+ | COUNT(*) | +----------+ | 4079 | +----------+
Observe que la forma larga (--execute) debe ser seguida por un signo igual(=). La opcin -e puede usarse del mismo modo para pasar comandos al cliente de administracin para MySQL Cluster ndb_mgm. Consulte Seccin 16.3.6, Apagado y encendido seguros para ver un ejemplo.
WINDIR representa la ubicacin del directorio Windows. Por lo general, es C:\WINDOWS o C:\WINNT. Se puede determinar la localizacin exacta a travs del valor de la variable de entorno WINDIR utilizando el siguiente comando:
C:\> echo %WINDIR%
189
INSTALLDIR representa el directorio de instalacin de MySQL. Este es generalmente C: \PROGRAMDIR\MySQL\MySQL 5.0 Server, donde PROGRAMDIR representa el directorio de programas (usualmente Archivos de Programa en versiones de Windows en espaol), donde se instal MySQL 5.0 mediante los asistentes de instalacin y configuracin. Consulte Seccin 2.3.5.14, Dnde est el fichero my.ini. En Unix, los programas MySQL leen sus opciones de inicio en los siguientes ficheros: Fichero /etc/my.cnf $MYSQL_HOME/my.cnf defaults-extra-file ~/.my.cnf Contenido Opciones globales Opciones especficas del servidor El archivo especificado con --defaults-extra-file=ruta, si existe. Opciones especficas del usuario
MYSQL_HOME es una variable de entorno que contiene la ruta al directorio donde reside el fichero my.cnf especfico del servidor. (Este era DATADIR anteriormente a MySQL versin 5.0.3.) Si MYSQL_HOME no tiene un valor establecido y hay un fichero my.cnf en DATADIR y no hay un fichero my.cnf en BASEDIR, mysqld_safe establece el valor de MYSQL_HOME en DATADIR. De otro modo, si MYSQL_HOME no tiene un valor establecido y no hay un fichero my.cnf en DATADIR, entonces mysqld_safe establece el valor de MYSQL_HOME en BASEDIR. Generalmente es /usr/local/mysql/data para una instalacin binaria o /usr/local/var para una instalacin de cdigo fuente. Observe que se trata de la ubicacin del directorio de datos que se indic al momento de la configuracin, no de la especificada con --datadir cuando se inicia mysqld. El uso de --datadir no tiene efecto sobre el lugar donde el servidor busca los ficheros de opciones, porque esta bsqueda se produce antes de procesar cualquier argumento de lnea de comandos. MySQL busca ficheros de opciones exactamente en el orden descripto en la tabla y lee cualquiera que exista. Si se desea utilizar un fichero de opciones que no existe, se lo debe crear con un editor de texto plano. De existir mltiples ficheros de opciones, las opciones leidas en ltimo lugar prevalecen sobre las anteriores. Nota: En plataformas Unix, MySQL ignorar todo fichero de configuracin que tenga permiso worldwritable (esto es, modificable por todos los usuarios). Esto ha sido implementado intencionalmente como medida de seguridad. Cualquier opcin en formato de nombre largo que pueda suministrarse en la lnea de comandos al ejecutar un programa MySQL puede ser colocada tambin en un fichero de opciones. Para obtener la lista de opciones disponibles para un programa determinado, el mismo debe ejecutarse con la opcin --help. La sintaxis para especificar opciones en un fichero es similar a cuando se hace en la lnea de comandos, con la excepcin de que se deben omitir los dos guiones iniciales.Por ejemplo, -quick o --host=localhost en la linea de comandos debera especificarse como quick o host=localhost en un fichero de opciones. Para indicar una opcin de la forma -loose-opt_name en un fichero, debe escribirse como loose-opt_name. Las lineas vacas de los ficheros de opciones se ignoran. Las lneas no vacas pueden tomar cualquiera de las siguientes formas: #comentario, ;comentario Las lneas de comentario comienzan con '#' o ';'. Un comentario '#' puede aparecer incluso en el medio de una linea. [grupo]
190
grupo es el nombre del programa o grupo para el cual se desea establecer opciones. Despus de una linea de este tipo, cualquier linea opcin o set-variable se aplicar a ese grupo hasta el final del fichero o hasta que se encuentre otra lnea grupo. opcin Equivale a --opcin en la lnea de comandos. opcin=valor Equivale a --opcin=valor en la lnea de comandos. En un fichero de opciones est permitido colocar espacios a ambos lados del carcter '=', algo que no es posible en la lnea de comandos. En MySQL 5.0 se puede encerrar el valor entre comillas simples o dobles. Esto es til si el valor contiene un carcter como comentario '#' o espacios en blanco. Los espacios en blanco sobrantes son automticamente eliminados de los nombres de opciones y valores. se pueden utilizar las secuencias de escape '\b', '\t', '\n', '\r', '\\', y '\s' al especificar el valor de una opcin si es necesario representar los caracteres backspace, tab, salto de linea, retorno de carro y espacio. En Windows, si el valor de una opcin representa una ruta a un directorio o un fichero, se debera especificar el valor utilizando '/' en lugar '\' como separador. Si se emplea '\', debe duplicarse y poner '\\', puesto que '\' es el caracter de escape en MySQL. Si el nombre de un grupo es igual que el de un programa, las opciones en el grupo se aplicarn especficamente a ese programa. El grupo de opciones [client] es leido por todos los programas clientes (pero no por mysqld). Esto permite especificar opciones aplicables a todos los clientes. Por ejemplo, [client] es el grupo perfecto para indicar la contrasea que se utiliza para conectarse al server. (Pero es necesario asegurarse que el fichero de opciones es accesible para lectura y escritura solamente por Usted, de modo que otras personas no puedan conocer la contrasea). Una opcin no debe colocarse en el grupo [client] a menos que sea reconocida por todos los programas cliente que se utilizan. Los programas que no la soporten terminarn despus de mostrar un mensaje de error si se los intenta ejecutar. A partir de MySQL 5.0.4 en la serie 5.0, es posible emplear directivas !include en los ficheros de opciones para incluir ficheros especficos y !includedir para incluir directorios Por ejemplo, para incluir el fichero /home/mydir/myopt.cnf, se puede usar lo siguiente:
!include /home/me/myopt.cnf
Para buscar en el directorio /home/mydir todos los ficheros con extensin .cnf y leerlos como ficheros de opciones, se debera utilizar:
!includedir /home/mydir
Observe que estas opciones son especficas de cada seccin. Por ejemplo, suponga que fuera a utilizar en my.cnf algo como lo siguiente:
[mysqld] !include /home/mydir/myopt.cnf
En ese caso, el fichero myopt.cnf slo sera procesado por el servidor, y la directiva !include sera ignorada por cualquier aplicacin cliente. Sin embargo, si empleara:
[mysqldump] !includedir /home/mydir/my-dump-options
entonces el directorio /home/mydir/my-dump-options sera verificado en busca de ficheros de opciones con extensin .cnf nicamente por mysqldump y no por el servidor o por otras aplicaciones cliente.
191
Nota: En la actualidad, cualquier fichero que deba ser encontrado e incluido al usar la directiva ! includedir debe tener en su nombre la extensin .cnf. En Windows, esta directiva tambin verifica en busca de ficheros con extensin .ini. En la versin 4.0.14 de MySQL y posteriores, si se desea crear un grupo de opciones que deba ser leido nicamente por una versin especfica de mysqld, se puede hacer dando a los grupos de opciones nombres como los siguientes: [mysqld-4.0], [mysqld-4.1], [mysqld-5.0], y as sucesivamente. El siguiente grupo indica que la opcin --new debera ser aplicada slo por servidores de bases de datos MySQL versin 5.0.x:
[mysqld-5.0] new
El fichero de opciones anterior utiliza la sintaxis var_name=value para las lneas que establecen los valores de las variables key_buffer_size y max_allowed_packet. Este es un fichero de opciones de usuario tpico:
[client] # El siguiente password se enviar a todos los clientes MySQL estndar password="my_password" [mysql] no-auto-rehash connect_timeout=2 [mysqlhotcopy] interactive-timeout
Si tiene una distribucin de cdigo fuente, podr encontrar ficheros de opciones de ejemplo llamados my-xxxx.cnf en el directorio support-files. Si tiene una distribucin binaria, busque en el directorio support-files bajo el directorio de instalacin de MySQL. En Windows, los ficheros de opciones de ejemplo tambin se encuentran en el directorio de instalacin de MySQL. (vea anteriormente en esta seccin o Captulo 2, Instalar MySQL si no sabe dnde se encuentra este directorio). Actualmente hay ficheros de opciones para sistemas pequeos, medios, grandes y muy grandes. Para experimentar con uno de estos ficheros, se lo debe copiar como C:\my.cnf en Windows o como .my.cnf en el directorio home en Unix. Nota: La extensin .cnf de los ficheros de opciones podra no mostrarse en Windows Todos los programas MySQL que soportan ficheros de opciones manejan las siguientes opciones de lnea de comandos: --no-defaults No lee ningn fichero de opciones. --print-defaults Imprime el nombre del programa y todas las opciones que obtiene desde los ficheros de opciones.
192
--defaults-file=path_name Utiliza solamente el fichero de opciones especificado. path_name es la ruta completa al fichero. --defaults-extra-file=path_name Utiliza el fichero de opciones especificado, lo procesa luego del fichero global de opciones pero antes del fichero de opciones del usuario. path_name es la ruta completa al fichero. Para funcionar correctamente, cada una de estas opciones debe colocarse en la lnea de comandos inmediatamente a continuacin del nombre del comando, a excepcin de --print-defaults que puede aparecer luego de --defaults-file o --defaults-extra-file. En los scripts del shell puede utilizar el programa my_print_defaults para procesar ficheros de opciones. El siguente ejemplo muestra la salida que my_print_defaults producira al solicitarle que muestre las opciones halladas en los grupos [client] y [mysql]:
shell> my_print_defaults client mysql --port=3306 --socket=/tmp/mysql.sock --no-auto-rehash
Nota para desarrolladores: El manejo de ficheros de opciones est implementado en la librera cliente C simplemente a travs del procesamiento de todas las opciones coincidentes (esto es, opciones en el grupo apropiado) antes que cualquier argumento de la lnea de comandos. Esto funciona bien con programas que emplean la ltima aparicin de una opcin especificada mltiples veces. Si se tiene un programa C o C++ que maneja opciones especificadas mltiples veces pero que no lee ficheros de opciones, se necesita agregar solamente dos lineas para darle esa capacidad. Examine el cdigo fuente de cualquiera de los programas cliente estndar de MySQL para ver cmo se hace. Varias otras interfaces con MySQL pertenecientes a otros lenguajes se basan en la librera cliente de C, y algunas de ellas proporcionan una forma de acceder al contenido de ficheros de opciones. Esto incluye a Perl y Python. Consulte la documentacin de su interface preferida para ms detalles.
La sintaxis en Unix depende del shell. En el supuesto de que se quisiera especificar el nmero de puerto TCP/IP empleando la variable MYSQL_TCP_PORT, la sintaxis tpica (tal como se hace en sh, bash, zsh, etc.) es la siguiente:
MYSQL_TCP_PORT=3306 export MYSQL_TCP_PORT
El primer comando establece el valor de la variable, y el comando export exporta la variable hacia el entorno del shell de forma que su valor sea accesible a MySQL y otros procesos. csh y tcsh son un caso similar. Cuando se ejecuta estos shells, se debe usar setenv para que el valor de la variable est disponible para el entorno:
setenv MYSQL_TCP_PORT 3306
El comando que establece el valor de las variables de entorno puede ejecutarse en el intrprete de comandos para que tenga efecto inmediatamente. Estos valores existen hasta que se cierra la sesin de usuario. Para que los valores tomen efecto cada vez que se inicia sesin, deben ubicarse los comandos en un fichero de inicio que el intrprete de comandos lea en cada arranque. Algunos
193
ficheros de inicio tpicos son AUTOEXEC.BAT para Windows, .bash_profile para bash, o .tcshrc para tcsh. Consulte la documentacin de su intrprete de comandos para detalles ms especficos. En Apndice E, Variables de entorno se listan todas las variables de entorno que afectan la operacin de los programas MySQL.
El primer comando especifica el valor en bytes. El segundo especifica el valor en megabytes. Los valores de las variables pueden tener un sufijo K, M, o G (ya sea en maysculas o minsculas) para indicar la unidad, que puede ser kilobytes, megabytes, o gigabytes. En un fichero de opciones, la variable se coloca sin precederla con dos guiones:
[mysql] max_allowed_packet=16777216
O bien:
[mysql] max_allowed_packet=16M
Si lo prefiere, los caracteres de subrayado en una variable pueden cambiarse por guiones: Nota: La antigua sintaxis --set-variable = opcion=valor an se reconoce en MySQL 5.0, pero est obsoleta Algunas variables del servidor pueden recibir valores en tiempo de ejecucin. Para ms detalles, consulte Seccin 5.3.3.1, Variables de sistema dinmicas.
194
195
5.9.4. Los vectores de definicin de caracteres .................................................................. 336 5.9.5. Soporte para colacin de cadenas de caracteres ...................................................... 337 5.9.6. Soporte de caracteres multi-byte .............................................................................. 337 5.9.7. Problemas con conjuntos de caracteres .................................................................... 337 5.9.8. Soporte de zonas horarias en el servidor MySQL ...................................................... 338 5.10. Los ficheros de registro (log) de MySQL ............................................................................ 339 5.10.1. El registro de errroes (Error Log) ............................................................................ 339 5.10.2. El registro general de consultas ............................................................................. 340 5.10.3. El registro binario (Binary Log) ............................................................................... 340 5.10.4. El registro de consultas lentas (Slow Query Log) ..................................................... 344 5.10.5. Mantenimiento de ficheros de registro (log) ............................................................. 345 5.11. Ejecutar ms de un servidor MySQL en la misma mquina ................................................. 345 5.11.1. Ejecutar varios servidores en Windows ................................................................... 347 5.11.2. Ejecutar varios servidores en Unix .......................................................................... 350 5.11.3. Utilizacin de programas cliente en un entorno de mltiples servidores ..................... 351 5.12. La cach de consultas de MySQL ..................................................................................... 352 5.12.1. Cmo opera la cach de consultas ......................................................................... 352 5.12.2. Opciones de SELECT para la cach de consultas .................................................... 354 5.12.3. Configuracin de la cach de consultas .................................................................. 354 5.12.4. Estado y mantenimiento de la cach de consultas ................................................... 355 Este captulo cubre tpicos que tratan la administracin de una instalacin de MySQL, como configurar el servidor, administrar cuentas de usuario y realizar copias de seguridad.
5.1.1. Panormica de los programas scripts y las utilidades del lado del servidor (server-side)
Todos los programas MySQL aceptan diferentes opciones. Sin embargo, cada programa MySQL proporciona una opcin --help que puede usar para obtener una descripcin de las opciones del programa. Por ejemplo, pruebe mysqld --help. Puede cambiar las opciones por defecto en todos los programas estndar especificando opciones en la lnea de comandos o en un fichero de opciones. Seccin 4.3, Especificar opciones de programa. La siguiente lista describe brevemente MySQL server y sus programas relacionados: mysqld El demonio SQL (esto es, el servidor MySQL). Para usar programas clientes, este programa debe estar en ejecucin, ya que los programas ganan el acceso a la base de datos conectndose al servidor. Consulte Seccin 5.3, Configuracin del servidor MySQL. mysqld-max Una versin del servidor que incluye caractersticas adicionales. Consulte Seccin 5.1.2, El servidor extendido de MySQL mysqld-max. mysqld_safe
196
Un script de arranque del servidor. mysqld_safe intenta inicializar mysqld-max si existe, y mysqld en caso contrario. Consulte Seccin 5.1.3, El script de arranque del servidor mysqld_safe. mysql.server Un script de arranque del servidor. Este script se usa en sistemas que utilizan directorios de ejecucin que contienen scripts que inicializan servicios para niveles de ejecucin particular. Invoque mysqld_safe para inicializar el servidor MySQL. Consulte Seccin 5.1.4, El script mysql.server para el arranque del servidor. mysqld_multi Un script de arranque del servidor que puede arrancar o parar varios servidores instalados en el sistema. Consulte Seccin 5.1.5, El programa mysqld_multi para gestionar mltiples servidores MySQL. mysql_install_db Este script crea las tablas de permisos de MySQL con privilegios por defecto. Normalmente se ejecuta slo una vez, cuando se instala por primera vez MySQL en el sistema. Consulte Seccin 2.9.2, Pasos a seguir despus de la instalacin en Unix. mysql_fix_privilege_tables Este script se usa tras una actualizacin, para actualizar las tablas de permisos con cualquier cambio que se hayan hecho en nuevas versiones de MySQL. Consulte Seccin 2.10.2, Aumentar la versin de las tablas de privilegios. Hay otros programas que tambin se ejecutan en la mquina del servidor: myisamchk Una utilidad para describir, testear, optimizar y reparar tablas MyISAM. myisamchk se describe en Seccin 5.8.3, Mantenimiento de tablas y recuperacin de un fallo catastrfico (crash). make_binary_distribution Este programa crea una publicacin binaria de un MySQL compilado. Puede enviarse por FTP a / pub/mysql/upload/ a ftp.mysql.com para el uso de otros usuarios de MySQL. mysqlbug El script para reportar bugs. Puede usarse para enviar un reporte de bug a la lista de correo de MySQL. (Puede visitar http://bugs.mysql.com/ para rellenar un reporte de bug en lnea. Consulte Seccin 1.6.1.3, Cmo informar de bugs y problemas.)
197
RPM MySQL-Max para instalar el servidor llamado mysqld-max. El RPM MySQL-Max presupone que el RPM con el servidor normal est instalado. Consulte Seccin 2.4, Instalar MySQL en Linux para ms informacin sobre los paquetes RPM para Linux. Todas las otras distribuciones MySQL-Max contienen un nico servidor llamado mysqld pero que tiene las caractersticas adicionales includas. Puede encontrar los binarios para MySQL-Max en la pgina Web de MySQL AB en http:// dev.mysql.com/downloads/. MySQL AB compila el servidor MySQL-Max usando las siguientes opciones de configure: --with-server-suffix=-max Esta opcin aade un sufijo -max a la cadena de caracteres mysqld de la versin. --with-innodb Esta opcin activa el soporte para el motor de almacenamiento InnoDB. Los servidores MySQLMax siempre incluyen soporte para InnoDB . Desde MySQL 4.0 en adelante, se incluye por defecto InnoDB en todas las distribuciones binarias, por lo que no necesita un servidor MySQL-Max simplemente para obtener soporte para InnoDB. --with-bdb Esta opcin activa el soporte para el motor de almacenamiento Berkeley DB (BDB). USE_SYMDIR Esta definicin est activada para activar el soporte para links simblicos en Windows. En MySQL 5.0, el soporte para links simblicos est disponible para todos los servidores Windows, as que un servidor Max no es necesario para aprovechar esta caracterstica. --with-ndb-cluster Esta opcin activa el soporte para el motor de almacenamiento NDB Cluster . Actualmente (como en5.0.9-beta), el Cluster se soporta en Linux, Solaris, y Mac OS X solamente. Algunos usuarios han reportado xitos al utilizar MySQL Cluster compilado de las fuentes en sistemas operativos basados en BSD, pero no estn soportados oficialmente de momento. Las distribuciones binarias de MySQL-Max son tiles para aqullos que quieran instalar programas precompilados. Si compila MySQL a partir de una distribucin fuente, puede construir su propio servidor de estilo Max activando las mismas caractersticas en tiempo de configuracin que usan las distribuciones binarias de MySQL-Max al ser creadas. Los servidores MySQL-Max incluyen el motor de almacenamiento BerkeleyDB (BDB) cuando es posible, pero no todas las plataformas soportan BDB. Los servidores MySQL-Max para Solaris, Mac OS X, y Linux (en la mayora de plataformas) incluyen soporte para el motor de almacenamiento NDB Cluster . Tenga en cuenta que el servidor debe reiniciarse con la opcin ndbcluster para ejecutar el servidor como parte de un MySQL Cluster. (Para ms detalles, consulte Seccin 16.4, Configuracin de MySQL Cluster.) La siguiente tabla muestra en qu plataformas los binarios de MySQL-Max incluyen soporte para BDB y/o NDB Cluster: Sistema AIX 4.3 HP-UX 11.0 198 Soporte BDB N N Soporte NDB N N
Linux-Alpha Linux-IA-64 Linux-Intel Mac OS X NetWare SCO OSR5 Solaris-SPARC Solaris-Intel UnixWare Windows NT/2000/XP
N N S N N S S N S S
S N S N N N S S N N
Para ver los motores de almacenamiento que soporta su servidor, ejecute el siguiente comando:
mysql> SHOW ENGINES; +------------+---------+----------------------------------------------------------------+ | Engine | Support | Comment | +------------+---------+----------------------------------------------------------------+ | MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | | HEAP | YES | Alias for MEMORY | | MERGE | YES | Collection of identical MyISAM tables | | MRG_MYISAM | YES | Alias for MERGE | | ISAM | NO | Obsolete storage engine, now replaced by MyISAM | | MRG_ISAM | NO | Obsolete storage engine, now replaced by MERGE | | InnoDB | YES | Supports transactions, row-level locking, and foreign keys | | INNOBASE | YES | Alias for INNODB | | BDB | YES | Supports transactions and page-level locking | | BERKELEYDB | YES | Alias for BDB | | NDBCLUSTER | NO | Clustered, fault-tolerant, memory-based tables | | NDB | NO | Alias for NDBCLUSTER | | EXAMPLE | NO | Example storage engine | | ARCHIVE | YES | Archive storage engine | | CSV | NO | CSV storage engine | | FEDERATED | YES | Federated MySQL storage engine | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | +------------+---------+----------------------------------------------------------------+ 18 rows in set (0.00 sec)
(Consulte tambin Seccin 13.5.4.8, Sintaxis de SHOW ENGINES.) Antes de MySQL 4.1.2, SHOW ENGINES no est disponible. Use el siguiente comando en su lugar y compruebe que el valor de la variable para el motor de almacenamiento en que est interesado:
mysql> SHOW VARIABLES LIKE 'have%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | have_archive | YES | | have_bdb | YES | | have_blackhole_engine | YES | | have_compress | YES | | have_crypt | NO | | have_csv | NO | | have_example_engine | NO | | have_federated_engine | YES | | have_geometry | YES | | have_innodb | YES | | have_isam | NO | | have_ndbcluster | NO | | have_openssl | YES | | have_query_cache | YES | | have_raid | NO | | have_rtree_keys | YES | | have_symlink | YES |
199
La salida precisa de estos comandos SHOW variar en funcin de la versin de MySQL usada (y las caractersticas que haya activadas). Los valores en la segunda columna indican el nivel de soporte por parte del servidor para cada caracterstica, como se muestra: Valor YES NO DISABLED Significado La caracterstica se soporta y est activa. La caracterstica no se soporta. La caracterstica se soporta pero no est activa.
Un valor NO significa que el servidor est compilado sin soporte para la caracterstica, por lo que no puede activarse en tiempo de ejecucin. Un valor DISABLED aparece porque el servidor se arranc con una opcin que deshabilita la caracterstica, o porque no todas las opciones requeridas para activarla se han dado. En el ltimo caso, el fichero de log de error host_name.err debera contener la razn indicando porqu la opcin est deshabilitada. Puede ver el mensaje DISABLED para los motores de almacenamiento InnoDB, BDB, o ISAM si el servidor est compilado para soportarlos pero se arranc con las opciones --skip-innodb, -skip-bdb, o --skip-isam en tiempo de ejecucin. Todos los servidores MySQL soportan tablas MyISAM , ya que MyISAM es el motor de almacenamiento por defecto.
200
mysqld_safe lee todas las opciones de las secciones [mysqld], [server], y [mysqld_safe] de los archivos de opciones. Por compatibilidad con versiones anteriores, tambin lee las secciones [safe_mysqld], aunque deben renombrarse dichas secciones a [mysqld_safe] en MySQL 5.0. mysqld_safe soporta las siguientes opciones: --help Muestra un mensaje de ayuda y finaliza. (Aadido en MySQL 5.0.3) --basedir=ruta La ruta al directorio de instalacion de MySQL. --core-file-size=tamao El tamao del archivo de volcado de memoria que mysqld debera ser capaz de crear. El valor de la opcin se pasa a ulimit -c. --datadir=ruta La ruta al directorio de datos. --defaults-extra-file=ruta El nombre de un archivo de opciones para ser ledo adems de los habituales. --defaults-file=ruta El nombre de un archivo de opciones para ser ledo en vez de los habituales. --ledir=ruta La ruta a el directorio que contiene el programa mysqld. Se utiliza esta opcin para indicar explcitamente la localizacin del servidor. --log-error=ruta Escribir el registro de errores en el archivo dado. Consulte Seccin 5.10.1, El registro de errroes (Error Log). --mysqld=nombre_prog El nombre del programa servidor (en el directorio ledir) que se quiere ejecutar. Esta opcin es necesaria si se utiliza la distribucin binaria de MySQL pero el directorio de datos est fuera de la distribucin binaria. --mysqld-version=sufijo Esta opcin es similar a la opcin --mysqld, pero se especifica nicamente el sufijo para el nombre del programa servidor. El nombre base se asume que es mysqld. Por ejemplo, si se usa -mysqld-version=max, mysqld_safe inicia el programa en el directorio ledir. Si el argumento de --mysqld-version est vacio, mysqld_safe usa mysqld en el directorio ledir. --nice=prioridad Se utiliza el programa nice para establecer la prioridad del servidor a un valor dado. --no-defaults No leer ningn archivo de opciones. --open-files-limit=nmero
201
El nmero de ficheros que mysqld debera ser capaz de abrir. El valor de la opcin se pasa a ulimit -n. Ntese que se necesita iniciar mysqld_safe como root para que esto funcione correctamente. --pid-file=ruta La ruta al archivo de ID del proceso. --port=num_puerto El nmero de puerto a usar cuando se esperan conexiones TCP/IP. --socket=ruta El archivo de socket de unix a utilizar para conexiones locales. --timezone=zona Establece la variable de ambiente de zona horaria TZ a el valor dado. Conslte la documentacin del sistema operativo para formatos legales de especificacin de zonas horarias. --user={nombre_usuario | id_usuario} Ejecuta el servidor mysqld como el usuario con nombre nombre_usuario o el ID numrico de usuario id_usuario. (``Usuario'' en este contexto se refiere a una cuenta de login del sistema, no a un usuario MySQL includo en las tablas grant.) El script mysqld_safe est escrito de manera que normalmente puede iniciar un servidor que ha sido instalado tanto desde cdigo fuente o desde una distribucin binaria de MySQL, an cuando tpicamente estos tipos de distribuciones instalan el servidor en lugares ligeramente diferentes. (Consulte Seccin 2.1.5, Conformacin de la instalacin.) mysqld_safe espera que una de las siguientes condiciones sea cierta: El servidor y las bases de datos pueden ser encontradas en una ruta relativa al directorio desde el que mysqld_safe es invocado. Para distribuciones binarias, mysqld_safe busca bajo su directorio de trabajo los directorios bin y data. En distribuciones de cdigo fuente, busca los directorios libexec y var. Esta condicin debe cumplirse si se ejecuta mysqld_safe desde el directorio de instalacin de MySQL (por ejemplo, /usr/local/mysql para una distribucin binaria). Si el servidor y las bases de datos no pueden encontrarse en una ruta relativa al directorio de trabajo, mysqld_safe intenta localizarlos mediante rutas absolutas. /usr/local/libexec y /usr/local/var son localizaciones tpicas. Las localizaciones efectivas se determinan por los valores configurados en la distribucin en el momento en que fue creada. Deberan ser correctos si MySQL est instalado en la localizacin especificada en el momento de la configuracin. Debido a que mysqld_safe trata de encontrar el servidor y las bases de datos de manera relativa a su propio directorio de trabajo, puede instalarse una distribucin binaria de MySQL en cualquier lugar, siempre y cuando se ejecute mysqld_safe desde el directorio de instalacin de MySQL:
shell> cd directorio_instalacion_mysql shell> bin/mysqld_safe &
Si mysqld_safe falla, an cuando ha sido invocado desde el directorio de instalacin de MySQL, se pueden especificar las opciones --ledir y --datadir para indicar los directorios en los que el servidor y las bases de datos estn dentro del sistema. Normalmente, no se debera editar el script mysqld_safe. En vez de ello, ha de configurarse mysqld_safe utilizando opciones de lnea de comandos u opciones en la seccin [mysqld_safe] de un archivo de opciones my.cnf. En casos aislados, podra ser necesario editar mysqld_safe para que inicie el servidor apropiadamente. No obstante, si se hace esto, la versin modificada de
202
mysqld_safe podra ser sobreescrita si se actualiza la versin de MySQL en el futuro, as que debera hacerse una copia de la versin editada que pudiera reinstalarse. En NetWare, mysqld_safe es un NetWare Loadable Module (NLM) que ha sido portado desde el script original de Unix. Hace lo siguiente: 1. Ejecuta un nmero de comprobaciones del sistema y de opciones. 2. Ejecuta comprobaciones sobre tablas MyISAM. 3. Provee de una presencia en pantalla a el servidor MySQL. 4. Inicia mysqld, lo supervisa, y lo reinicia si termina con error. 5. Enva mensajes de error desde mysqld a el archivo host_name.err en el directorio de datos. 6. Enva la salida por pantalla de mysqld_safe hacia el archivo host_name.safe en el directorio de datos.
203
Para ms informacin sobre qu opciones deben ser nicas por servidor en un entorno de mltiples servidores, consulte Seccin 5.11, Ejecutar ms de un servidor MySQL en la misma mquina. Para invocar mysqld_multi, use la siguiente sintaxis:
shell> mysqld_multi [options] {start|stop|report} [GNR[,GNR]...]
start, stop, y report indican qu operaciones desea realizar. Puede realizar la operacin designada en un nico servidor o en mltiples servidores, dependiendo de la lista GNR que sigue al nombre de la opcin. Si no hay ninguna lista, mysqld_multi realiza la operacin para todos los servidores en el fichero de opciones. Cada valor GNR representa un nmero de grupo de opciones o rango de nmeros de grupo. El valor debe ser un nmero al final de un nombre de grupo en el fichero de opciones. Por ejemplo, el GNR para un grupo llamado [mysqld17] es 17. Para especificar un rango de nmeros, separe el primero y ltimo nmero por un guin. El valor GNR 10-13 reperesenta los grupos desde [mysqld10] hasta [mysqld13]. Multiples grupos o rangos de grupos pueden especificarse en la lnea de comandos, separados por comas. No deben haber carceteres de espacios en blanco (espacios o tabuladores) en la lista+ GNR ; cualquier cosa despus de un carcter de espacio en blanco se ignora. Este comando arranca un nico servidor usando el grupo de opciones [mysqld17]:
shell> mysqld_multi start 17
Este comando para diversos servidores, usando los grupos de opciones [mysql8] y del [mysqld10] hasta el [mysqld13]:
shell> mysqld_multi stop 8,10-13
Para un ejemplo sobre cmo puede crear un fichero de opciones, use este comando:
shell> mysqld_multi --example
mysqld_multi soporta las siguientes opciones: --config-file=nombre Especifique el nombre de un fichero de opciones alternativo. Esto afecta a dnde mysqld_multi busca grupos de opciones [mysqld#] . Sin esta opcin todas las opciones se leen del fichero habitual my.cnf. La opcin no afecta a dnde mysqld_multi lee sus propias opciones, que siempre se toman del grupo [mysqld_multi] en el fichero habitual my.cnf. --example Muestra un fichero de opciones de ejemplo.. --help Muestra un mensaje de ayuda y sale. --log=nombre Especifica el nombre del fichero de log. Si el fichero existe, la salida de log se aade al mismo. --mysqladmin=prog_name El binario mysqladmin a usar para parar los servidores. --mysqld=prog_name El binario mysqld a usar. Tenga en cuenta que puede especificar mysqld_safe como el valor para esta opcin. Las opciones se pasan a mysqld. Slo asegrese que tiene el directorio donde se encuentra mysqld en su variable de entorno PATH o fije mysqld_safe.
204
--no-log Muestra informacin del log en el stdout en lugar del fichero de log. Por defecto, la salida va al fichero de log. --password=password La constrasea de la cuenta MySQL a usar cuando invoque mysqladmin. Tenga en cuenta que el valor de la contrasea no es opcional para esta opcin, no como en otros programas MySQL. --silent Desactiva los mensajes de advertencia. --tcp-ip Se conecta a cada servidor MySQL via puerto TCP/IP en lugar del fichero socket Unix. (Si un fichero socket no se encuentra, el servidor puede ejecutarse, pero accesible slo via puerto TCP/IP.) Por defecto, las conexiones se hacen usando un fichero socket Unix. Esta opcin afecta las operaciones stop y report. --user=user_name El nombre de usuario de la cuenta MySQL a usar al invocar mysqladmin. --verbose Es ms detallado. --version Muestra informacin sobre la versin y sale. Apuntes acerca de mysqld_multi: Asegrese que la cuenta MySQL usada para parar los servidores mysqld (con el programa mysqladmin ) tienen el mismo nombre de usuario y contrasea para cada servidor. Tambin asegrese que la cuenta tiene el privilegio SHUTDOWN. Si los servidores que quiere administrar tienen distintos nombres de usuario o contraseas para las cuentas administrativas, puede querer crear una cuenta en cada servidor que tenga el mismo nombre de usuario y contrasea. Por ejemplo, puede inicializar una cuenta comn multi_admin ejecutando el siguiente comando en cada servidor:
shell> mysql -u root -S /tmp/mysql.sock -proot_password mysql> GRANT SHUTDOWN ON *.* -> TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
Consulte Seccin 5.6.2, Cmo funciona el sistema de privilegios. Tiene que hacerlo para cada servidor mysqld. Cambie los parmetros de conexin apropiadamente cuando se conecte a cada uno. Tenga en cuenta que la parte de servidor del nombre de la cuenta debe permitirle conectarse como multi_admin desde el servidor desde el que quiere ejecutar mysqld_multi. La opcin --pid-file es muy importante si est usando mysqld_safe para arrancar mysqld (por ejemplo, --mysqld=mysqld_safe) Cada mysqld debe tener su propio fichero con el ID de proceso. La ventaja de usar mysqld_safe en lugar de mysqld es que mysqld_safe ``guarda'' su proceso mysqld y lo reinicia si el proceso termina debido a una seal enviada usando kill -9 o por otras razones, tales como un segmentation fault. Por favor, tenga en cuenta que el script mysqld_safe puede requerir que lo arranque desde un lugar determinado. Esto significa que puede tener que cambiar la localizacin a un cierto directorio antes de ejecutar mysqld_multi. Si tiene problemas arrancando, por favor consulte el script mysqld_safe. Compruebe especialmente las lneas:
----------------------------------------------------------------
205
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 ----------------------------------------------------------------
Consulte Seccin 5.1.3, El script de arranque del servidor mysqld_safe. Los chequeos realizados por estas lneas deberan tener xito, o podra encontrar problemas. El fichero socket de Unix y el puerto TCP/IP deben ser diferentes para cada mysqld. Puede usar la opcin --user para mysqld, pero para hacerlo debe ejecutar el script mysqld_multi como el usuario root en Unix. Tener la opcin en el fichero de opciones no importa; slo obtiene una advertencia si no es el sper usuario y los procesos mysqld se inician bajo su propia cuenta Unix. Importante: Asegrese que el directorio de datos es completamente accesible para todas las cuentas Unix con las que puedea iniciarse el proceso mysqld. No use la cuenta root de Unix para ello, a no ser que sepa lo que hace. Ms importante: Antes de usar mysqld_multi asgurese de entender el significado de las opciones que se pasan a los servidores mysqld y porqu quiere tener procesos mysqld separados. Cuidado con los peligros de usar mltipes servidores mysqld con el mismo directorio de datos. Use diferentes directorios de datos, a no ser que sepa lo que hace. Iniciar mltiples servidores con el mismo directorio de datos no proporciona mejor rendimiento en un entorno threaded. Consulte Seccin 5.11, Ejecutar ms de un servidor MySQL en la misma mquina. El siguiente ejemplo muestra como podra inicializar un fichero de opciones para usar con mysqld_multi. El primer y quinto grupo [mysqld#] se ha omitido intencionadamente del ejemplo para ilustrar que puede tener ``vacos'' en el fichero de opciones. Esto proporciona una mayor flexibilidad. El order en que los programas mysqld arrancan o se paran depende del order en que aparecen en el fichero de opciones.
# 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/mysqld_safe 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
= = = = = =
= = = = = =
= = = = = =
206
= = = = = =
207
Para generar una entrada as debe invocarse IM con la opcin --passwd . Entonces puede redirigir la salida a /etc/mysqlmanager.passwd para aadir un nuevo usuario. Un comando de ejemplo a continuacin.
./mysqlmanager --passwd >> /etc/mysqlmanager.passwd Creating record for new user. Enter user name: mike Enter password: <password> Re-type password: <password>
Nmero de puerto para usar en conexiones (nmero de puerto por defecto, asignado por la IANA, es el 2273). --password-file=name Busca los usuarios y contraseas para el Instance Manger aqu. El fichero por defecto es /etc/ mysqlmanager.passwd. --default-mysqld-path=name Dnde buscar el binario para el MySQL Server si no se proporciona un path en la seccin de instancias. Ejemplo: default-mysqld-path = /usr/sbin/mysqld. --monitoring-interval=# Intervalo en segundos para monitorizar instancias. El IM tratar de conectar a cada una de las instancias monitorizadas para comprobar si estn vivas / no colgadas. En caso de un fallo el IM realizar varios (de hecho muchos) intentos de reiniciar la instancia. Puede desactivar este comportamiento para instancias particulares con la opcin nonguarded en la seccin de instancia apropiada. Si no se proporciona ningn valor, se usan 20 segundos por defecto. --run-as-service Demoniza y arranca el proceso ngel. El proceso ngel es simple y difcil de que falle. Reinicia el IM en caso de fallo. --user=name Nombre de usuario para arrancar y ejecutar mysqlmanager. Se recomienda ejecutar mysqlmanager bajo la misma cuenta de usuario usada para ejectuar el servidor mysqld. -V, --version Muestra informacin de la versin y sale.
Las secciones de instancias especifican opciones dadas a cada instancia al arrancar. La mayora son comunes con las opciones de MySQL Server, pero hay algunas especficas para el IM: mysqld-path = <path-to-mysqld-binary> La ruta al binario del servidor mysqld. shutdown-delay = # Nmero de segundos que IM debe esperar para que una instancia se cierre. Por defecto son 35 segundos. Cuando acaba el tiempo, IM asume que la instancia est colgada y trata de hacer un kill -9 . Si usa InnoDB con tablas grandes, debe incrementar este valor.
209
nonguarded Esta opcion debe activarse si se quiere desactivar la funcionalidad de monitoreo de IM para una instancia concreta. Diversas secciones de instancias de ejemplo a continuacin.
[mysqld] mysqld-path=/usr/local/mysql/libexec/mysqld socket=/tmp/mysql.sock port=3307 server_id=1 skip-stack-trace core-file skip-bdb log-bin log-error log=mylog log-slow-queries [mysqld2] nonguarded port=3308 server_id=2 mysqld-path= /home/cps/mysql/trees/mysql-4.1/sql/mysqld socket = /tmp/mysql.sock4 pid-file = /tmp/hostname.pid4 datadir= /home/cps/mysql_data/data_dir1 language=/home/cps/mysql/trees/mysql-4.1/sql/share/english log-bin log=/tmp/fordel.log
210
SHOW INSTANCE OPTIONS <instance_name> Muestra las opciones usadas por una instancia:
mysql> SHOW INSTANCE OPTIONS mysqld3; +---------------+---------------------------------------------------+ | option_name | value | +---------------+---------------------------------------------------+ | instance_name | mysqld3 | | mysqld-path | /home/cps/mysql/trees/mysql-4.1/sql/mysqld | | port | 3309 | | socket | /tmp/mysql.sock3 | | pid-file | hostname.pid3 | | datadir | /home/cps/mysql_data/data_dir1/ | | language | /home/cps/mysql/trees/mysql-4.1/sql/share/english | +---------------+---------------------------------------------------+ 7 rows in set (0.01 sec)
SHOW <instance_name> LOG FILES El comando poroporciona un listado de todos los ficheros de log usados por la instancia. El conjunto resultado contiene el path al fichero de log y al fichero de configuracin (i.e. log=/var/ mysql.log), el IM trata de adivinar su ubicacin. Si IM no es capaz de localizar el fichero de logs, debe especificarlo explcitamente.
mysql> SHOW mysqld LOG FILES; +-------------+------------------------------------+----------+ | Logfile | Path | Filesize | +-------------+------------------------------------+----------+ | ERROR LOG | /home/cps/var/mysql/owlet.err | 9186 | | GENERAL LOG | /home/cps/var/mysql/owlet.log | 471503 | | SLOW LOG | /home/cps/var/mysql/owlet-slow.log | 4463 | +-------------+------------------------------------+----------+ 3 rows in set (0.01 sec)
SHOW <instance_name> LOG {ERROR | SLOW | GENERAL} size[,offset_from_end] Este comando recibe una porcin del fichero de log especificado. Ya que la mayora de usuarios estn interesados en los ltimos mensajes de log, el parmetro size define el nmero de bytes que quiere recibir empezando por el final del log. Puede recibir datos del medio del fichero de log especificando el parmetro opcioneal offset_from_end . El siguiente ejemplo recibe 21 bytes de datos, empezando 23 bytes desde el final del fichero de log y acabando 2 bytes al final del fichero de log.:
mysql> SHOW mysqld LOG GENERAL 21, 2; +---------------------+ | Log | +---------------------+ | using password: YES | +---------------------+ 1 row in set (0.00 sec)
SET instance_name.option_name=option_value Este comando edita la configuracin de la instancia especificada para cambiar/aadir opciones a la instancia. El IM asume que el fichero de configuracin est localizado en /etc/my.cnf. Debe comprobar que el fichero existe y que tiene los permisos apropiados.
211
Los cambios hecho en el fichero de configuracin no tendrn efecto hasta reiniciar el servidor MySQL. Adems, estos cambios no se guardan en la cache local de configuracin del Instance Manager hasta que se ejecuta un comando FLUSH INSTANCES. UNSET instance_name.option_name Este comando elimina una opcin de un fichero de configuracin de una instancia.
mysql> UNSET mysqld2.port; Query OK, 0 rows affected (0.00 sec)
Los cambios hecho en el fichero de configuracin no tendrn efecto hasta reiniciar el servidor MySQL. Adems, estos cambios no se guardan en la cache local de configuracin del Instance Manager hasta que se ejecuta un comando FLUSH INSTANCES. FLUSH INSTANCES Este comando fuerza a IM a releer el fichero de configuracin y a refrescar estructuras internas. Este comando debe ejectuarse tras editar el fichero de configuracin. Este comando no reinicia las instancias:
mysql> FLUSH INSTANCES; Query OK, 0 rows affected (0.04 sec)
212
Opciones relacionadas con SSL: Consulte Seccin 5.7.7.5, Opciones relativas a SSL. Opciones de control del log binario: Consulte Seccin 5.10.3, El registro binario (Binary Log). Opciones relacionadas con replicacin: Consulte Seccin 6.8, Opciones de arranque de replicacin. Opciones especficas a motores de almacenamiento particulares: Consulte Seccin 14.1.1, Opciones de arranque de MyISAM, Seccin 14.4.3, Opciones de arranque de BDB, and Seccin 15.4, Opciones de arranque de InnoDB. Tambin puede cambiar los valores de una variable de sistema del servidor usando el nombre de variable como opcin, tal y como se describe ms tarde en esta seccin. --help, -? Muestra un mensaje de ayuda corto y sale. Use las opciones --verbose y --help simultneamente para ver el mensaje entero. --allow-suspicious-udfs Este opcin controla si las funciones definidas por el usuario que slo tienen un smbolo xxx para la funcin principal pueden cargarse. Por defecto, la opcin est desactivada y slo UDFs que tengan al menos un smbolo auxiliar pueden cargarse. Esto previene intentos de cargar funciones de ficheros con objetos compartidos que no contengan UDFs legtimos. En las series de MySQL 5.0 est opcin se aadi en la versin 5.0.3. Consulte Seccin 27.2.3.6, Precauciones de seguridad en funciones definidas por usuarios. --ansi Usa sintaxis SQL (ANSI) en lugar de sintaxis MySQL.Consulte Seccin 1.7.3, Ejecutar MySQL en modo ANSI. Para un control ms preciso sobre el modo SQL del servidor, use la opcin --sqlmode. --basedir=path, -b path El path al directorio de instalacin de MySQL. Todas las rutas se resuelven normalmente relativas a sta. --bind-address=IP La direccin IP a ligar. --console Escribe los mensajes de error por stderr y stdout incluso si --log-error est especificado. En Windows, mysqld no cierra la pantalla de consola si se usa esta opcin. --character-sets-dir=path El directorio donde los conjuntos de caracteres estn instalados. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. --chroot=path Pone el servidor mysqld en un entorno cerrado durante el arranque usando la llamada de sistema chroot(). Esta es una medida de seguridad recomendada. Tenga en cuenta que el uso de esta opcin limita de alguna manera LOAD DATA INFILE y SELECT ... INTO OUTFILE. --character-set-server=charset Usa charset como el conjunto de caracteres por defecto del servidor. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin.
213
--core-file Escribe un fichero core si mysqld muere. Para algunos sistemas, tambin puede especificar la opcin --core-file-size en mysqld_safe. Consulte Seccin 5.1.3, El script de arranque del servidor mysqld_safe. Tenga en cuenta que en algunos sistemas como Solaris, no obtiene un fichero core si est usando la opcin --user. --collation-server=collation Usa collation como la colacin del servidor por defecto. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. --datadir=path, -h path La ruta al directorio de datos. --debug[=debug_options], -# [debug_options] Si MySQL est configurado con --with-debug, puede usar esta opcin para obtener un fichero de traza de qu est haciendo mysqld . La cadena de caracteres debug_options a menudo es 'd:t:o,file_name'. Consulte Seccin D.1.2, Crear ficheros de traza. (DEPRECATED) --default-character-set=charset Usa charset como el conjunto de caracteres por defecto. Esta opcon est obsoleta a favor de -character-set-server. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. --default-collation=collation Usa collation como colacin por defecto. Esta opcin est obsoleta a favor de --collationserver. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. --default-storage-engine=type Esta opcin es un sinnimo para --default-table-type. --default-table-type=type Cambia el valor por defecto de tipo de tablas. Consulte Captulo 14, Motores de almacenamiento de MySQL y tipos de tablas. --default-time-zone=type Cambia la zona horaria del servidor. Esta opcin cambia la variable global de sistema time_zone . Si no se da esta opcin, la zona horaria por defecto es la misma que la del sistema (dada por el valor de la variable de sistema system_time_zone. --delay-key-write[= OFF | ON | ALL] Como debe usarse la opcin DELAYED KEYS. La escritura retardada de claves provoca que los buffers de claves no se vuelquen entre escrituras para tablas MyISAM . OFF desactiva escritura de claves retardada. ON activa escritura de claves reatardada para aquellas tablas creadas con la opcin DELAYED KEYS . ALL retarda la escritura de claves para todas las tablas MyISAM . Consulte Seccin 7.5.2, Afinar parmetros del servidor. Consulte Seccin 14.1.1, Opciones de arranque de MyISAM. Nota: Si asigna a esta variable el valor ALL, no debe usar tablas MyISAM de otro programa (como de otro servidor MySQL o con myisamchk) cuando una tabla est en uso. Hacerlo provoca corrupcin de los ndices. --des-key-file=file_name
214
Lee las claves por defecto usadas por DES_ENCRYPT() y DES_DECRYPT() de este fichero. --enable-named-pipe Activa el soporte para named pipes. Esta opcin se aplica slo en Windows NT, 2000, XP y 2004, y slo pueden usarse con servidores mysqld-nt y mysqld-max-nt que soporten conexiones para named pipes. --exit-info[=flags], -T [flags] Esta es una mscara de bits de diferentes flags y que puede usar para debugar el servidor mysqld . No use esta opcin a no ser que sepa exactamente lo que hace! --external-locking Activa bloqueo del sistema. Tenga en cuenta que si usa esta opcin en un sistema en que lockd no funcione plenamente (comom en Linux), es fcil para mysqld caer en un deadlock. Esta opcin prviamente era --enable-locking. Nota: Si usa esta opcin para permitir actualizaciones en tablas MyISAM en cualquier proceso MySQL, debe asegurarse que las siguiente condiciones se satisfacen: No debe usar la cach de consultas para consultas que usen tablas actualizadas por otros procesos. No debe usar --delay-key-write=ALL o DELAY_KEY_WRITE=1 en ninguna tabla compartida. La forma ms fcil de asegurar esto es usar siempre --external-locking junto a --delaykey-write=OFF --query-cache-size=0. (Esto no se hace por defecto ya que en muchas configuraciones es til tener una mezcla de las opciones anteriores.) --flush Escribe todos los cambios a disco despus de cada comando SQL. Normalmente MySQL escribe todos los cambios en disco despus de cada comando SQL y deja al sistema operativo la sincronizacin con el disco. Consulte Seccin A.4.2, Qu hacer si MySQL sigue fallando (crashing). --init-file=file Lee comandos SQL de este fichero al arrancar. Cada comando debe ser de una sola lnea y no debe incluir comentarios. --innodb-safe-binlog Aade garanta de consistencia entre el contenido de las tablas InnoDB y el log binario. Consulte Seccin 5.10.3, El registro binario (Binary Log). --language=lang_name, -L lang_name Mensajes de error del cliente en el idioma dado. lang_name puede darse como el nombre del idioma o como la ruta al directorio donde los ficheros de idioma estn instalados. Consulte Seccin 5.9.2, Escoger el idioma de los mensajes de error. --large-pages Algunas arquitecturas hardware o de sistemas operativos soportan paginacin de memoria mayor a la que hay por defecto (normalmente 4 KB). La implementacin de este soporte depende del hardware subyacente y del SO. Aplicaciones que necesiten mucha memoria pueden obtener
215
mejoras de rendimiento usando pginas grandes gracias a reducir los fallos en el Translation Lookaside Buffer (TLB). Actualmente, MySQL soporta slo implementaciones en Linux de soporte para pginas grandes (que se llama HugeTLB en Linux). Tenemos planes de extender este soporte a FreeBSD, Solaris y posiblemente otras plataformas. Antes de poder usar pginas grandes en Linux, es necesario configurar el pool de memoria de HugeTLB. Como referencia, consulte el fichero hugetlbpage.txt en la fuente del kernel Linux. Esta opcin est desactivada por defecto. Se aadi en MySQL 5.0.3. --log[=file], -l [file] Log de conexiones y consultas en este fichero. Consulte Seccin 5.10.2, El registro general de consultas. Si no especifica un nombre de fichero, MySQL usa host_name.log como nombre de fichero. --log-bin=[file] El fichero de logs binario. Loguea todas las consultas que cambian datos en este fichero. Se usa para copias de seguridad y replicacin. Consulte Seccin 5.10.3, El registro binario (Binary Log). Se recomienda especificar un nombre de fichero (consulte Seccin A.8.4, Cuestiones abiertas en MySQL para la razn) en caso contrario MySQL usa host_name-bin como el nombre base para el fichero de logs. --log-bin-index[=file] El fichero ndice para log binario. Consulte Seccin 5.10.3, El registro binario (Binary Log). Si no especifica un nombre de fichero, y si no especifica uno en --log-bin, MySQL usa host_namebin.index como el nombre de fichero. --log-bin-trust-routine-creators[={0|1}] Sin argumento o un argumento de 1, esta opcin inicializa la variable de sistema log_bin_trust_routine_creators a 1. Con un argumento de 0, esta opcin actualiza la variable de sistema a 0.. log_bin_trust_routine_creators afecta cmo MySQL fuerza las restricciones en la creacin de rutinas almacenadas. Consulte Seccin 19.3, Registro binario de procedimientos almacenados y disparadores. Esta opcin se aadi en MySQL 5.0.6. --log-error[=file] Mensajes de error y de arranque en este fichero. Consulte Seccin 5.10.1, El registro de errroes (Error Log). Si no especifica un nombre de fichero, MySQL usa host_name.err como nombre de fichero. Si el nombre de fichero no tiene extensin, una extensin .err se aade al nombre. --log-isam[=file] Loguea todos los cambios ISAM/MyISAM en este fichero (usado slo al debugar ISAM/MyISAM). (DEPRECATED) --log-long-format Loguea informacin extra a cualquiera de los logs que haya activados (log de actualizacin, log de consultas lentas y log binario). Por ejemplo, se aade el nombre de usuario y tiempo de la consulta para todas las consultas. Esta opcin est obsoleta en MySQL 5.0, y ahora representa el comportamiento por defecto para logueo. (Consulte la descripcin para --log-short-format.) La opcin --log-queries-not-using-indexes est disponible para los propsitos de loguear consultas que no usan ndices en el log de consultas lentas --log-queries-not-using-indexes
216
Si usa esta opcin con --log-slow-queries, las consultas que no usan ndices tambin se loguean en el log de consultas lentas. Consulte Seccin 5.10.4, El registro de consultas lentas (Slow Query Log). --log-short-format Loguea menos informacin en cualquiera de los logs activados (log de actualizacin, log binario y log de consultas lentas). Por ejemplo, el nombre de usuario y el tiempo en que se produce la consulta no se guardan para las consultas. --log-slow-admin-statements Loguea comandos lentos administrativos tales como OPTIMIZE TABLE, ANALYZE TABLE, y ALTER TABLE en el log de consultas lentas. --log-slow-queries[=file] Loguea todas las consultas que han tardado ms de long_query_time segundos en ejecutarse en este fichero.. See Seccin 5.10.4, El registro de consultas lentas (Slow Query Log). Consulte las descripciones de las opciones --log-long-format y --log-short-format para ms detalles. --log-warnings, -W Muestra advertencias tales como Aborted connection... en el log de errores. Se recomienda activar esta opcin, por ejemplo, si usa replicacin (obtiene mayor informacin acerca de lo que est ocurriendo, tal como mensajes acerca de fallos de red y reconexiones). Esta opcin est activada por defecto en MySQL 5.0; para desactivarla, use --skip-log-warnings. Las conexiones abortadas no se loguean en el log de errores a no ser que el valor sea mayor que 1. Consulte Seccin A.2.10, Errores de comunicacin y conexiones abortadas. --low-priority-updates Operaciones que modifiquen la tabla (INSERT, REPLACE, DELETE, UPDATE) tiene una prioridad inferior a las selecciones. Tambin puede hacerse va {INSERT | REPLACE | DELETE | UPDATE} LOW_PRIORITY ... para bajar la prioridad de slo una consulta, o con SET LOW_PRIORITY_UPDATES=1 para cambiar la prioridad en un thread. Consulte Seccin 7.3.2, Cuestiones relacionadas con el bloqueo (locking) de tablas. --memlock Bloquea el proceso mysqld en memoria. Funciona con sistemas tales como Solaris que soportan la llamada de sistema mlockall() . Esto puede ser til si tiene un problema en el que el sistema operativo cause que mysqld realice swap en el disco. Tenga en cuenta que el uso de esta operacin requiere que ejecute el servidor como root, lo que normalmente no es una buena idea por razones de seguridad. --myisam-recover [=option[,option...]]] Inicializa el modo de recuperacin en el motor de almacenamiento MyISAM . El valor para esta opcin es cualquier combinacin de los valores DEFAULT, BACKUP,FORCE, o QUICK. Si especifica mltiples valores, seprelos con comas. Puede usarse como valor "" para desactivar esta opcin. Si esta opcin se usa, mysqld, cuando abre una tabla MyISAM , comprueba si la tabla tiene marca de que haya fallado o no se haya cerrado correctamente. (La ltima opcin slo funciona si est ejecutando con la opcin --skip-external-locking.) En este caso, mysqld realiza una comprobacin sobre la tabla. Si la tabla est corrupta, mysqld intenta repararla. La siguientes opciones afectan el funcionamiento de la reparacin: Opcin Descricin
217
Lo mismo que no dar ninguna opcin --myisam-recover. Si el fichero de datos ha cambiado durante la recuperacin, guarda una copia de seguridad del fichero tbl_name.MYD como tbl_name-datetime.BAK. Ejecuta una recuperacin incluso si perdemos ms de un registro del fichero .MYD. No comprueba los registros en la tabla si no hay ningn bloque borrado.
Antes de reparar una tabla automticamente, MySQL aade una nota acerca de ello en el log de errores. Si quiere poder recuperarse de la mayora de problemas sin intervencin por parte del usuario, debe usar las opciones BACKUP,FORCE. Esto fuerza la reparacin de una tabla incluso si algunos registros se borran durante el proceso, pero guarda el antiguo fichero de datos como una copia de seguridad, de forma que posteriormente pueda examinar qu ocurri. --ndb-connectstring=connect_string Cuando use el motor de almacenamiento NDB , es posible determinar el servidor de administracin que distribuye la configuracin del cluster mediante la inicializacin de la opcin de la cadena de conexin. Consulte Seccin 16.4.4.2, El connectstring de MySQL Cluster para la sintaxis. --ndbcluster Si el binario incluye soporte para el motor de almacenamiento NDB Cluster , la opcin por defecto de desactivar el soporte para MySQL Cluster puede ignorarse usando esta opcin. Consulte Captulo 16, MySQL Cluster. --old-passwords Fuerza al servidor a generar un pequeo hash de contraseas (pre-4.1) para nuevas contraseas. Esto es til para compatibilidad con antiguos programas cliente. Consulte Seccin 5.6.9, Hashing de contraseas en MySQL 4.1. --one-thread Slo usa un thread (para debugar bajo Linux). Esta opcin est disponible slo si el servidor est compilado con la opcin de debugar. Consulte Seccin D.1, Depurar un servidor MySQL. --open-files-limit=count Para cambiar el nmero de descriptores de fichero disponibles para mysqld. Si no se inicializa o se asigna otro valor a 0, entonces mysqld usa este valor para reservar descriptores de fichero para usar con setrlimit(). Si el valor es 0, entonces mysqld reserva max_connections*5 o max_connections + table_cache*2 (lo que sea mayor) nmero de ficheros. Puede tratar de incrementar este valor si mysqld le muestra el error "Too many open files." --pid-file=path El path al fichero con el ID de proceso usado por mysqld_safe. --port=port_num, -P port_num El nmero de puerto que se usa para escuchar conexiones TCP/IP. --safe-mode Omite algunas etapas de optimizacin. (DEPRECATED) --safe-show-database Consulte Seccin 5.6.3, Privilegios de los que provee MySQL. --safe-user-create
218
Si est activado, un usuario no puede crear nuevos usuarios con el comando GRANT , si el usuario no tiene el privilegio INSERT para la tabla mysql.user o cualquiera de sus columnas. --secure-auth No permite autenticacin para cuentas que usan las contraseas antiguas (pre-4.1). --shared-memory Activa conexiones mediante memoria compartida con clientes locales. Esta opcin slo est disponible en Windows. --shared-memory-base-name=name El nombre a usar en conexiones mediante memoria compartida. Esta opcin slo est disponible en Windows. --skip-bdb Deshabilita el motor de almacenamiento BDB . Esto ahorra memoria y puede acelerar algunas operaciones. No use esta opcin si necesita tablas BDB. --skip-concurrent-insert Desactiva la habilidad de seleccionar e insertar al mismo tiempo en tablas MyISAM . (Esto slo debe usarse si cree que ha encontrado un bug en esta funcionalidad.) --skip-external-locking No usa sistema de bloqueo. Para usar myisamchk, debe apagar el servidor. (Consulte Seccin 1.4.3, Estabilidad de MySQL.) Para evitar este requerimiento, use CHECK TABLE y REPAIR TABLE desde el MySQL Monitor para comprobar y reparar tablas MyISAM. --skip-grant-tables Esta opcin hace que el servidor no use el sistema de privilegios en absoluto. Esta opcin da a cualquiera que tenga acceso al servidor acceso ilimitado a todas las bases de datos. Puede hacer que un servidor en ejecucin empiece a usar las tablas de privilegios de nuevo ejecutando mysqladmin flush-privileges o el comando mysqladmin reload desde una consola de sistema, o utilizando el comando MySQL FLUSH PRIVILEGES. --skip-host-cache No use la cache interna de nombres de servidor para una resolucin rpida de nombre-aIP. En lugar de ello, interrogue al servidor DNS cada vez que un cliente se conecte. Consulte Seccin 7.5.6, Cmo usa MySQL las DNS. --skip-innodb Deshabilita el motor de almacenamiento InnoDB . Esto ahorra memoria y espacio en disco y puede acelerar algunas operaciones. No use esta opcin si necesita tablas InnoDB . --skip-name-resolve No resuelva los nombres de servidor cuando compruebe las conexiones de clientes. Use slo nmeros IP. Si usa esta opcin, todos los valores de la columna Host en la tabla de privilegios deben ser nmeros IP o localhost. Consulte Seccin 7.5.6, Cmo usa MySQL las DNS. --skip-ndbcluster Deshabilite el motor de almacenamiento NDB Cluster . Este es el comportamiento por defecto para los binarios compilados con el soporte para el motor de almacenamiento de NDB Cluster , lo
219
que significa que el sistema reserva memoria y otros recursos para este motor de almacenamiento slo si --skip-ndbcluster est subeditado explcitamente por la opcin --ndbcluster . Consulte Seccin 16.4.3, Rpido montaje de prueba de MySQL Cluster para un ejemplo de uso. --skip-networking No escucha conexiones TCP/IP en absoluto. Toda interaccin con mysqld debe hacerse via named pipes o memoria compartida (en Windows) o ficheros socket en Unix. Esta opcin se recomienda encarecidamente en sistemas donde slo se permitan clientes locales. Consulte Seccin 7.5.6, Cmo usa MySQL las DNS. --standalone Slo para sistemas basados en Windows-NT; le dice al servidor MySQL que no se ejecute como servicio. --symbolic-links, --skip-symbolic-links Activa o desactiva el soporte para links simblicos. Esta opcin tiene diferentes efectos en Windows y Unix: En Windows, habilitar links simblicos permite establecer un link simblico a un directorio de base de datos mediante la creacin de un fichero directory.sym que contiene el path al directorio real. Consulte Seccin 7.6.1.3, Usar enlaces simblicos para bases de datos en Windows. En Unix, habilitar links simblicos significa que puede lincar un fichero de ndice o de datos MyISAM a otro directorio con las opciones INDEX DIRECTORY o DATA DIRECTORY del comando CREATE TABLE . Si borra o renombra la tabla, el fichero cuyo link simblico apunta a dicha tabla tambin se borra o renombra. Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE. --skip-safemalloc Si MySQL est configurado con --with-debug=full, todos los programs MySQL chequean para desbordamientos de memoria durante cada reserva y liberacin de memoria. Este chequeo es muy lento, de forma que puede desactivarlo cuando no lo necesite mediante la opcin --skipsafemalloc . --skip-show-database Con esta opcin, el comando SHOW DATABASES slo se permite a usuarios que tengan el privilegio SHOW DATABASES , y el comando muestra todos los nombres de bases de datos. Sin esta opcin, SHOW DATABASES se permite a todos los usuarios, pero muestra cada nombre de base de datos slo si el usuario tiene el privilegio SHOW DATABASES o algn privilegio sobre la base de datos. --skip-stack-trace No escribe la traza de la pila. Esta opcin es til cuando est ejecutando mysqld con un debugger. En algunos sistemas, puede usar esta opcin para obtener un fichero core. Consulte Seccin D.1, Depurar un servidor MySQL. --skip-thread-priority Desactiva el uso de prioridades de threads para un mejor tiempo de respuesta. --socket=path En Unix, esta opcin especifica el fichero socket de Unix para usar en conexiones locales. El valor por defecto es /tmp/mysql.sock. En Windows, la opcin especifica el nombre de pipe a usar en conexiones locales que usen una named pipe. El valor por defecto es MySQL. --sql-mode=value[,value[,value...]] 220
Inicializa el modo SQL para MySQL. Consulte Seccin 5.3.2, El modo SQL del servidor. --temp-pool Esta opcin provoca que la mayora de ficheros temporales creados por el servidor usen un pequeo conjunto de nombes, en lugar de un nombre nico para cada fichero nuevo. Esto evita el problema del kernel de Linux de crear muchos nuevos ficheros con nombres diferentes. Con el antiguo comportamiento, parece que a Linux le ``falte'' memoria, ya que se est reservando en la entrada del cache del directorio en lugar de la cache de disco. --transaction-isolation=level Especifica el nivel de aislamiento de las transacciones, que puede ser READ-UNCOMMITTED, READCOMMITTED, REPEATABLE-READ, o SERIALIZABLE. Consulte Seccin 13.4.6, Sintaxis de SET TRANSACTION. --tmpdir=path, -t path El path del directorio a usar para crear ficheros temporales. Puede ser til si el directorio por defecto /tmp reside en una particin que sea demasiado pequea para alojar tablas temporales. En MySQL 5.0, esta opcin acepta diversas rutas que se usan con una poltica round-robin. Las rutas deben estar separados por comas en Unix (':') y puntos y comas (';') en Windows, NetWare, and OS/2. Si MySQL server est actuando como un esclavo de replicacin, no debe hacer que --tmpdir apunte a un directorio en un sistema de ficheros basado en memoria o a un directorio que se limpie al reiniciar el servidor. Un esclavo de replicacin necesita que sobrevivan algunos de sus ficheros temporales tras un reinicio de la mquina de forma que pueda replicar tablas temporales u operaciones LOAD DATA INFILE. Si los ficheros en el directorio temporal se pierden al reiniciar el servidor, la replicacin falla. --user={user_name | user_id}, -u {user_name | user_id} Ejecuta el servidor mysqld como si el usuario tuviese el nombre user_name o el ID de usuario user_id. (``Usuario'' en este contexto se refiere a la cuenta de login del sistema, no a un usuario MySQL listado en las tablas de permisos.) Esta opcin es obligatoria cuando se ejecute mysqld como root. El servidor cambia su ID de usuario durante la secuencia de arranque, causando que se ejecute como ese usuario en particular en lugar de root. Consulte Seccin 5.5.1, Gua de seguridad general. Para evitar un posible agujero de seguridad donde un usuario aade una opcin --user=root a un fichero my.cnf (por lo tanto, causando que el servidor se ejecute como root), mysqld usa slo la primera opcin --user especificada y produce una adevertencia si hay mltiples opciones --user . Las opciones en /etc/my.cnf y $MYSQL_HOME/my.cnf se procesan antes que las opciones de lnea de comandos, as que se recomiendo que ponga una opcin --user en /etc/my.cnf y especifique un valor distinto a root. La opcin en /etc/my.cnf se encuentra antes que cualquier otra opcin --user , lo que asegura que el servidor se ejecute como un usuario distinto a root, y que se muestre una advertencia como resultado si cualquier otra opcin --user se encuentra. --version, -V Muestra informacin de versin y sale. En MySQL 5.0, puede asignar un valor a una variable de sistema del servidor usando una opcin de la forma --nombre_variable=valor. Por ejemplo, --key_buffer_size=32M inicializa la variable key_buffer_size con un valor de 32MB. Tenga en cuenta que al asignar un valor a una variable, MySQL puede corregir automticamente la asignacin para permanecer dentro de un rango concreto, o ajustar el valor al valor permitido ms prximo si slo se permiten ciertos valores.
221
Tambin puede inicializar variables usando las sintaxis --setvariable=nombre_variable=valor o -O nombre_variable=valor. Sin embargo esta sintaxis est obsoleta Puede encontrar una descripcin concreta de todas las variables en Seccin 5.3.3, Variables de sistema del servidor. La seccin de ajustar los parmetros del servidor incluye informacin sobre cmo optimizarlos. Consulte Seccin 7.5.2, Afinar parmetros del servidor. Puede cambiar los valores de la mayora de variables de sistema en un servidor en ejecucin con el comando SET. Consulte Seccin 13.5.3, Sintaxis de SET. Si desea restringir el mximo valor que se puede asignar a una opcin de arranque con SET, puede definirlo con la opcin de lnea de comandos --maximum-var_name.
222
ALLOW_INVALID_DATES No hace un chequeo total de los datos en modo estricto. Chequea slo que los meses se encuentran en el rango de 1 a 12 y que los das estn en el rango de 1 a 31. Esto es muy conveniente para aplicaciones Web donde obtiene un ao, mes y da en tres campos distintos y quiere guardar exactamente lo que inserta el usuario (sin validacin de datos). Este modo se aplica a columnas DATE y DATETIME . No se aplica a columnas TIMESTAMP , que siempre requieren una fecha vlida. Este modo se implement en MySQL 5.0.2. Antes de 5.0.2, este era el modo por defecto de MySQL para tratar datos. Desde 5.0.2, el permitir el modo estricto provoca que el servidor requiera que el mes y da se evalen como valores legales y no simplemente en los rangos de 1 a 12 y de 1 a 31, respectivamente. Por ejemplo, '2004-04-31' es legal con el modo estricto desactivado, pero ilegal con el modo estricto activado. Para permitir tales fechas en modo estricto, habilite ALLOW_INVALID_DATES tambin. ANSI_QUOTES Trata '"' como un identificador delimitador de carcter (como '`' ) y no como un delimitador de cadenas de caracteres. Puede usar '`' para delimitar identificadores en modo ANSI. Con ANSI_QUOTES activado, puede usar doble delimitadores para delimitar una cadena de caracteres literales, ya que se interpreta como un identificador. ERROR_FOR_DIVISION_BY_ZERO Produce un error en modo estricto (de otra forma una advertencia) cuando encuentra una divisin por cero (o MOD(X,0)) durante un INSERT o UPDATE, o en cualquier expresin (por ejemplo, en una lista de select o clusula WHERE ) que implica datos de tablas y una divisn por cero. Si este modo no se da, MySQL retorna NULL para una divisin por cero. Si se usa INSERT IGNORE o UPDATE IGNORE, MySQL genera una advertencia de divisin por cero, pero el resultado de la operacin es NULL. (Implmentado en MySQL 5.0.2) HIGH_NOT_PRECEDENCE Desde MySQL 5.0.2 , la precedencia del operador NOT se trata tal que expresiones como NOT a BETWEEN b AND c se parsean como NOT (a BETWEEN b AND c). Antes de MySQL 5.0.2, la expresin se parseaba como (NOT a) BETWEEN b AND c. El antiguo comportamiento de mayorprecedencia puede obtenerse permitiendo el modo SQL HIGH_NOT_PRECEDENCE . (Aadido en MySQL 5.0.2)
mysql> SET sql_mode mysql> SELECT NOT 1 -> 0 mysql> SET sql_mode mysql> SELECT NOT 1 -> 1 = ''; BETWEEN -5 AND 5; = 'broken_not'; BETWEEN -5 AND 5;
IGNORE_SPACE Permite nombres entre el nombre de funcin y el carcter '(' . Esto fuerza que todos los nombres de funcin se traten como palabras reservadas. Como resultado, si quiere acceder a cualquier base de datos, tabla, o nombre de columna que sea una palabra reservada, debe delimitarla. Por ejemplo, y como hay una funcin USER() , el nombre de la tabla user en la base de datos mysql y la columna User en esa table se reseva, as que debe delimitarla:
SELECT "User" FROM mysql."user";
NO_AUTO_CREATE_USER Previene que GRANT cree automticamente nuevos usuarios si de otra forma se hara, a no ser que se especifique un usuario. (Aadido en MySQL 5.0.2) NO_AUTO_VALUE_ON_ZERO
223
NO_AUTO_VALUE_ON_ZERO afecta el tratamiento de las columnas AUTO_INCREMENT . Normalmente, genera el siguiente nmero de secuencia para la columna insertando NULL o 0 en ella. NO_AUTO_VALUE_ON_ZERO suprime este comportamiento para 0 de forma que slo NULL genera el siguiente nmero de secuencia. Este modo puede ser til si 0 se ha almacenado en una tabla con columnas AUTO_INCREMENT . (Esta no es una prctica recomendada, de todos modos.) Por ejemplo, si vuelca la tabla con mysqldump y posteriormente la recarga, normalmente MySQL genera un nuevo nmero de secuencia cuando encuentra los valores 0 , resultando en una tabla con distinto contenido que la que fue volcada. Activar NO_AUTO_VALUE_ON_ZERO antes de recargar el fichero con el volcado resuelve el problema. En MySQL 5.0, mysqldump incluye automticamente en su salida un comando permitiendo NO_AUTO_VALUE_ON_ZERO. NO_BACKSLASH_ESCAPES Desactiva el uso del carcter de barra invertida ('\') como carcter de escape en cadenas de caracteres. Con este modo activado, la barra invertida se convierte en un carcter ordinario como cualquier otro. (Implementado en MySQL 5.0.1) NO_DIR_IN_CREATE Cuando crea una tabla, ignora todas las directivas INDEX DIRECTORY y DATA DIRECTORY. Este opcin es til en servidores de replicacin esclavos. NO_ENGINE_SUBSTITUTION Evita la substitucin automtica de motor de almacenamiento cuando el motor deseado no est disponible o compilado. NO_FIELD_OPTIONS No muestra opciones especficas para columnas de MySQL en la salida de SHOW CREATE TABLE. Este modo se usa con mysqldump en modo de portabilidad. NO_KEY_OPTIONS No muestra opciones especficas para ndices de MySQL en la salida de SHOW CREATE TABLE. Este modo se usa con mysqldump en modo de portabilidad. NO_TABLE_OPTIONS No muestra opciones especficas para tablas (tales como ENGINE) en la salida de SHOW CREATE TABLE. Este modo se usa con mysqldump en modo de portabilidad. NO_UNSIGNED_SUBTRACTION En operaciones de resta, no marca el resultado como UNSIGNED si uno de los operandos no tiene signo. Note que esto hace que UNSIGNED BIGINT no sea 100% usable en todos los contextos. Consulte Seccin 12.8, Funciones y operadores de cast. NO_ZERO_DATE En modo estricto, no permite '0000-00-00' como fecha vlida. Puede insertar fechas 0 con la opcin IGNORE . Cuando no est en modo estricto, la fecha se acepta pero se genera una advertencia. (Aadido en MySQL 5.0.2) NO_ZERO_IN_DATE En modo estricto, no acepta fechas la parte del mes o da es 0. Se usa con la opcin IGNORE , inserta una fecha '0000-00-00' para cualquiera de estas fechas. Cuando no est en modo estricto, la fecha se acepta pero se genera una advertencia. (Aadido en MySQL 5.0.2)
224
ONLY_FULL_GROUP_BY No permite consultas que en la parte del GROUP BY se refieran a una columna que no se seleccione. PIPES_AS_CONCAT Trata || como un concatenador de columnas de caracteres (lo mismo que CONCAT()) en lugar de como sinnimo de OR. REAL_AS_FLOAT Trata REAL como un sinnimo de FLOAT en lugar de sinnimo de DOUBLE. STRICT_ALL_TABLES Activa el modo estricto para todos los motores de almacenamiento. Rechaza los datos invlidos. Detalles adicionales a continuacin. (Aadido en MySQL 5.0.2) STRICT_TRANS_TABLES Habilita el modo estricto para motores de almacenamiento transaccionales, y cuando sea posible tambin para los no transaccionales. Detalles adicionales a continuacin. (Implementado en MySQL 5.0.2) El modo estricto controla cmo MySQL trata los valores de entrada invalidos o no presentes. Un valor puede ser invlido por distintas razones. Por ejemplo, puede tener un tipo de datos incorrecto para la columna, o puede estar fuera de rango. Un valor no est presente cuando el registro a insertarse no tiene un valor para una columna que no tiene la clusua DEFAULT explcita en su definicin. Para tablas transaccionales, se genera un error para valores invlidos o no presentes en un comando con los modos STRICT_ALL_TABLES o STRICT_TRANS_TABLES habilitados. El comando se aborta y deshace. Para tablas no transaccionales, el comportamiento es el mismo para cualquier modo, si un valor incorrecto se encuentra en el primer registro a insertar o actualizar. El comando se aborta y la tabla contina igual. Si el comando inserta o modifica varios registros y el valor incorrecto aparece en el segundo o posterior registro, el resultado depende de qu modo estricto est habilitado: Para STRICT_ALL_TABLES, MySQL devuelve un error e ignora el resto de los registros. Sin embargo, en este caso, los primeros registros se insertan o actualizan. Esto significa que puede producirse una actualizacin parcial, que puede no ser lo que desea. Para evitarlo, es mejor usar comandos de un nico registro ya que pueden abortarse sin cambiar la tabla. Para STRICT_TRANS_TABLES, MySQL convierte los valores invlidos en el valor vlido ms prximo para la columna e inserta el nuevo valor. Si un valor no est presente, MySQL inserta el valor por defecto implcito para el tipo de la columna. En ese caso, MySQL genera una advertencia en lugar de un error y contina procesando el comando. Los valores implcitos se describen en Seccin 13.1.5, Sintaxis de CREATE TABLE. El modo estricto no permite fechas invlides como '2004-04-31'. Esto sigue permitiendo fechas con partes con ceros, como 2004-04-00' o fechas ``cero''. Para no permitirlas tampoco, active los modos SQL NO_ZERO_IN_DATE y NO_ZERO_DATE adems del modo estricto. Si no usa el modo estricto (esto es, ni STRICT_TRANS_TABLES ni STRICT_ALL_TABLES estn activados), MySQL inserta valores ajustados para valores invlidos o no presentes y produce advertencias. En modo estricto, puede producir este comportamiento usando INSERT IGNORE o UPDATE IGNORE. Consulte Seccin 13.5.4.22, Sintaxis de SHOW WARNINGS. Los siguientes modos especiales se proporcionan como abreviaciones de combinaciones de modos de la lista precedente. Todos estn disponibles en MySQL 5.0 empezando en la versin 5.0.0, excepto para TRADITIONAL, que se implement en MySQL 5.0.2.
225
La descripcin incluye todos los modos que estn disponibles en la recin ms reciente de MySQL. Para versiones anteriores, un modo de combinacin no incluye todos los modos individuales que slo estn disponibles en las versiones ms recientes. ANSI Equivalente a REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE. Antes de MySQL 5.0.3, ANSI tambin incluye ONLY_FULL_GROUP_BY. Consulte Seccin 1.7.3, Ejecutar MySQL en modo ANSI. DB2 Equivalente a PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS. MAXDB Equivalente a PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER. MSSQL Equivalente a PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS. MYSQL323 Equivalente a NO_FIELD_OPTIONS, HIGH_NOT_PRECEDENCE. MYSQL40 Equivalente a NO_FIELD_OPTIONS, HIGH_NOT_PRECEDENCE. ORACLE Equivalente a PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER. POSTGRESQL Equivalente a PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS. TRADITIONAL Equivalente a STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER.
226
cambiarse conectando al servidor y ejectuando el comando SET GLOBAL var_name. Para cambiar una variable global, debe tener el privilegio SUPER. El servidor mantiene un conjunto de variables de sesin para cada cliente que se conecta. Las variables de sesin del cliente se inicializan en tiempo de conexin usando los valores actuales de las correspondientes variables globales. Para aquellas variables de sesin que son dinmicas, el cliente puede cambiarlas mediante un comando SET SESSION var_name . Cambiar una variable de sesin no necesita privilegios especiales, pero un cliente puede cambiar slo sus variables de sesin, no las de ningn otro cliente. Un cambio de una variable global es visible para cualquier cliente que acceda a esa variable global. Sin embargo, esto afecta a las correspondientes variables de sesin que se inicializan por la variable global slo para clientes que se conecten despus del cambio. Esto no afecta las variables de sesin para cualquier cliente que ya est conectado (tampoco para los clientes que ejecuten el comando SET GLOBAL). Cuando se cambia una variable usando las opciones de arranque, los valores de la variable pueden darse con un sufijo K, M, o G para indicar kilobytes, megabytes, o gigabytes, respectivamente. Por ejemplo, el siguiente comando arranca el servidor con un tamao de key buffer de 16 megabytes:
mysqld --key_buffer_size=16M
No importa que los sufijos se escriban en mayscula o minscula; 16M y 16m son equivalentes. En tiempo de ejecucin, use el comando SET para cambiar las variables de sistema. En este contexto, los sufijos no pueden usarse, pero el valor puede tomar la forma de una expresin:
mysql> SET sort_buffer_size = 10 * 1024 * 1024;
Para espeficicar explcitamente si desea cambiar la variable global o de sesin use la opcin GLOBAL o SESSION:
mysql> SET GLOBAL sort_buffer_size = 10 * 1024 * 1024; mysql> SET SESSION sort_buffer_size = 10 * 1024 * 1024;
Sin dicha opcin, el comando actualiza la variable de sesin. Las variables que pueden cambiarse en tiempo de ejecucin se listan en Seccin 5.3.3.1, Variables de sistema dinmicas. Si desea restringir el valor mximo que puede tomar una variable de sistema con el comando SET , puede especificarlo con --maximum-var_name en el arranque del servidor. Por ejemplo, para evitar que el valor de query_cache_size se incremente por encima de 32MB en tiempo de ejecucin, use la opcin --maximum-query_cache_size=32M. Puede consultar las variables de sistema y sus valores usando el comando SHOW VARIABLES . Consulte Seccin 9.4, Variables de sistema para ms informacin.
mysql> SHOW VARIABLES; +---------------------------------+---------------------------------------------------------+ | Variable_name | Value | +---------------------------------+---------------------------------------------------------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | | automatic_sp_privileges | ON | | back_log | 50 | | basedir | / | | bdb_cache_size | 8388600 | | bdb_home | /var/lib/mysql/ | | bdb_log_buffer_size | 32768 | | bdb_logdir | | | bdb_max_lock | 10000 | | bdb_shared_data | OFF | | bdb_tmpdir | /tmp/ | | binlog_cache_size | 32768 | | bulk_insert_buffer_size | 8388608 | | character_set_client | latin1 |
227
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
character_set_connection character_set_database character_set_results character_set_server character_set_system character_sets_dir collation_connection collation_database collation_server completion_type concurrent_insert connect_timeout datadir date_format datetime_format div_precision_increment default_week_format delay_key_write delayed_insert_limit delayed_insert_timeout delayed_queue_size expire_logs_days flush flush_time ft_boolean_syntax ft_max_word_len ft_min_word_len ft_query_expansion_limit ft_stopword_file group_concat_max_len have_archive have_bdb have_blackhole_engine have_compress have_crypt have_csv have_example_engine have_federated_engine have_geometry have_innodb have_isam have_ndbcluster have_openssl have_query_cache have_raid have_rtree_keys have_symlink init_connect init_file init_slave innodb_additional_mem_pool_size innodb_autoextend_increment innodb_buffer_pool_awe_mem_mb innodb_buffer_pool_size innodb_checksums innodb_concurrency_tickets innodb_data_file_path innodb_data_home_dir innodb_doublewrite innodb_fast_shutdown innodb_file_io_threads innodb_file_per_table innodb_flush_log_at_trx_commit innodb_flush_method innodb_force_recovery innodb_lock_wait_timeout innodb_locks_unsafe_for_binlog innodb_log_arch_dir innodb_log_archive innodb_log_buffer_size innodb_log_file_size innodb_log_files_in_group
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
latin1 latin1 latin1 latin1 utf8 /usr/share/mysql/charsets/ latin1_swedish_ci latin1_swedish_ci latin1_swedish_ci 0 1 5 /var/lib/mysql/ %Y-%m-%d %Y-%m-%d %H:%i:%s 4 0 ON 100 300 1000 0 OFF 0 + -><()~*:""&| 84 4 20 (built-in) 1024 NO YES YES YES YES YES YES YES YES YES NO DISABLED NO YES NO YES YES
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
228
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
innodb_log_group_home_dir innodb_max_dirty_pages_pct innodb_max_purge_lag innodb_mirrored_log_groups innodb_open_files innodb_sync_spin_loops innodb_table_locks innodb_support_xa innodb_thread_concurrency innodb_thread_sleep_delay interactive_timeout join_buffer_size key_buffer_size key_cache_age_threshold key_cache_block_size key_cache_division_limit language large_files_support large_pages large_page_size license local_infile locked_in_memory log log_bin log_bin_trust_routine_creators log_error log_slave_updates log_slow_queries log_warnings long_query_time low_priority_updates lower_case_file_system lower_case_table_names max_allowed_packet 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_length_for_sort_data max_relay_log_size max_seeks_for_key max_sort_length max_tmp_tables max_user_connections max_write_lock_count multi_range_count myisam_data_pointer_size myisam_max_sort_file_size myisam_recover_options myisam_repair_threads myisam_sort_buffer_size engine_condition_pushdown ndb_autoincrement_prefetch_sz ndb_force_send ndb_use_exact_count ndb_use_transactions ndb_cache_check_time net_buffer_length net_read_timeout net_retry_count net_write_timeout new old_passwords open_files_limit optimizer_prune_level optimizer_search_depth
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
./ 90 0 1 300 20 ON ON 8 10000 28800 131072 8388600 300 1024 100 /usr/share/mysql/english/ ON OFF 0 GPL ON OFF OFF OFF OFF OFF OFF 1 10 OFF OFF 0 1048576 4294967295 1073741824 10 100 20 64 16777216 20 4294967295 1024 0 4294967295 1024 32 0 4294967295 256 6 2147483647 OFF 1 8388608 OFF 32 ON ON ON 0 16384 30 10 60 OFF OFF 1024 1 62
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
229
| pid_file | /var/lib/mysql/gigan.pid | | port | 3306 | | preload_buffer_size | 32768 | | protocol_version | 10 | | query_alloc_block_size | 8192 | | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 0 | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | | query_prealloc_size | 8192 | | range_alloc_block_size | 2048 | | read_buffer_size | 131072 | | read_only | OFF | | read_rnd_buffer_size | 262144 | | relay_log_purge | ON | | relay_log_space_limit | 0 | | rpl_recovery_rank | 0 | | secure_auth | OFF | | server_id | 0 | | skip_external_locking | ON | | skip_networking | OFF | | skip_show_database | OFF | | slave_compressed_protocol | OFF | | slave_load_tmpdir | /tmp/ | | slave_net_timeout | 3600 | | slave_skip_errors | OFF | | slave_transaction_retries | 10 | | slow_launch_time | 2 | | socket | /var/lib/mysql/mysql.sock | | sort_buffer_size | 2097144 | | sql_mode | | | storage_engine | MyISAM | | sql_notes | OFF | | sql_warnings | OFF | | sync_binlog | 0 | | sync_replication | 0 | | sync_replication_slave_id | 0 | | sync_replication_timeout | 10 | | sync_frm | ON | | system_time_zone | EST | | table_cache | 64 | | table_type | MyISAM | | thread_cache_size | 0 | | thread_stack | 196608 | | time_format | %H:%i:%s | | time_zone | SYSTEM | | timed_mutexes | OFF | | tmp_table_size | 33554432 | | tmpdir | | | transaction_alloc_block_size | 8192 | | transaction_prealloc_size | 4096 | | tx_isolation | REPEATABLE-READ | | updatable_views_with_limit | YES | | version | 5.0.7-beta-Max | | version_bdb | Sleepycat Software: Berkeley DB 4.1.24: (June 11, 2005) | | version_comment | MySQL Community Edition - Max (GPL) | | version_compile_machine | i686 | | version_compile_os | pc-linux-gnu | | wait_timeout | 28800 | +---------------------------------+---------------------------------------------------------+ 219 rows in set (0.00 sec)
La mayora de variables de sistema se describen aqu. Las variables sin versin indican que estn presentes en todas las versiones de MySQL 5.0. Para informacin histrica acerca de sus implementaciones, consulte Manual de referencia de MySQL 4.1. Las variables de sistema InnoDB estn listadas en Seccin 15.4, Opciones de arranque de InnoDB. Los valores para tamaos de buffer, longitudes y tamao de pila se dan en bytes a no ser que se especifique otra unidad.
230
Informacin sobre el ajuste de estas variables se encuentra en Seccin 7.5.2, Afinar parmetros del servidor. auto_increment_increment auto_increment_increment y auto_increment_offset estn pensados para usarse con replicacin maestro-a-maestro, y puede usarse para controlar la operacin de columnas AUTO_INCREMENT . Ambas variables pueden cambiarse global o localmente, y cada una de ellas puede tomar un valor entre 1 y 65.535 includos. Cambiar el valor de estas variables a 0 causa que su valor sea 1. Intentar cambiar el valor de cualquiera de estas variables a un entero mayor que 65,535 o menor a 0 causa que su valor sea 65,535. Intentar cambiar el valor de auto_increment_increment o de auto_increment_offset con un valor no entero da un error, y el valor de la variable no se cambie en ese caso. Estas dos variables afectan al comportamiento de la columnas AUTO_INCREMENT as: auto_increment_increment controla el intervalo en que se incrementa el valor de columna. Por ejemplo:
mysql> SHOW VARIABLES LIKE 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set (0.00 sec) mysql> CREATE TABLE autoinc1 (col INT NOT NULL AUTO_INCREMENT PRIMARY KEY); Query OK, 0 rows affected (0.04 sec) mysql> SET @auto_increment_increment=10; Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 10 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set (0.01 sec) mysql> INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT col FROM autoinc1; +-----+ | col | +-----+ | 1 | | 11 | | 21 | | 31 | +-----+ 4 rows in set (0.00 sec)
(Note cmo se usa SHOW VARIABLES para obtener el valor actual de estas variables.) auto_increment_offset determina el punto de inicio para el valor de las columnas AUTO_INCREMENT. Considere lo siguiente, asumiendo que estos comandos se ejecutan durante la misma sesin que el ejemplo anterior:
mysql> SET @auto_increment_offset=5; Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE 'auto_inc%';
231
+--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 10 | | auto_increment_offset | 5 | +--------------------------+-------+ 2 rows in set (0.00 sec) mysql> CREATE TABLE autoinc2 (col INT NOT NULL AUTO_INCREMENT PRIMARY KEY); Query OK, 0 rows affected (0.06 sec) mysql> INSERT INTO autoinc2 VALUES (NULL), (NULL), (NULL), (NULL); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT col FROM autoinc2; +-----+ | col | +-----+ | 5 | | 15 | | 25 | | 35 | +-----+ 4 rows in set (0.02 sec)
Si el valor de auto_increment_offset es mayor que el de auto_increment_increment, entonces el valor auto_increment_offset se ignora. Si una o ambas variables se cambian y los nuevos registros insertados en una tabla que contengan una columna AUTO_INCREMENT , el resultado puede ser no intuitivo, como los valores de las series de AUTO_INCREMENT se calculan sin tener en cuenta los valores ya existentes en la columna, y el siguiente valor insertado es el menor valor de la serie que es mayor al mximo valor existente en la columna AUTO_INCREMENT . En otras palabras, la serie se calcula as: auto_increment_offset + N * auto_increment_increment donde N es un entero positivo en la serie [1, 2, 3, ...]. Por ejemplo:
mysql> SHOW VARIABLES LIKE 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 10 | | auto_increment_offset | 5 | +--------------------------+-------+ 2 rows in set (0.00 sec) mysql> SELECT col FROM autoinc1; +-----+ | col | +-----+ | 1 | | 11 | | 21 | | 31 | +-----+ 4 rows in set (0.00 sec) mysql> INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT col FROM autoinc1; +-----+ | col | +-----+ | 1 | | 11 | | 21 |
232
Los valores mostrados por auto_increment_increment y auto_increment_offset generan las series 5 + N * 10, esto es, [5, 15, 25, 35, 45, ...]. El mayor valor presente en la columna col antes del INSERT es 31, y el siguiente valor disponible en la serie AUTO_INCREMENT es 35, as que los valores insertados para col empiezan en ese punto y los resultados se muestran para la consulta SELECT. Es importante recordar que no es posible confinar los efectos de estas dos variables en una sola tabla, y por lo tanto no toman el lugar de la secuencia ofrecido por otros sistemas gestores de bases de datos; estas variables controlan el comportamiento de todas las columnas AUTO_INCREMENT en todas las tablas del servidor MySQL. Si una de estas variables se cambia globalmente, entonces sus efectos persisten hasta que el valor global se cambia o subyace al cambiarlo localmente, o hasta que se reinicia mysqld ; si se cambia localmente, entonces el nuevo valor afecta a las columnas AUTO_INCREMENT para todas las tablas en que se inserten nuevos registros por el usuario actual durante la sesin, hasta que los valores se cambien durante esa sesin. La variable auto_increment_increment se aadi en MySQL 5.0.2. Su valor por defecto es 1. Consulte Captulo 6, Replicacin en MySQL. auto_increment_offset Esta variable se aadi en MySQL 5.0.2. Su valor por defecto es 1. Para ms detalles, consulte la descripcin de auto_increment_increment. back_log El numero de peticiones de conexin que puede tener MySQL. Esto se usa cuando el thread principal de MySQL recibe muchas peticiones de conexin en un pequeo lapso de tiempo. Necesita algo de tiempo (aunque muy poco) el thread principal para comprobar la conexin y empezar un nuevo thread. El valor de back_log indica cuntas peticiones pueden almacenarse duarnte este corto espacio de tiempo antes que MySQL temporalmente pare de responder a nuevas peticiones. Necesita incrementarlo slo si espera un gran nmero de conexiones en un pequeo lapso de tiempo. En otras palabras, este valor es el tamao de la cola que escucha conexiones TCP/IP entrantes. El sistema operativo tiene su propio lmite en el tamao de la cola. La pgina del manual para la llamada de sistema Unix listen() proporcion ms detalles. Consulte la documentacin del SO para el mximo valor de esta variable. Intentar cambiar el valor de back_log por encima del lmite del sistema operativo no es efectivo. basedir El directorio de instalacin de MySQL. Esta variable puede cambiarse con la opcin --basedir . bdb_cache_size El tamao del buffer que se utiliza para cachear ndices y registros para tablas BDB . Si no usa tablas BDB debe arrancar mysqld con --skip-bdb para no gastar memoria para esta cach. bdb_home El directorio base para las tablas BDB tables. Debe asignarse el mismo valor que para la variable datadir. bdb_log_buffer_size
233
El tamao del buffer que se utiliza para cachear ndices y registros para tablas BDB . Si no usa tablas BDB , debe usar el valor 0 o arrancar mysqld con --skip-bdb para no gastar memoria con esta cach. bdb_logdir El directorio en que el motor de almacenamiento BDB escribe sus ficheros de log. Esta variable puede cambiarse con la opcin --bdb-logdir . bdb_max_lock El mximo nmero de bloqueos que pueden tenerse activos en una tabla BDB (10,000 por defecto). Debe incrementarlo si errores como los siguientes ocurren cuando realiza transacciones grandes o cuando mysqld tiene que examinar muchos registros para calcular una consulta:
bdb: Lock table is out of available locks Got error 12 from ...
bdb_shared_data Est ON si usa --bdb-shared-data. bdb_tmpdir El valor de la opcin --bdb-tmpdir . bdb_version Consulte la versin de version_bdb. binlog_cache_size El tamao de la cach para tratar comandos SQL para el log binario durante una transaccin. La cache del log binario se guarda para cada cliente si el servidor soporta diversos motores de almacenamiento transaccionales, empezando por MySQL 4.1.2, si el servidor tiene activados los logs binarios (opcin --log-bin). Si suele usar transacciones grandes, con mltiples comandos, puede incrementar este valor para mejorar el rendimiento. Las variables de estado Binlog_cache_use y Binlog_cache_disk_use pueden ser tiles para ajustar el tamao de estas variables. Consulte Seccin 5.10.3, El registro binario (Binary Log). bulk_insert_buffer_size MyISAM usa una cach especial con forma de rbol para hacer las inserciones ms rpidas para INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., y LOAD DATA INFILE. Esta variable limita el tamao del rbol de la cach en bytes por thread. Cambiarlo a 0 desactiva esta optimizacin. Nota: Esta cach se usa slo al aadir datos en una tabla no vaca. El valor por defecto es 8MB. character_set_client El conjunto de caracteres para comandos que llegan del cliente. character_set_connection El conjunto de caracteres usado por los literales que no tienen un conjunto de caracteres introducido y para conversiones de nmeros a cadenas de caracteres. character_set_database El conjunto de caracteres usado por la base de datos por defecto. El servidor actualiza esta variable cada vez que la base de datos por defecto cambia. Si no hay base de datos por defecto, la variable toma el mismo valor que character_set_server.
234
character_set_results El conjunto de caracteres usado para retornar los resultados de las consultas al cliente. character_set_server El conjunto de caracteres por defecto del servidor. character_set_system El conjunto de caracteres usado por el servidor para almacenar identificadores. El valor es siempre utf8. character_sets_dir El directorio en el que estn instalados los conjuntos de caracteres. collation_connection La colacin del conjunto de caracteres de las conexiones. collation_database La colacin usada por la base de datos por defecto. El servidor cambia esta variable cada vez que la base de datos por defecto cambia. Si no hay una base de datos por defecto, la variable toma el valor de collation_server. collation_server La colacin por defecto del servidor. concurrent_insert Si ON (por defecto), MySQL permite comandos INSERT y SELECT que se ejecuten concurrentemente para tablas MyISAM que no tienen bloques libres en el medio. Puede desactivar esta opcin arrancando mysqld con --safe or --skip-new. En MySQL 5.0.6 esta variable ha cambiado a un entero que toma 3 valores: Valor 0 1 2 Descripcin Off (Defecto) Permite inserciones concurrentes para tablas MyISAM que no tienen agujeros Permite inserciones concurrentes para todas las tablas MyISAM. Si la tabla tiene un agujeroy est en uso por otro thread el nuevo registro se insertar al final de la tabla. Si la tabla no est en uso, MySQL har un bloqueo de lectura normal e insertar el registro en el agujero.
connect_timeout El nmero de segundos que el servidor mysqld espera para un paquete de conexin antes de responder con Bad handshake. datadir El directorio de datos de MySQL. Esta variable puede cambiarse con la opcin --datadir. default_week_format El modo a usar por la funcin WEEK(). delay_key_write
235
Esta opcin se aplica slo a tablas MyISAM . Puede tener uno de los siguientes valores que afectan la forma de tratar la opcin DELAY_KEY_WRITE que puede usarse en los comandos CREATE TABLE . Opcin OFF ON ALL Descricin DELAY_KEY_WRITE se ignora. MySQL activa la opcin DELAY_KEY_WRITE para CREATE TABLE. Este es el valor por defecto. Todas las nuevas tablas abiertas se tratan como si se hubieran creado con la opcin DELAY_KEY_WRITE activada.
Si DELAY_KEY_WRITE est activo, significa que el key buffer para tablas con esta opcin no se vuelcan en cada actualizacin del ndice, sino que slo cuando se cierra una tabla. Esto acelera las escrituras de claves, pero si usa esta caracterstica, debe aadir chequeo automtico de todas las tablas MyISAM arrancando el servidor con la opcin --myisam-recover (por ejemplo -myisam-recover=BACKUP,FORCE). Consulte Seccin 5.3.1, Opciones del comando mysqld y Seccin 14.1.1, Opciones de arranque de MyISAM. Tenga en cuenta que --external-locking no ofrece ninguna proteccin contra corrupcin de ndices para tablas que usan escrituras de claves retardadas. delayed_insert_limit Tras insertar delayed_insert_limit registros retardados, el thread que se encarga del INSERT DELAYED comprueba si hay algn comando SELECT pendiente. Si es as, les permite que se ejecuten antes de continuar insertando registros retardados. delayed_insert_timeout Cunto debe esperar el thread encargado de INSERT DELAYED para un comando INSERT antes de terminar. delayed_queue_size Este es el lmite por tabla del nmero de registros a encolar cuando se tratan comandos INSERT DELAYED . Si la cola se llena, cualquier cliente que lance un comando INSERT DELAYED espera hasta que haya espacio en la cola de nuevo. expire_logs_days El nmero de das para eliminar el log binario automticamente. El valor por defecto es 0, lo que significa ``sin eliminacin automtica''. Las posibles eliminaciones se realizan al arranque y en la rotacin del log binario. flush Est ON si ha arrancado mysqld con la opcin --flush. flush_time Si se asigna un valor distinto a cero, todas las tablas se cierran cada flush_time segundos para liberar recursos y sincronizar datos no volcados en disco. Recomendamos que esta opcin se use slo en Windows 9x o Me, o en sistemas con recursos mnimos. ft_boolean_syntax La lista de operadores soportado por bsquedas full-text booleanas usando IN BOOLEAN MODE. Consulte Seccin 12.7.1, Bsquedas booleanas de texto completo (Full-Text). 236
El valor por defecto de la variable es '+ -><()~*:""&|'. Las reglas para cambiar el valor son las siguientes: La funcin del operador viene determinada por su posicin en la cadena de caracteres. El valor de reemplazo debe tener 14 caracteres. Cada carcter debe ser ASCII y no alfanumrico. El primer o segundo carcter debe ser un espacio. No se permiten duplicados excepto los operadores delimitadores de frase en las posiciones 11 y 12. Estos dos caracteres no tienen porqu ser los mismos, pero son los dos nicos posibles. Las posiciones 10, 13, y 14 (que por defecto son ':', '&', y '|') estn reservados para extensiones futuras. ft_max_word_len La longitud mxima de la palabra includa en un ndice FULLTEXT . Nota: ndices FULLTEXT deben reconstruirse al cambiar esta variable. Use REPAIR TABLE tbl_name QUICK. ft_min_word_len La longitud mnima de la palabra a incluirse en un ndice FULLTEXT . Nota: ndices FULLTEXT deben reconstruirse tras cambiar estas variables. Use REPAIR TABLE tbl_name QUICK. ft_query_expansion_limit El nmero de mejores coincidencias a usar en bsquedas full-text realizadas usando WITH QUERY EXPANSION. ft_stopword_file El fichero del que lee la lista de palabras de detencin en bsquedas full-text. Todas las palabras del fichero se usan; los comentarios no se tienen en cuenta. Por defecto, se usa una lista de palabras de detencin ( como se define en el fichero myisam/ft_static.c ). Actualizar esta variable con una cadena vaca ('') desactiva el filtrado de palabras de detencin. Nota: ndices FULLTEXT deben reconstruirse tras cambiar esta variable o los contenidos del fichero de palabras de detencin. Use REPAIR TABLE tbl_name QUICK. group_concat_max_len El valor mximo permitido para la longitud del resultado de la funcin GROUP_CONCAT(). have_archive YES si mysqld soporta tablas ARCHIVE, NO si no. have_bdb YES si mysqld soporta tablas BDB. DISABLED si se usa --skip-bdb. have_compress Si est disponible la biblioteca de compresin zlib en el servidor. Si no lo est, las funciones COMPRESS() y UNCOMPRESS() no pueden usarse.
237
have_crypt Si la llamada de sistema crypt() est disponible en el servidor. Si no, la funcin CRYPT() no puede usarse. have_csv YES si mysqld soporta tablas ARCHIVE, NO si no. have_example_engine YES si mysqld soporta tablas EXAMPLE , NO si no. have_federated_engine YES si mysqld soporta tablas FEDERATED, NO si no. Esta variable se aadi en MySQL 5.0.3. have_geometry Si el servidor soporta tipos de datos espaciales. have_innodb YES si mysqld soporta tablas InnoDB . DISABLED si se usa --skip-innodb. have_isam En MySQL 5.0, esto aparece slo por razones de compatibilidad con versiones anteriores, y siempre es NO, ya que no hay soporte para tablas ISAM. have_ndbcluster YES si mysqld soporta tablas NDB Cluster . DISABLED si se usa --skip-ndbcluster . have_openssl YES si mysqld soporta SSL (cifrado) del protocolo cliente/servidor. have_query_cache YES si mysqld soporta la cache de consultas. have_raid YES si mysqld soporta la opcin RAID . have_rtree_keys Si los ndices RTREE estn disponibles. (Se usan para indexacin espacial en tablas MyISAM.) have_symlink Si el soporte para enlaces simblicos est activado. Es un requesito en Unix para soporte de las opciones de tabla DATA DIRECTORY y INDEX DIRECTORY .
init_connect Una cadena de caracteres que ejecuta el servidor para cada cliente que se conecta. La cadena consiste en uno o ms comandos SQL. Para especificar varios comandos, seprelos con un punto y coma. Por ejemplo, cada cliente arranca por defecto con modo autocommit activado. No hay ninguna variable de servidor global para especificar que autocommit est desactivado por defecto, pero puede usar init_connect para conseguir el mismo efecto:
238
Esta variable puede cambiarse en la lnea de comandos o en un fichero de opciones. Para cambiar la variable tal y como se ha mostrado usando un fichero de opciones, incluya las siguientes lneas:
[mysqld] init_connect='SET AUTOCOMMIT=0'
Tenga en cuenta que el contenido de init_connect no se ejecuta para usuarios con el privilegio SUPER; esto es para el caso que el contenido se haya introducido incorrectamente (contiene una consulta incorrecta, por ejemplo con un error de sintaxis), haciendo que todas las conexiones fallen. No ejecutarlo para usuarios SUPER permite que stos abran una conexin y arreglen init_connect. init_file El nombre del fichero especificado con la opcin --init-file cuando arranca el servidor. Este fichero contiene comandos SQL que se ejecutan al arrancar el servidor. Cada comando debe estar en una nica lnea y no debe incluir comentarios. init_slave Esta variable es similar a init_connect, pero es una cadena de caracteres que se ejecuta por parte de un servidor esclavo cada vez que el thread SQL arranca. El formato de la cadena de caracteres es el mismo que para la variable init_connect. innodb_xxx Las variables InnoDB de sistema se listan en Seccin 15.4, Opciones de arranque de InnoDB. interactive_timeout El nmero de segundos que espera el servidor para actividad en una conexin interactiva antes de cerrarla. Un cliente interactivo se define como un cliente que usa la opcin CLIENT_INTERACTIVE para mysql_real_connect(). Consulte tambin wait_timeout. join_buffer_size El tamao del buffer que se usa para full joins (joins que no usan ndices). Normalmente la mejor forma de conseguir joins rpidos es aadir ndices. Incrementar el valor de join_buffer_size para obtener un full join ms rpido cuando se aaden ndices no es posible. Un buffer para joins se reserva para cada full join entre dos tablas. Para un join complejo entre varias tablas en que sus ndices no se usan, buffers para joins mltiples pueden ser necesarios. key_buffer_size Los bloques de ndices para tablas MyISAM y ISAM se guardan en buffers y se comparten para todos los threads. key_buffer_size es el tamao del buffer usado para los bloques de ndices. El key buffer tambin se conoce como la key cache. El tamao mximo permitido para key_buffer_size es 4GB. El mximo tamao efectivo puede ser menor, dependiendo de la memoria RAM fsica y los lmites por proceso de RAM impuestos por el sistema operativo o la plataforma hardware. Incremente el valor para obtener un mejor tratamiento de ndices (para todas las lecturas y escrituras mltiples) al mximo que pueda permitirse. El uso de un valor que sea el 25% del total de memoria en una mquina que principalmente ejecute MySQL es bastante comn. Sin embargo, si el valor es demasiado grande (por ejemplo, ms del 50% del total de la memoria) el sistema puede empezar a paginar y ser extremadamente lento. MySQL confa en el sistema operativo para tratar el cacheo del sistema de ficheros para las lecturas de datos, as que debe dejar algn espacio para cachear el sistema de ficheros.
239
Para ms velocidad al escribir varios registros al mismo tiempo , use LOCK TABLES. Consulte Seccin 13.4.5, Sintaxis de LOCK TABLES y UNLOCK TABLES. Puede chequear el rendimiento del key buffer con el comando SHOW STATUS y examinando las variables de estado Key_read_requests, Key_reads, Key_write_requests, y Key_writes . Consulte Seccin 13.5.4, Sintaxis de SHOW. El ratio Key_reads/Key_read_requests normalmente debe ser menor a 0.01. El ratio Key_writes/Key_write_requests normalmente est cerca de 1 si usa mayoritariamente actualizaciones y borrados, pero puede ser mucho menor si tiende a hacer actualizaciones que afecten a muchos registros al mismo tiempo o si usa la opcin de tabla DELAY_KEY_WRITE . La fraccin del key buffer en uso puede determinarse mediante key_buffer_size conjuntamente con la variable de estado Key_blocks_unused y el tamao de bloque del buffer. El tamao de bloque del buffer est disponible en la variable de servidor key_cache_block_size . La fraccin del buffer en uso es:
1 - ((Key_blocks_unused * key_cache_block_size) / key_buffer_size)
Este valor es una aproximacin ya que algn espacio del key buffer puede estar reservado internamente para estructuras administrativas. En MySQL 5.0, es posible crear mltiples key caches para tablas MyISAM. El lmite de tamao de 4GB se aplica a cada cach individualmente, no como grupo. Consulte Seccin 7.4.6, La cach de claves de MyISAM. key_cache_age_threshold Este valor controla la demotion de buffers desde la sub-cadena caliente de una key cache a la subcadena templada. Los valores ms pequeo provocan que la demotion ocurra ms rpidamenet. El valor mnimo es 100. El valor por defecto es 300. Consulte Seccin 7.4.6, La cach de claves de MyISAM. key_cache_block_size El tamao en bytes de los bloques de la key cache. El valor por defecto es 1024. Consulte Seccin 7.4.6, La cach de claves de MyISAM. key_cache_division_limit El punto de divisin entre las sub-cadenas calientes y tempaladas de la cadena del buffer de la key cache. El valor es el porcentaje de la cadena del buffer para usar en la sub-cadena templada. El rango de los valores permitidos es de 1 a 100. El valor por defecto es 100. Consulte Seccin 7.4.6, La cach de claves de MyISAM. language El idioma usado para los lenguajes de error. large_file_support Si mysqld est compilado con la opcin de soporte para grandes ficheros. large_pages Indica si est activado el soporte para pginas grandes. Esta variable se aadi en MySQL 5.0.3. license El tipo de licencia que tiene el servidor. local_infile
240
Si LOCAL est soportado para comandos LOAD DATA INFILE. locked_in_memory Si mysqld est bloqueado en memoria con --memlock. log Si el logueo de todas las consultas en el log general de consultas est activado. Consulte Seccin 5.10.2, El registro general de consultas. log_bin Si el log binario est activado. Consulte Seccin 5.10.3, El registro binario (Binary Log). log_bin_trust_routine_creators Esta variable se aplica cuando el log binario est activado. Controla si los creadores de rutinas almacenadas son o no de confianza para crear rutinas almacenadas que escribirn eventos no seguros en el log binario. Si est a 0 (por defecto), los usuarios no tienen permiso para crear o cambiar rutinas almacenadas a no ser que tengan el privilegio SUPER adems del privilegio CREATE ROUTINE o ALTER ROUTINE . Asignar el valor 0 fuerza la restriccin que una rutina debe declararse con la caracterstica DETERMINISTIC , o con las caractersticas READS SQL DATA o NO SQL . Si la variable tiene el valor 1, MySQL no fuerza esta restriccin en la creacin de rutinas almacenadas. Consulte Seccin 19.3, Registro binario de procedimientos almacenados y disparadores. Esta variable se aadi en MySQL 5.0.6. log_error La localizacin del log de errores. log_slave_updates Si las actualizaciones recibidas por un servidor esclavo de un servidor maestro deben loguearse en el log binario del servidor esclavo. El logueo binario debe estar disponible en el esclavo para que tenga efecto. Consulte Seccin 6.8, Opciones de arranque de replicacin. log_slow_queries Si una consulta lenta debe loguearse. ``Lenta'' est determinado por el valor de la variable long_query_time. Consulte Seccin 5.10.4, El registro de consultas lentas (Slow Query Log). log_warnings Si produce mensajes de advertencia adicionales. Est activado por defecto. Las conexiones abortadas no se loguean en el log de error a no ser que el valor sea mayor a 1. long_query_time Si una consulta dura ms que este valor en segundos, la variable de estado Slow_queries se incrementa. Si est usando la opcin --log-slow-queries , la consulta se loguea en el fichero de log para consultas lentas. Este valor se mide en tiempo real, no tiempo de CPU, as que una consulta que est bajo el umbral en un sistema con poca carga puede estar por encima del umbral en un sistema con mucha carga. Consulte Seccin 5.10.4, El registro de consultas lentas (Slow Query Log). low_priority_updates
241
Con el valor 1, todos los comandos INSERT, UPDATE, DELETE, y LOCK TABLE WRITE esperan hasta que no hayan pendientes SELECT o LOCK TABLE READ en la tabla afectada. Esta variable se llamaba prviamente sql_low_priority_updates. lower_case_file_system Esta variable indica si el sistema de ficheros donde el directorio de datos est localizado tiene nombres de ficheros no sensibles a maysculas y minsculas. ON significa que los nombres del fichero no son sensibles a maysculas y minsculas, OFF significa que son sensibles a maysculas y minsculas. lower_case_table_names Con el valor 1, los nombres de tablas se almacenan en minsuculas en disco y las comparaciones de nombres de tablas no tienen en cuenta maysculas y minsculas. Esta opcin tambin se aplica a nombres de bases de datos y alias de tablas. Consulte Seccin 9.2.2, Sensibilidad a maysuclas y minsculas de identificadores. Si usa tablas InnoDB , debe asignar a esta variable el valor 1 en todas las plataformas para forzar que los nombres se conviertan a minsculas. No debe asignar a esta variable el valor 0 si est ejecutando MySQL en un sistema que no tiene nombres de ficheros sensibles a maysculas y minsculas (tales como Windows o Mac OS X). Si esta variable no tiene un valor al arrancar y el sistema de ficheros donde est localizado el directorio de datos no tiene nombres de ficheros sensibles a maysculas y minsculas, MySQL automticamente asigna a lower_case_table_names el valor 2. max_allowed_packet El tamao mximo de un paquete o cualquier cadena de caracteres generada/intermedia. El buffer de paquetes de mensajes se inicializa a net_buffer_length bytes, pero puede crecer hasta max_allowed_packet bytes cuando sea necesario. Este valor por defecto es pequeo, para recibir paquetes grandes (posiblemente incorrectos). Debe incrementar este valor si est usando columnas grandes BLOB o cadenas de caracteres largas. Debe ser tan grande como el mayor BLOB que quiera usar. En MySQL 5.0, el lmite del protocolo para max_allowed_packet es 1GB. max_binlog_cache_size Si una transaccin con mltiples comandos requiere ms que esta cantidad de memoria, obtiene el error Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. max_binlog_size Si una escritura en el log binario excede el valor dado, rota el log binario. No puede cambiar este valor a ms de 1GB o a menos de 4096 bytes. El valor por defecto es 1GB. Nota en caso que use transacciones: Una transaccin se escribe en un trozo del log binario, as que nunca se trocea entre varios logs binarios. Por lo tanto, si tiene transacciones grandes, puede ver logs binarios mayores que max_binlog_size. Si max_relay_log_size es 0, el valor de max_binlog_size se aplica a relay logs tambin. max_connect_errors Si hay ms que este nmero de conexiones interrumpidas de un equipo, este equipo se bloquea para ms conexiones. Puede desbloquear equipos bloqueados con el comando FLUSH HOSTS. 242
max_connections El nmero de conexiones de cliente simultneas permitidas. Incrementar este valor incrementa el nmero de descriptores de fichero que requiere mysqld . Consulte Seccin 7.4.8, Cmo abre y cierra tablas MySQL para comentarios sobre lmites en los descriptores de fichero. Consulte tambin Seccin A.2.6, Demasiadas conexiones. max_delayed_threads No arranque ms que este nmero de threads para tratar comandos INSERT DELAYED . Si trata de insertar datos en una nueva tabla despus de que todos los threads INSERT DELAYED estn en uso, el registro se inserta como si el atributo DELAYED no se hubiera especificado. Si cambia este valor a 0, MySQL nunca crea un thread para tratar registros DELAYED ; en efecto, esto desactiva DELAYED completamente. max_error_count El nmero mximo de mensajes de error, advertencia, y notas que se guardan para mostrar con SHOW ERRORS o SHOW WARNINGS. max_heap_table_size Esta variable cambia el mximo valor para el que las tablas MEMORY (HEAP) pueden crecer. El valor de la variable se usa para calcular el valor MAX_ROWS en tablas MEMORY. Cambiar esta variable no tiene efecto en ninguna tabla MEMORY existente, a no ser que la tabla se recree con un comando tal como CREATE TABLE o TRUNCATE TABLE, o cambiada con ALTER TABLE. max_insert_delayed_threads Esta variable es sinnimo de max_delayed_threads. max_join_size No permite los comandos SELECT que probablemente tengan que examinar ms de max_join_size registros (para comandos en una misma tabla) o combinaciones de registros (para comandos con varias tablas) o que sea probable que hagan ms de max_join_size bsquedas de disco. Al cambiar este valor, puede cazar los comandos SELECT donde las claves no se usan correctamente y que probablemente tardaran mucho tiempo. Cmbielo si sus usuarios tienden a realizar joins sin una clusula WHERE , que tarden mucho tiempo, o que devuelvan millones de registros. Al cambiar esta variable a un valor que no sea DEFAULT resetea el valor de SQL_BIG_SELECTS a 0. Si cambia el valor SQL_BIG_SELECTS de nuevo, la variable max_join_size se ignora. Si el resultado de una consulta est en la cach de consultas, no se hace el chequeo del tamao del resultado, ya que el resultado se ha computado prviamente y no carga al servidor al enviarlo al cliente. Esta variable prviamente se llamaba sql_max_join_size. max_length_for_sort_data El lmite en el tamao del ndice que determina qu algoritmo filesort se usa. Consulte Seccin 7.2.10, Cmo optimiza MySQL ORDER BY. max_relay_log_size Si una escritura de un esclavo de replicacin a su relay log excede el valor dado, rota el relay log. Esta variable le permite poner diferentes restricciones de tamao en logs binarios y relay logs. Sin embargo, cambiar la variable a 0 hace que MySQL use max_binlog_size para el log binario y el relay log. Debe asignar un valor a max_relay_log_size entre 4096 bytes y 1GB (includos), o 0. El valor por defecto es 0. Consulte Seccin 6.3, Detalles de la implementacin de la replicacin.
243
max_seeks_for_key Limita el mximo nmero de bsquedas al buscar registros basados en una clave. El optimizador de MySQL asume que no se requieren ms que este nmero de bsquedas de claves al buscar registros en una tabla al escanear una clave, a pesar de la cardinalidad real de la clave (consulte Seccin 13.5.4.11, Sintaxis de SHOW INDEX). Si se pone un valor pequeo (100?), puede forzar a MySQL a que prefiera claves en lugar de escaneos de tablas. max_sort_length Nmero de bytes que se usan al ordenar valores BLOB o TEXT . Slo los primeros max_sort_length bytes cada valor se usan; el resto se ignoran. max_tmp_tables El nmero mximo de tablas temporales que un cliente puede mantener abiertas al mismo tiempo. (Esta opcin todava no hace nada.) max_user_connections El nmero mximo de conexiones simultneas permitidas para cualquier cuenta MySQL dada. Un valor 0 significa ``sin lmites.'' Antes de MySQL 5.0.3, esta variable slo tena visibilidad global. A partir de MySQL 5.0.3, tambin tiene visibilidad para sesiones de slo lectura. La variable de sesin tiene el mismo valor que la variable global a no ser que la cuenta actual tenga un valor diferente a 0 en el lmite de recursos MAX_USER_CONNECTIONS . En este caso, el valor de sesin refleja el lmite de la cuenta. max_write_lock_count Despus de varios bloqueos de escritura, permite que algunos bloqueos de lectura se ejecuten en medio. multi_read_range Especifica el mximo nmero de rangos a enviar a un motor de almacenamiento durante la seleccin de rangos. El valor por defecto es 256. Enviar mltiples rangos a un motor es una caracterstica que puede mejorar el rendimiento de ciertas selecciones dramticamente, particularmente para NDBCLUSTER. Este motor necesita enviar la peticin de rangos a todos los nodos, y enviar muchas de estas peticiones a la vez reduce el coste de comunicacin significativamente. Esta variable se aadi en MySQL 5.0.3. myisam_data_pointer_size El tamao por defecto para punteros en bytes, para ser usado con CREATE TABLE para tablas MyISAM cuando no se especifica la opcin MAX_ROWS . Esta variable no puede ser menor que 2 ni mayor que 7. El valor por defecto es 4. Consulte Seccin A.2.11, The table is full. (OBSOLETO) myisam_max_extra_sort_file_size Si el fichero temporal usado para ndexacin rpida MyISAM es mayor que usando la key cache con la cantidad especificada aqu, se utiliza preferentemente el mtodo de la key cache. Esto se usa para forzar que las claves largas de caracteres en grandes tablas usen el mtodo de de key cache (ms lento) para crear el ndice. Este valor se da en bytes. Nota: Esta variable se elimin en MySQL 5.0.6. myisam_max_sort_file_size El tamao mximo para tablas temporales que MySQL permite para recrear un ndice MyISAM (durante REPAIR TABLE, ALTER TABLE, o LOAD DATA INFILE). Si el tamao del fichero fuese 244
mayor que este valor, el ndice se crea usando la key cache en su lugar, lo cual es ms lento. El valor se da en bytes. myisam_recover_options El valor para la opcin --myisam-recover. myisam_repair_threads Si este valor es mayor que 1, los ndices de tablas MyISAM se crean en paralelo (cada ndice en su propio thread) durante el proceso Repair by sorting . El valor por defecto es 1. Nota: Reparacin multi-threaded repair todava es cdigo con calidad alpha. myisam_sort_buffer_size El buffer que se reserva al ordenar ndices MyISAM durante REPAIR TABLE o al crear ndices con CREATE INDEX o ALTER TABLE. named_pipe (Slo en Windows.) Indica si el servidor soporta conexiones sobre named pipes. net_buffer_length El buffer de comunicacin se resetea a este tamao entre consultas. Normalmente, debe cambiarse, pero si tiene poca memoria, puede inicializarse al tamao esperado para los comandos SQL enviados por los clientes. Si los comandos exceden este tamao, el buffer crece automticamente, hasta max_allowed_packet bytes. net_read_timeout El nmero de segundos a esperar ms datos de una conexin antes de abortar la lectura. Cuando el servidor est leyendo del cliente, net_read_timeout es el valor que controla el tiempo mximo para abortar. Cuando el servidor est escribiendo en el cliente, net_write_timeout es el valor que controla el tiempo mximo para abortar. Consulte tambin slave_net_timeout. net_retry_count Si una lectura en un puerto de comunicaciones se interrumpe, reintenta las veces especificadas antes de abandonar. Este valor debe inicializarse a un valor alto en FreeBSD, ya que las interrupciones internas se envan a todos los threads. net_write_timeout Nmero de segundos a esperar para que se escriba un bloque en una conexin antes de abortar la escritura. Consulte tambin net_read_timeout. new Esta variable se usaba en MySQL 4.0 para activar algunos comportamientos de la versin 4.1 y se mantiene para compatibilidad con versiones anteriores. En MySQL 5.0, el valor siempre es OFF. old_passwords Si el servidor debe usar contraseas estilo anterior a la versin 4.1 para cuentas de usuario de MySQL. Consulte Seccin A.2.3, Client does not support authentication protocol. open_files_limit Nmero de ficheros que el sistema operativo permite abrir mysqld . Este es el valor real permitido por el sistema y puede ser distinto del valor que se da a mysqld al arrancar. El valor es 0 en sistemas donde MySQL puede cambiar el nmero de ficheros abiertos.
245
optimizer_prune_level Controla el heurstico aplicado durante la optimizacin de consultas para no hacer los planes parciales menos prometedores en el espacio de bsqueda del optimizador. Un valor de 0 desactiva el heurstico de forma que el optimizador realiza una bsqueda exhaustiva. Un valor de 1 provoca que el optimizador elimine planes basados en el nmero de registros calculados por planes intermedios. Esta variable se aadi en MySQL 5.0.1. optimizer_search_depth La mxima profundidad de bsqueda realizada por el optimizador de consultas. Valores mayores que el nmero de relaciones en una consulta dan como resultado en mejores planes de consulta, pero lleva ms tiempo generar un plan de ejecucin para una consulta. Los valores menores que el nmero de relaciones en una consulta retornan un plan de ejecucin ms rpido, pero el plan resultante puede estar lejos de ser el plan ptimo. Si se usa como valor 0, el sistema automticamente escoge un valor razonable. Si se asigna como valor el mximo nmero de tablas usado en una consulta ms 2, el optimizador cambia al algoritmo usado en MySQL 5.0.0 ( y versiones anteriores ) para mejorar el rendimiento de las bsquedas. Esta variable se aadi en MySQL 5.0.1. pid_file La ruta al fichero con el ID de proceso (PID). Esta variable puede cambiarse con la opcin --pidfile. port El puerto en que escucha el servidor para conexiones TCP/IP. Esta variable puede cambiarse con la opcin --port . preload_buffer_size El tamao del buffer que se reserva al pre-cargar los ndices. protocol_version La versin del protocolo cliente/servidor usado por el servidor MySQL. query_alloc_block_size El tamao de bloques de memoria reservado para objetos creados durante el parseo y ejecucin de consultas. Si tiene problemas con fragmentacin de memoria, puede ayudar incrementar este valor un poco. query_cache_limit No cachea resultados mayores que este nmero de bytes. El valor por defecto es 1048576 (1MB). query_cache_min_res_unit Tamao mnimo (en bytes) para bloques reservados en la cach de consultas. El valor por defecto es 4096 (4KB). Para ms informacin acerca de optimizar esta variable consulte Seccin 5.12.3, Configuracin de la cach de consultas. query_cache_size La cantidad de memoria reservada para cachear resultados de consultas. El valor por defecto es 0, lo que desactiva la cache de consultas. Tenga en cuenta que la cantidad de memoria se reserva incluso si query_cache_type tiene como valor 0. Consulte Seccin 5.12.3, Configuracin de la cach de consultas para ms informacin. query_cache_type
246
Cambia el tipo de la cach de consultas. Cambiando el valor GLOBAL se inicializa el tipo para todos los clientes que se conecten a partir de ese momento. Clientes individuales pueden cambiar el valor SESSION para afectar a su propio uso de la cach de consultas. Los posibles valores se muestran en la siguiente tabla: Opcin 0 o OFF Descripcin No cachea o retorna los resultados. Tenga en cuenta que esto no elimina el buffer cach para consultas. Para hacerlo, debe asignar 0 a query_cache_size. Cachea todos los resultados de consultas excepto los que empiecen con SELECT SQL_NO_CACHE. Cachea los resultados slo para consultas que comiencen con SELECT SQL_CACHE.
1 o ON 2 o DEMAND
En MySQL 5.0, el valor por defecto de esta variable es ON. query_cache_wlock_invalidate Normalmente, cuando un cliente adquiere un bloqueo WRITE en una tabla MyISAM , el resto de clientes no se bloquean para consultas cuyo resultado est presente en la cach para consultas. Cambiando el valor de esta variable a 1 provoca que la adquisicin de una tabla mediante un bloqueo WRITE invalida cualquier consulta en la cach de consultas que se refiera a la tabla. Esto fuerza a que otros clientes que traten de acceder a la tabla esperen mientras el bloqueo est activo. query_prealloc_size El tamao del buffer persistente usado para parsear y ejecutar consultas. Este buffer no se libera entre consultas. Si est ejecutando consultas complejas, un valor mayor de query_prealloc_size puede ser de utilidad para mejorar el rendimiento, ya que puede reducir la necesidad del servidor de realizar reserva de memoria durante las operaciones de ejecucin de consultas. range_alloc_block_size El tamao de los bloques que se reservan en la optimizacin de rango. read_buffer_size Cada thread que realiza un escaneo secuencial reserva un buffer de su tamao (en bytes) para cada tabla que escanea. Si realiza muchos escaneos secuenciales, puede incrementar este valor, que por defecto es 131072. read_only Cuando una variable tiene el valor ON para un servidor esclavo de replicacin, esto causa que el esclavo no permita actualizaciones excepto de threads de esclavos o de usuarios con el privilegio SUPER. Esto puede ser til para asegurar que un servidor esclavo no acepte actualizaciones de los clientes. relay_log_purge Desactiva o activa el purgado automtico de los relay logs tan pronto como no se necesitan. El valor por defecto es 1 (activado). read_rnd_buffer_size Cuando se leen registros ordenadamante tras una ordenacin, los registros se leen a travs de su buffer para evitar bsquedas en disco. Asignar a esta variable un valor mayor puede mejorar mucho el rendimiento de ORDER BY. Sin embargo, hay un buffer para cada cliente, as que no debe
247
asignar un valor grande a la variable global. En lugar de ello, cambie la variable de sesin slo en los clientes que necesiten ejecutar grandes consultas. secure_auth Si el servidor MySQL ha arrancado con la opcin --secure-auth , bloquea conexiones de todas las cuentas que tengan las contraseas almacenadas en el formato antiguo (anterior a 4.1). En ese caso, el valor de esta variable es ON, en el contrario es OFF. Debe activar esta opcin si quiere evitar todo uso de contraseas en el viejo formato (y por lo tanto comunicacin insegura en la red). El arranque del servidor falla con un error si esta opcin est activada y la tablas de privilegios estn en formato anterior a 4.1. Consulte Seccin A.2.3, Client does not support authentication protocol.
Cuando se usa como una opcin del lado del cliente, el cliente rehsa conectar a un servidor si el servidor requiere contrasea en el viejo formato para la cuenta del cliente. server_id El valor de la opcin --server-id . Se usa para servidores de replicacin maestros y esclavos. shared_memory (Slo en Windows.) Si el cliente permite conexiones a travs de memoria compartida o no. shared_memory_base_name (Slo en Windows.) Indica si el servidor permite conexiones a travs de memoria compartida, e indica el identificador para memoria compartida. Esto es til al ejecutar varias instancias de MySQL en una nica mquina fsica. skip_external_locking Est OFF si mysqld usa bloqueo externo. skip_networking Est ON si el servidor permite slo conexiones locales (no TCP/IP). En Unix, las conexiones locales usan un fichero socket de Unix. En Windows, las conexiones locales usan named pipes o memoria compartida. En NetWare, slo se soportan conexiones TCP/IP, as que no asigne a esta variable el valor ON. skip_show_database Evita que se use el comando SHOW DATABASES sin tener el privilegio SHOW DATABASES . Esto puede mejorar la seguridad si le preocupa que los usuarios puedan ver las bases de datos pertenecientes a otros usuarios. En MySQL 5.0, su efecto depende del privilegio SHOW DATABASES: Si el valor de la variable es ON, el comando SHOW DATABASES est permitido slo para usuarios que tengan el privilegio SHOW DATABASES , y el comando muestra todos los nombres de bases de datos. Si el valor es OFF, SHOW DATABASES se permite para todos los usuarios, pero slo muestra los nombres de bases de datos que el usuario tenga el permiso SHOW DATABASES u otros privilegios. slave_compressed_protocol Si usa compresin en el protocolo maestro/servidor si ambos lo soportan. slave_load_tmpdir 248
El nombre del directorio donde el esclavo crea ficheros temporales para replicar el comando LOAD DATA INFILE. slave_net_timeout Nmero de segundos a esperar para ms datos en una conexin maestro/ servidor antes de abortar la lectura. slave_skip_errors Los errores de replicacin que el esclavo debe dejar pasar (ignorar). slow_launch_time Si la creacin de un thread toma ms de los segundos especificados por esta variable, el servidor incrementa la variable de estado Slow_launch_threads . socket Plataformas Unix: El fichero socket usado para conexiones clientes locales. Por defecto /var/lib/ mysql/mysql.sock. Windows: El nombre del named pipe usado para conexiones cliente locales. Por defecto mysql. sort_buffer_size Cada thread que necesita una ordenacin reserva un buffer de su tamao. El incremento de este valor permite acelerar las operaciones ORDER BY o GROUP BY . Consulte Seccin A.4.4, Dnde almacena MySQL los archivos temporales. sql_mode El modo del servidor SQL, que en MySQL 5.0 puede cambiarse dinmicamente. Consulte Seccin 5.3.2, El modo SQL del servidor. sql_slave_skip_counter El nmero de eventos del maestro que el servidor esclavo debe ignorar. storage_engine Esta variable es un sinnimo de table_type. En MySQL 5.0, storage_engine es el nombre preferido. sync_binlog Si es positivo, el servidor MySQL sincroniza su log binario a disco (fdatasync()) despus de cada escritura sync_binlog en su log binario. Tenga en cuenta que slo hay una escritura en el log binario por comando si est en modo autocommit, y de otra forma una escritura por transaccin. El valor por defecto es 0 lo que no sincroniza con disco. Un valor de 1 es la eleccin ms segura, ya que en caso de error se pierden como mucho un comando/transaccin del log binario; de todas formas, tambin es el valor ms bajo (a no ser que el disco tenga una cach de batera, lo que hace la sincronizacin muy rpida). sync_frm Si esta variable se asigna a 1, cuando se crea una tabla no temporal su fichero .frm se sincroniza a disco (fdatasync()); esto es lo ms lento pero ms seguro en caso de un error. El valor por defecto es 1. system_time_zone
249
La zona horaria del servidor. Cuando el servidor comienza la ejecucin, hereda unos valores de zona horaria de los valores por defecto de la mquina, posiblemente modificados por el entorno de la cuenta usado para ejecutar el servidor o el script de arranque. El valor se usa para asignar system_time_zone. Normalmente la zona horaria se especifica con la variable de entorno TZ. Tambin puede especificarse usando la opcin --timezone del script mysqld_safe . table_cache El nmero de tablas abiertas por todos los threads. Incrementar este valor incrementa el nmero de descriptores de ficheros que requiere mysqld . Puede chequear si necesita incrementar la cach de la tabla chequeando la variable de estado Opened_tables . Consulte Seccin 5.3.4, Variables de estado del servidor. Si el valor de Opened_tables es grande y no quiere hacer muchos FLUSH TABLES (lo que fuerza a cerrar y reabrir todas las tablas), entonces debe incrementar el valor de la variable table_cache . Para ms informacin sobre la cache de la tabla, consulte Seccin 7.4.8, Cmo abre y cierra tablas MySQL. table_type El tipo de tabla por defecto (motor de almacenamiento). Para cambiar el tipo de tabla en el arranque del servidor, use la opcin --default-table-type. Consulte Seccin 5.3.1, Opciones del comando mysqld. thread_cache_size El nmero de threads que el servidor debe cachear para reusar. Cuando un cliente desconecta, los threads de clientes se ponen en la cach si hay menos de thread_cache_size threads. Peticiones de threads se sirven reusando threads tomados de la cach cuando es posible. Esta variable puede incrementarse para mejorar el rendimiento si tiene muchas nuevas conexiones. (Normalmente esto no da una mejora notable de rendimiento si tiene una buena implementacin de threads.) Mediante el estudio de las diferencias entre las variables de estado Connections y Threads_created (consulte Seccin 5.3.4, Variables de estado del servidor para ms detalles) puede ver lo eficiente que es la cach de threads. thread_concurrency En Solaris, mysqld llama a thr_setconcurrency() con este valor. Esta funcin permite a las aplicaciones dar al sistema de threads una piesta sobre el nmero deseado de threads que deben ejecutarse simultneamente. thread_stack El tamao de la pila para cada thread. Muchos de los lmites detectados por el test crash-me dependen de este valor. El valor por defecto es lo suficientemente grande para un funcionamiento normal. Consulte Seccin 7.1.4, El paquete de pruebas de rendimiento (benchmarks) de MySQL.
time_zone La zona horaria. El valor inical de este 'SYSTEMA' (usa el valor de system_time_zone), pero puede especificarse explcitamente al arrancar el servidor con la opcin --default-time-zone . tmp_table_size Si una tabla temporal en memoria excede este tamao, MySQL la convierte automticamente en una tabla en disco de tipo MyISAM. Incremente el valor de tmp_table_size si realiza muchas consultas avanzadas GROUP BY y tiene mucha memoria disponible. 250
tmpdir El directorio usado para ficheros y tablas temporales. Esta variable puede tomar una lista de diferentes paths usados con una poltica round-robin. Estos paths pueden separarse mediante dos puntos (':') en Unix y punto y coma (';') en Windows, NetWare, y OS/2. Esta caracterstica puede usarse para repartir la carga entre varios discos fsicos. Si el servidor MySQL acta como un esclavo de replicacin, no debe asignar tmpdir un valor que apunte a un directorio en un sistema de ficheros en memoria o a un directorio que se borre cada vez que el servidor reinicie. Un esclavo de replicacin necesita que algunos de sus ficheros temporales sobrevivan a un reinicio de servidor de forma que pueeda replicar tablas temporales u operaciones LOAD DATA INFILE . Si los ficheros en un directorio de ficheros temporales se pierden cuando reinicia el servidor, la replicacin falla. transaction_alloc_block_size El tamao reservado (en bytes) de bloques de memoria que se reservan para almacenar consultas que son partes de una transaccin que debe ser guardad en el log binario al hacer un commit. transaction_prealloc_size Tamao en bytes del buffer persistente para transaction_alloc_blocks que no se libera entre consultas. Hacindolo lo suficientemente grande para guardar todas las consultas dentro de una nica transaccin, puede evitar varias llamadas malloc() . tx_isolation El nivel de aislamiento de transaccin por defecto. Por defecto es REPEATABLE-READ. updatable_views_with_limit Esta variable controla si las actualizaciones pueden hacerse usando una vista que no contenga una clave primria en la tabla subyacente, si la actualizacin contiene una clusula LIMIT . (Tales actualizaciones normalmente las generan herramientas GUI.) Una actualizacin es un comando UPDATE o DELETE.Clave primaria se refiere a un ndice PRIMARY KEY, o UNIQUE en el que ninguna columna puede contener NULL. La variable puede tener dos valores: 1 o YES: Muestra slo una advertencia (no un mensaje de error). Este es el valor por defecto. 0 o NO: Prohibe la actualizacin. Esta variable se aadi en MySQL 5.0.2. version El nmero de versin para el servidor. version_bdb La versin del motor de almacenamiento BDB. version_comment El script configure tiene una opcin --with-comment que permite especificar un comentario al compilar MySQL. Esta variable contiene el valor de dicho comentario. version_compile_machine El tipo de mquina o arquitectura en el que se compil MySQL. version_compile_os
251
El tipo de sistema operativo en el que se compil MySQL. wait_timeout Nmero de segundos que el servidor espera para recibir actividad en una conexin no interactiva antes de cerrarla. En el arranque de un thread, el valor de la variable de sesin wait_timeout se inicializa de la variable global wait_timeout o de interactive_timeout , dependiendo del tipo de cliente (como se define en la opcin de conexin CLIENT_INTERACTIVE de mysql_real_connect()). Consulte tambin interactive_timeout.
252
innodb_autoextend_increment innodb_concurrency_tickets innodb_max_dirty_pages_pct innodb_max_purge_lag innodb_sync_spin_loops innodb_table_locks innodb_thread_concurrency innodb_thread_sleep_delay insert_id interactive_timeout join_buffer_size key_buffer_size last_insert_id local_infile log_warnings long_query_time low_priority_updates max_allowed_packet 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 multi_read_range myisam_data_pointer_size log_bin_trust_routine_creators myisam_max_sort_file_size myisam_repair_threads myisam_sort_buffer_size net_buffer_length net_read_timeout net_retry_count
numrica numrica numrica numrica numrica booleana numrica GLOBAL numrica GLOBAL booleana numrica numrica numrica numrica booleana numrica numeric booleana numrica numrica numrica numrica numrica numrica numrica numrica numrica numrica numrica numrica numrica numrica numrica numrica numrica numrica booleana numrica numrica numrica numrica numrica numrica
SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL SESSION GLOBAL GLOBAL GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL GLOBAL GLOBAL GLOBAL GLOBAL GLOBAL | SESSION GLOBAL | SESSION GLOBAL GLOBAL | SESSION GLOBAL GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL GLOBAL GLOBAL | SESSION GLOBAL GLOBAL GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION
253
net_write_timeout old_passwords optimizer_prune_level optimizer_search_depth preload_buffer_size 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 secure_auth server_id slave_compressed_protocol slave_net_timeout slave_transaction_retries slow_launch_time sort_buffer_size sql_auto_is_null sql_big_selects sql_big_tables sql_buffer_result sql_log_bin sql_log_off sql_log_update sql_low_priority_updates sql_max_join_size sql_mode sql_notes sql_quote_show_create sql_safe_updates sql_select_limit sql_slave_skip_counter updatable_views_with_limit sql_warnings sync_binlog
numrica numrica numrica numrica numrica numrica numrica numrica enumeracin booleana numrica numrica numrica numrica numrica numrica booleana booleana numrica booleana numrica numrica numrica numrica booleana booleana booleana booleana booleana booleana booleana booleana numrica enumeracin booleana booleana booleana numrica numrica enumeracin booleana numrica
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 GLOBAL GLOBAL | SESSION SESSION SESSION SESSION SESSION SESSION SESSION SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION SESSION SESSION SESSION SESSION GLOBAL GLOBAL | SESSION SESSION GLOBAL
254
sync_frm storage_engine table_cache table_type thread_cache_size time_zone timestamp tmp_table_size transaction_alloc_block_size transaction_prealloc_size tx_isolation unique_checks wait_timeout warning_count
booleana enumeracin numrica enumeracin numrica cadena de caracteres booleana enumeracin numrica numrica enumeracin booleana numrica numrica
GLOBAL GLOBAL | SESSION GLOBAL GLOBAL | SESSION GLOBAL GLOBAL | SESSION SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION SESSION GLOBAL | SESSION SESSION
Variables marcadas como cadena de caracteres toman un valor de cadena de caracteres. Variables marcadas como numrica toman un valor numrico. Variables marcadas como boolean toman como valor 0, 1, ON o OFF. Variables marcadas como enumeracin normalmente deben tomar uno de los valores disponibles para la variable, pero tambin pueden tomar como valor el nmero correspondiente al valor deseado de la enumeracin. Para variables de sistema enumeradas, el primer valor de la enumeracin es 0. Esto difiere de las columnas ENUM , en que el primer valor de la enumeracin es 1.
Muchas variables de estado son inicializadas a 0 por la sentencia FLUSH STATUS. Las variables de estado tienen los siguientes significados. Las variables en las que no se indica versin estn presentes en MySQL 5.0. Para informacin a propsito de su historial de implementacin, consulte Manual de referencia de MySQL 4.1. Aborted_clients
255
El nmero de conexiones que han sido abortadas debido a que el cliente muri sin cerrar la conexin apropiadamente. Consulte Seccin A.2.10, Errores de comunicacin y conexiones abortadas. Aborted_connects El nmero de intentos de conexin al servidor MySQL que han fallado. Consulte Seccin A.2.10, Errores de comunicacin y conexiones abortadas. Binlog_cache_disk_use El nmero de transacciones que han utilizado la cache temporal del registro binario pero han excedido el valor de binlog_cache_size y utilizado un archivo temporal para almacenar las sentencias de la transaccin. Binlog_cache_use El nmero de transacciones que han utilizado la cache temporal del registro binario. Bytes_received El nmero de bytes recibidos desde todos los clientes. Bytes_sent El nmero de bytes enviados hacia todos los clientes. Com_xxx Las variables del contador de sentencias Com_xxx indica el nmero de veces que cada sentencia xxx ha sido ejecutada. Existe una variable de estado por cada tipo de sentencia. Por ejemplo Com_delete y Com_insert cuentan sentencias DELETE and INSERT, respectivamente. Las variables de estado Com_stmt_xxx fueron aadidas en 5.0.8: Com_stmt_prepare Com_stmt_execute Com_stmt_fetch Com_stmt_send_long_data Com_stmt_reset Com_stmt_close Estas variables representan comandos de sentencias preparadas. Sus nombres se refieren a los comandos COM_xxx utilizados en la capa de red; en otras palabras: Sus valores son incrementados siempre que las llamadas de la API de sentencias preparadas como mysql_stmt_prepare(), mysql_stmt_execute(), etc. son ejecutadas. Asmismo,Com_stmt_prepare, Com_stmt_execute y Com_stmt_close se incrementan tambin cuando alguien ejecuta las siguientes sentencias SQL: PREPARE, EXECUTE, or DEALLOCATE respectivamente. Com_stmt_fetch representa el nmero total de comunicaciones de red ejecutadas al recibir datos de los cursores Todas las variables Com_stmt_xxx son incrementadas aunque el argumento de una sentencia preparada sea desconocido u ocurra un error durante la ejecucin. Es decir, sus valores corresponden al nmero de peticiones recibidas, no al nmero de peticiones completadas con xito. Connections El nmero de instentos de conexin (con xito o no) al servidor MySQL.
256
Created_tmp_disk_tables El nmero de tablas temporales en disco creadas automticamente por el servidor mientras ejecutaba sentencias. Created_tmp_files Nmero de arhcivos temporales que mysqld ha creado. Created_tmp_tables El nmero de tablas temporales en memoria creadas automticamente por el servidor mientras ejecuta sentencias. Si Created_tmp_disk_tables es grande, quiz querra aumentar el valor de tmp_table_size para causar que las tablas sean basadas en memoria en vez de basadas en disco. Delayed_errors El nmero de registros escritos con INSERT DELAYED en los que algn error ocurri (probablemente duplicate key). Delayed_insert_threads El nmero de hilos gestores de INSERT DELAYED en uso. Delayed_writes El nmero de registros INSERT DELAYED escritos Flush_commands El nmero de comandos FLUSH ejecutados. Handler_commit El nmero de sentencias COMMIT internas. Handler_discover El servidor MySQL puede preguntar al motor de almacenamiento NDB Cluster si conoce una tabla con un nombre dado. Esto se llama descubrimiento (discovery). Handler_discover indica el nmero de veces que se han descubierto tablas mediante este mecanismo. Handler_delete El nmero de veces que se han borrado registros de tablas. Handler_read_first El nmero de veces que se lee la primera entrada de un ndice. Si este valor es alto, indica que el servidor est haciendo muchos escaneos "full index"; por ejemplo, SELECT col1 FROM foo, suponiendo que col1 est indexada. Handler_read_key El nmero de peticiones para leer un registro basadas en una clave. Si este nmero es alto, es una buena indicacin de que las consultas y tablas estn indexadas adecuadamente. Handler_read_next El nmero de peticiones para leer el siguiente registro en el orden de la clave. Esto se incrementa cada vez que se est consultando una columna indexada con una restriccin de rango, o si se est haciendo un escaneo de ndice.
257
Handler_read_prev El nmero de peticiones para leer el registro previo en el orden de la clave. Este mtodo de lectura es utilizado principalmente para optimizar ORDER BY ...DESC. Handler_read_rnd El nmero de peticiones para leer un registro basndose en una posicin fija. Es alto si se estn haciendo muchas consultas que requieren ordenacin del resultado. Probablemente tenga muchas consultas que requieran que MySQL escanee tablas completas o tiene joins que no utilizan claves adecuadamente. Handler_read_rnd_next El nmero de peticiones para leer el siguiente registro en el archivo de datos. ste es alto si est haciendo muchos escaneos de tablas. Generalmente esto sugiere que las tablas no estn indexadas adecuadamente o que las consultas no estn escritas para obetner ventaja de los ndices que se tienen. Handler_rollback El nmero de sentencias ROLLBACK internas. Handler_update El nmero de peticiones de modificacin de un registro en una tabla. Handler_write El nmero de peticiones de insercin de un registro en una tabla. Innodb_buffer_pool_pages_data El nmero de pginas que contienen datos (procesados o no). Aadido en MySQL 5.0.2. Innodb_buffer_pool_pages_dirty El nmero de pginas sin procesar. Aadido en MySQL 5.0.2. Innodb_buffer_pool_pages_flushed El nmero de pginas del buffer sobre las que se ha hecho una peticin de volcado. Aadido en MySQL 5.0.2. Innodb_buffer_pool_pages_free El nmero de pginas libres. Aadido en MySQL 5.0.2. Innodb_buffer_pool_pages_latched El nmero de pginas bloqueadas en el buffer InnoDB. Estas son las pginas que estn siendo actualmente leidas o escritas o que no pueden ser volcadas o borradas por alguna otra razn. Aadido en MySQL 5.0.2. Innodb_buffer_pool_pages_misc El nmero de pginas ocupadas porque han sido seleccionadas para procesos administrativos, como bloqueos de registro o el ndice de hash adaptativo. Este valor puede ser tambin calculado como Innodb_buffer_pool_pages_total - Innodb_buffer_pool_pages_free Innodb_buffer_pool_pages_data. Aadido en MySQL 5.0.2. Innodb_buffer_pool_pages_total Tamao total del buffer, en pginas. Aadido en MySQL 5.0.2.
258
Innodb_buffer_pool_read_ahead_rnd El nmero de lecturas avanzadas ``aleatorias'' que InnoDB ha iniciado. Esto pasa cuando una consulta necesita escanear una gran pocin de una tabla pero en orden aleatorio. Aadido en MySQL 5.0.2. Innodb_buffer_pool_read_ahead_seq El nmero de lecturas avanzadas secuenciales que InnoDB ha iniciado. Esto pasa cuando InnoDB realiza un escaneo secuencial completo de una tabla. Aadido en MySQL 5.0.2. Innodb_buffer_pool_read_requests El nmero de peticiones lgicas de lectura que InnoDB ha hecho. Aadido en MySQL 5.0.2. Innodb_buffer_pool_reads El nmero de lecturas lgicas del buffer que InnoDB no pudo satisfacer y tuvo que hacer una lectura de una nica pgina. Aadido en MySQL 5.0.2. Innodb_buffer_pool_wait_free Normalmente, las escrituras al buffer de InnoDB se llevan acabo en segundo plano. An as, si es necesario leer o crear una pgina y no existe ninguna pgina vaca disponible, entonces es tambin necesario esperar a que las pginas sean volcadas previamente. Este contador cuenta las instancias de estas esperas. Si el tamao del buffer ha sido establecido correctamente, este valor debera ser pequeo. Aadido en MySQL 5.0.2. Innodb_buffer_pool_write_requests El nmero de escrituras hechas al buffer de InnoDB. Aadido en MySQL 5.0.2. Innodb_data_fsyncs El nmero de operaciones fsync() total. Aadido en MySQL 5.0.2. Innodb_data_pending_fsyncs El nmero de operaciones fsync() pendientes. Aadido en MySQL 5.0.2. Innodb_data_pending_reads El nmero actual de lecturas pendientes. Aadido en MySQL 5.0.2. Innodb_data_pending_writes El nmero actual de escrituras pendientes. Aadido en MySQL 5.0.2. Innodb_data_read El total de datos leidos, en bytes. Aadido en MySQL 5.0.2. Innodb_data_reads El nmero total de lecturas de datos. Aadido en MySQL 5.0.2. Innodb_data_writes El nmero total de escrituras de datos. Aadido en MySQL 5.0.2. Innodb_data_written El total de datos escritos, en bytes. Aadido en MySQL 5.0.2.
259
Innodb_dblwr_writes , Innodb_dblwr_pages_written El nmero de operaciones doublewrite que se han ejecutado y el nmero de pginas que se han escrito para ello. Aadido en MySQL 5.0.2. Consulte Seccin 15.14.1, E/S de disco (Disk I/O). Innodb_log_waits El nmero de esperas debidas a que el registro del buffer era demasiado pequeo y se tuvo que esperar a que fuese volcado antes de continuar. Aadido en MySQL 5.0.2. Innodb_log_write_requests El nmero de peticiones de escritura al registro. Aadido en MySQL 5.0.2. Innodb_log_writes El nmero de escrituras fsicas al archivo de registro. Aadido en MySQL 5.0.2. Innodb_os_log_fsyncs El nmero de escrituras fsync() realizadas al archivo de registro. Aadido en MySQL 5.0.2. Innodb_os_log_pending_fsyncs El nmero de operaciones fsync() del archivo de registro. Aadido en MySQL 5.0.2. Innodb_os_log_pending_writes Escrituras del archivo de registro pendientes. Aadido en MySQL 5.0.2. Innodb_os_log_written El nmero de bytes escritos al archivo de registro. Aadido en MySQL 5.0.2. Innodb_page_size El tamao de pgina con que se compil InnoDB (16KB por defecto). Muchos valores son contados en pginas; el tamao de pgina permite convertirlos fcilmente a bytes. Aadido en MySQL 5.0.2. Innodb_pages_created El nmero de pginas creadas. Aadido en MySQL 5.0.2. Innodb_pages_read El nmero de pginas leidas. Aadido en MySQL 5.0.2. Innodb_pages_written El nmero de pginas escritas. Aadido en MySQL 5.0.2. Innodb_row_lock_current_waits El nmero de bloqueos de registro por el que se est esperando. Aadido en MySQL 5.0.3. Innodb_row_lock_time El tiempo total gastado en adquirir bloqueos de registro, en milisegundos. Aadido en MySQL 5.0.3. Innodb_row_lock_time_avg El tiempo medio gastado en adquirir un bloqueo de registro, en milisegundos. Aadido en MySQL 5.0.3. Innodb_row_lock_time_max
260
El tiempo mximo gastado en adquirir un bloqueo de registro, en milisegundos. Aadido en MySQL 5.0.3. Innodb_row_lock_waits El nmero de veces que se ha tenido que esperar por un bloqueo de registro. Aadido en MySQL 5.0.3. Innodb_rows_deleted El nmero de registros borrados de tablas InnoDB. Aadido en MySQL 5.0.2. Innodb_rows_inserted El nmero de registros insertados en tablas InnoDB. Aadido en MySQL 5.0.2. Innodb_rows_read El nmero de registros leidos desde tablas InnoDB. Aadido en MySQL 5.0.2. Innodb_rows_updated El nmero de registros actualizados en tablas InnoDB. Aadido en MySQL 5.0.2. Key_blocks_not_flushed El nmero de bloques de claves en la cache de claves que han cambiado pero todava no han sido volcados a disco. Key_blocks_unused El nmero de bloques sin utilizar en la cache de claves. Puede utilizar este valor para determinar qu tamao de la cache de claves est en uso; consulte la discusin de key_buffer_size en Seccin 5.3.3, Variables de sistema del servidor. Key_blocks_used El nmero de bloques utilizados en la cache de claves. Este valor es una marca de mximo, que indica el nmero mximo de bloques que han sido nunca utilizados al mismo tiempo. Key_read_requests El nmero de peticiones para leer un bloque de claves de la cache. Key_reads El nmero de lecturas fsicas de un bloque de claves desde disco. Si Key_reads es grande, entonces el valor de key_buffer_size es, probablemente, demasiado pequeo. La tasa de fallos de la cache puede ser calculada como Key_reads/Key_read_requests. Key_write_requests El nmero de peticiones de escritura de un bloque de claves a la cache. Key_writes El nmero de escrituras fsicas de un bloque de claves a disco. Last_query_cost El coste total de la ltima consulta compilada tal como ha sido computada por el optimizador de consultas. Es til para comparar el coste de diferentes planes de ejecucin para la misma consulta. El valor por defecto de 0 significa que no se ha compilado ninguna consulta todava. Esta variable
261
fue aadida en MySQL 5.0.1 con un valor por defecto de -1. En MySQL 5.0.7 el valor por defecto ha cambiado a 0; tambin en la versin 5.0.7, el mbito de Last_query_cost ha cambiado a sesin en vez de global. Max_used_connections El nmero mximo de conexiones que han sido utilizadas simultneamente desde que el servidor ha sido iniciado. Not_flushed_delayed_rows El nmero de registros esperando a ser escritos en colas de INSERT DELAY. Open_files El nmero de archivos que estn abiertos. Open_streams El nmero de flujos de datos (strems) que estn abiertos (utilizados principalmente para el registro). Open_tables El nmero de tablas que estn actualmente abiertas. Opened_tables El nmero de tablas que han sido abiertas. Si Opened_tables es grande, probablemente el valor de table_cache es demasiado pequeo. Qcache_free_blocks El nmero de bloques de memoria libres en la cache de consultas. Qcache_free_memory El total de memoria libre en la cache de consultas. Qcache_hits El nmero de xitos de la cache. Qcache_inserts El nmero de consultas aadidas a la cache. Qcache_lowmem_prunes El nmero de consultas que fueron borradas de la cache de consultas debido a baja memoria. Qcache_not_cached El nmero de consultas que no han entrado en la cache (por no ser "cacheables", o debido al parmetro query_cache_type). Qcache_queries_in_cache El nmero de consultas registradas en la cache. Qcache_total_blocks El nmero total de bloques en la cache de consultas. Questions
262
El nmero de consultas que han sido enviadas al servidor. Rpl_status El estado de la replicacin a prueba de fallos (todava no implementado). Select_full_join El nmero de joins que no utilizan ndices. Si este valor no es 0, debera comprobar cuidadosamente los ndices de sus tablas. Select_full_range_join El nmero de joins que han utilizado una bsqueda por rango en una tabla de referencia. Select_range El nmero de joins que han usado rangos en la primera table. Normalmente no es algo crtico aunque pueda ser bastante grande. Select_range_check El nmero de joins sin claves que comprueban la utilizacin de claves despus de cada registro. Si esto no es cero, debera comprobar cuidadosamente los ndices de sus tablas. Select_scan El nmero de joins que han hecho un escaneo total de la primera tabla. Slave_open_temp_tables El nmero de tablas temporales abiertas actualmente por el subproceso SQL esclavo. Slave_running Este valor es ON si el servidor es un esclavo que est conectado a un servidor maestro. Slave_retried_transactions Nmero total de veces desde el inicio que el subproceso SQL esclavo de replicacin ha intentando alguna transaccin. Para la serie de MySQL 5.0, esta variable fue aadida en la versin 5.0.4. Slow_launch_threads El nmero de subprocesos que han tardado en crearse ms de slow_launch_time segundos. Slow_queries El nmero de consultas que han tardado ms de long_query_time segundos. Consulte Seccin 5.10.4, El registro de consultas lentas (Slow Query Log). Sort_merge_passes El nmero de pasadas que el algoritmo de ordenacin ha tenido que hacer. Si este valor es grande, debera considerar incrementar el valor de la variable de sistemasort_buffer_size Sort_range El nmero de ordenaciones que fueron realizadas utilizando rangos. Sort_rows El nmero de registros ordenados.
263
Sort_scan El nmero de ordenaciones que fueron hechas escaneando la tabla. Ssl_xxx Variables utilizadas para conexiones SSL. Table_locks_immediate El nmero de veces que un bloque de tabla ha sido adquirido inmediatamente. Table_locks_waited El nmero de veces que un bloque de tabla no se ha podido adquirir inmediatamente y se ha necesitado una espera. Si esto es alto, y tiene problemas de rendimiento, debera primero optimizar sus consultas y despus, o bien utilizar replicacin, o dividir sus tablas. Threads_cached El nmero de subprocesos en la cache de subprocesos. Threads_connected El nmero de conexiones abiertas actualmente. Threads_created El nmero de subprocesos creados para gestionar conexiones. Si Threads_created es grande, debera incrementar el valor de thread_cache_size. La tasa de xitos de la cache puede ser calculada como Threads_created/Connections. Threads_running El nmero de subprocesos que no estn durmiendo. Uptime El nmero de segundos que el servidor ha estado funcionando ininterrumpidamente.
264
recibe una seal SIGTERM. Un servidor ejecutndose como servicio en Windows se apaga cuando el administrador de servicios se lo indica. 2. El servidor crea un subproceso de apagado si es necesario. Dependiendo de como se ha iniciado el apagado, el servidor puede crear un subproceso para llevar a cabo el proceso de apagado. Si el apagado fue demandado por un cliente, se crea un subproceso de apagado. Si el apagado es debido a la recepcin de una seal SIGTERM, el subproceso de la seal podra llevar a cabo el apagado l mismo, o podra crear un subproceso separado para hacerlo. Si el servidor intenta crear un subproceso de apagado y no puede hacerlo (por ejemplo, porque no hay memoria suficiente disponible), crea un mensaje de diagnstico que aparece en el registro de errores:
Error: Can't create thread to kill server
3. El servidor deja de aceptar nuevas conexiones. Para prevenir que comiencen nuevas actividades durante el apagado, el servidor deja de aceptar nuevas conexiones de clientes. Esto lo consigue cerrando las conexiones de red a las que normalmente escucha: el puerto TCP/IP, el archivo socket Unix, la "named pipe" de Windows, y la memoria compartida de Windows. 4. El servidor acaba con su tarea actual. En cada subproceso asociado a una conexin de un cliente, se rompe la conexin al cliente, y dicho subproceso es marcado como muerto. Los subprocesos mueren cuando se dan cuenta de que han sido marcados de esa manera. Los subprocesos de conexiones inactivas mueren rpidamente. Los que estn actualmente procesando sentencias, consultan periodicamente su estado y tardan un poco ms en morir. Para encontrar informacin adicional sobre la terminacin de subprocesos, consulte Seccin 13.5.5.3, Sintaxis de KILL, en particular las instrucciones sobre las operaciones REPAIR TABLE o OPTIMIZE TABLE que han sido matadas en tablas MyISAM. En los subprocesos que tienen abierta una transaccin, la transaccin se cancela. Ntese que si un subproceso est actualizando una tabla no transaccional, una operacin como un UPDATE o INSERT de mltiples registros podra dejar la tabla parcialmente actualizada, porque la operacin puede terminar antes de ser completada. Si el servidor es un servidor maestro de replicacin, los subprocesos asociados a esclavos todava conectados son tratados como subprocesos de cualquier otro cliente. Es decir, cada uno es marcado como muerto y se cierra la prxima vez que ste comprueba su estado. Si el servidor es un servidor esclavo de replicacin, los subprocesos de Entrada/Salida y SQL se paran, si estn activos, antes de que los subprocesos de cliente sean marcados como muertos. Se permite al subproceso SQL finalizar su sentencia actual (para evitar causar problemas de replicacin), y entonces se para. Si el subproceso SQL estaba en medio de una transaccin en ese momento, la transaccin se cancela. 5. Se apagan o cierran los motores de almacenamiento. En este punto, la cache de tabla se escribe a disco y se cierran todas las tablas abiertas. Cada motor de almacenamiento realiza todas las acciones necesarias para las tablas que controla. Por ejemplo, MyISAM realiza cualquier escritura de ndices pendiente de una tabla. InnoDB escribe sus buffers a disco (desde la versin 5.0.5: a menos que innodb_fast_shutdown valga 2), escribe el nmero de secuencia de registro (LSN - Log Sequence Number) en el espacio de tablas, y cierra sus propios subprocesos internos. 6. El servidor se cierra.
265
Esta seccin describe algunos temas generales de seguridad que hay que tener en cuenta, y qu se puede hacer para aumentar la seguridad de la instalacin MySQL contra ataques o errores de uso. Para encontrar informacin especfica sobre el sistema de control de accesos que MySQL utiliza para crear cuentas de usuarios y comprobar el acceso a las bases de datos, consulte Seccin 5.6, El sistema de privilegios de acceso de MySQL.
266
Intente escanear sus puertos desde Internet utilizando una herramienta como nmap. MySQL utiliza el puerto 3306 por defecto. Este puerto no debera ser accesible desde lugares no confiables. Otra manera simple de probar si el puerte MySQL est abierto o no es intentar el siguiente comando desde alguna mquina remota, donde server_host es la mquina en la que su servidor MySQL se est ejecutando:
shell> telnet server_host 3306
Si consigue conectar y algunos caracteres extraos, el puerto est abierto, y debera cerrarlo en su firewall o router, a menos que tenga una buena razn para mantenerlo abierto. Si el comando telnet no consigue conectar o la conexin es rechazada, entonces el puerto se encuentra bloqueado, que es como queremos que est. No confe en ningn dato enviado por los usuarios de sus aplicaciones. Pueden intentar engaar a su cdigo introduciendo secuencias de caracteres especiales en formularios webs, URLs, o cualquier aplicacin que haya desarrollado. Asegrese de que su aplicacin permance segura si un usuario introduce algo como ``; DROP DATABASE mysql;''. Este es un ejemplo algo extremo, pero los mayores agujeros de seguridad y prdidas de datos pueden ocurrir como resultado de hackers utilizando tcnicas similares, si no se est preparado para ellas. Un error comn es proteger nicamente valores de tipo cadena de caracteres. Recuerde comprobar los datos numricos tambin. Si una aplicacin genera una consulta como SELECT * FROM table WHERE ID=234 cuando un usuario introduce el valor 234, el usuario podra introducir el valor 234 OR 1=1 para provocar que la aplicacin genere la consulta SELECT * FROM table WHERE ID=234 OR 1=1. Como resultado, el servidor extraer todos los registros en la tabla. Esto, adems de exponer cada registro, causa una carga excesiva en el servidor. La manera ms simple de protegerse frente a este tipo de ataque es utilizar comillas simples alrededor de las constantes numricas: SELECT * FROM table WHERE ID='234'. Si el usuario entrase informacin extra, todo sera parte de la cadena de caracteres. En un contexto numrico, MySQL automticamente convierte esta cadena en un nmero, y elimina cualquier carcter no nmerico del final que la cadena pueda contener. A veces la gente piensa que si una base de datos contiene slo datos de dominio pblico, no tiene por qu ser protegida. Esto es incorrecto. Aunque sea admitible mostrar cualquier registro de la base de datos, siempre se debera proteger contra ataques de tipo denegacin de servicio (por ejemplo, aquellos que se basan en la tcnica del prrafo precedente, que causan que el servidor malgaste recursos). Si no, el servidor podra quedar inservible para sus usuarios legtimos. Lista de comprobaciones: Intente introducir comillas simples y dobles (''' y '"') en todos sus formularios web. Si obtiene cualquier clase de error MySQL, investigue el problema sin demora. Intente modificar las URLs dinmicas aadiendo las cadenas %22 ('"'), %23 ('#'), y %27 ('''). Intente modificar los tipos de datos en las URLs dinmicas de tipos numricos a alfanumricos, usando los caracteres mostrados en los ejemplos previos. Su aplicaicn debera ser segura contra estos y otros ataques similares. Intente introducir letras, espacios, y smbolos especiales en vez de nmeros en los campos numeicos. Su aplicacin debera eliminarlos antes de pasarlos a MySQL, o en todo caso generar un error. Pasar valores sin comprobar a MySQL es muy peligroso! Compruebe el tamao de los datos antes de pasrselos a MySQL. Haga que su aplicacin se conecte a la base de datos utilizando un nombre de usuario diferente del que utiliza para tareas administrativas. No d a sus aplicaciones ningn acceso que no necesiten.
267
Muchas interfaces de programacin de aplicaciones proveen alguna manera de preceder con caracteres de escape los caracteres especiales en sus datos. Usados adecuadamente, esto previene que los usuarios de las aplicaciones introduzcan valores que provoquen que la aplicacin genere sentencias con efectos diferentes a los que usted pretenda: API MySQL de C: Utilice la funcin mysql_real_escape_string(). MySQL++: Utilice los modificadores escape y quote para streams PHP: Utilice la funcin mysql_escape_string(), que est basada en la funcin del mismo nombre de la API MySQL de C. (Con versiones anteriores a PHP 4.0.3, utilice addslashes() en cambio.) En PHP 5, puede utilizar la extensin mysqli, que soporta los protocolo de autentificacin y clave de acceso mejorados de MySQL, as como las sentencias preparadas con placeholders. DBI de Perl: Utilice el mtodo quote() o utilice placeholders. JDBC de Java: Utilice un objeto PreparedStatement y placeholders. Otras interfaces de programacin deberan tener capacidades similares. No transmita datos sin cifrar por Internet. Esta informacin es accesible para cualquiera que tenga el tiempo y la habilidad para interceptarla y utilizarla para sus propios propsitos. En vez de eso, utilice un protocolo de cifrado como SSL o SSH. MySQL soporta conexiones SSL internas desde la versin 4.0.0. El redireccionamiento de puertos de SSH se puede utilizar para crear un tunel cifrado (y comprimido) para la comunicacin. Aprenda a utilizar las herramientas tcpdump y strings. En la mayora de los casos, usted puede comprobar si los flujos de datos de MySQL estn cifrados ejecutando un comando como el siguiente:
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
(Esto funciona en Linux, y debera funcionar, con pequeas modificaciones en otros sistemas.) Atencin: Si no ve los datos en formato de texto, esto no siempre quiere decir que la informacin est realmente cifrada. Si necesita un alto nivel de seguridad, debera consultar a un experto en la materia.
268
Utilice claves para todos los usuarios MySQL. Un programa cliente no conoce necesariamente la identidad de la persona utilizndolo. Es comn en las aplicaciones cliente/servidor que el usuario pueda especificar cualquier nombre de usuario al programa cliente. Por ejemplo, cualquiera puede utilizar el programa mysql para conectarse como cualquier otra persona, simplemente invocndolo de la siguiente manera: mysql -u otro_usuario nombre_bd cuando otro_usuario no tiene clave. Si todos los usuarios tienen una clave, conectarse utilizando la cuenta de otro usuario se vuelve mucho ms difcil. Para cambiar la clave de un usuario, utilice la sentencia SET PASSWORD. Tambin es posible alterar la tabla user en la base de datos mysql directamente. Por ejemplo, para cambiar la clave de todas las cuentas MySQL que tienen por nombre de usuario root, haga lo siguiente:
shell> mysql -u root mysql> UPDATE mysql.user SET Password=PASSWORD('newpwd') -> WHERE User='root'; mysql> FLUSH PRIVILEGES;
Nunca ejecute el servidor MySQL con el usuario root de Unix. Esto es extremadamente peligroso porque cualquier usuario con el privilegio FILE es capaz de crar ficheros como root (por ejemplo, ~root/.bashrc). Para prevenir esto, mysqld rechaza ejecutarse como root a menos que se utilice explcitamente la opcin --user=root. En vez de eso, mysqld puede (y debe) ser ejecutado mediante un usuario normal sin privilegios. Puede crear una cuenta de Unix especfica llamada mysql para hacelo todo an ms seguro. Utilice esta cuenta tan solo para administrar MySQL. Para ejecutar mysqld mediante un usuario de Unix diferente, aada la opcin user que especifica el nombre de usuario al grupo [mysqld] del fichero de opciones /etc/my.cnf o al fichero de opciones my.cnf en el directorio de datos del servidor. Por ejemplo:
[mysqld] user=mysql
Esto provoca que el servidor se inicie mediante el usuario designado, lo ejecute usted manualmente o mediante mysqld_safe o mysql.server. Para ms detalles, consulte Seccin A.3.2, Cmo ejecutar MySQL como usuario normal. Ejecutar mysqld como un usuario Unix diferente de root no significa que necesite cambiar el usuario root de la tabla user. Los usuarios de las cuentas MySQL no tienen nada que ver con los usuarios de las cuentas Unix. No permita el uso de enlaces simblicos a tablas. (Esto puede desactivarse con la opcin --skipsymbolic-links.) Esto es especialmente importante si ejecuta mysqld como root, porque cualquiera que tenga acceso de escritura al directorio de datos del servidor podra entonces borrar cualquier fichero en el sistema!. Consulte Seccin 7.6.1.2, Utilizacin de enlaces simblicos para tablas en Unix. Asegrese de que el nico usuario Unix con permisos de lectura o escritura en los directorios de la base de datos es el usuario que ejecuta mysqld. No otorgue los privilegios PROCESS o SUPER a usuarios no-administrativos. La salida del de mysqladmin processlist muestra el texto de cualquier sentencia que se est ejecutando, as que cualquier usuario al que se permita ejecutar ese comando puede ser capaz de ver si otro usuario ejecuta una sentencia UPDATE user SET password=PASSWORD('not_secure'). mysqld reserva una conexin extra para usuarios que tengan el privlegio SUPER, as que un usuario root puede conectarse y comprobar la actividad del servidor an cuando todas las conexiones normales estn en uso. El privilegio SUPER puede utilizarse para cerrar conexiones de cliente, cambiar el funcionamiento del servidor modificando el valor de variables del sistema, y controlar servidores de replicacin. 269
No otorgue el privilegio FILE a usuarios no-administrativos. Cualquier usuario que posea este privilegio puede escribir un archivo en cualquier de lugar del sistema de ficheros con los privilegios del demonio mysqld. Para hacer esto un poco ms seguro, los archivos generados con SELECT ... INTO OUTFILE no sobreescriben archivos existentes, y pueden ser escritos por cualquiera. El privilegio FILE puede tambin ser utilizado para leer cualquier archivos que sea legible por cualquiera o accesible para el usuario Unix que ejecuta el servidor. Con este privilegio, podra por ejemplo leer cualquier fichero e insertarlo en una tabla de la base de datos. Esto podra utilizarse, por ejemplo, utilizando LOAD DATA para cargar /etc/passwd en una tabla, que podra ser mostrada despus con un SELECT. Si no confa en sus DNS, podra utilizar nmeros IP en vez de nombres en las tablas de permisos (tablas grant). En cualquier caso, debera ser muy cuidadoso en crear registros en las tablas de permiso utilizando nombres que contengan caracteres comodn. Si quiere restringir el nmero de conexiones permitidas para una misma cuenta, puede hacerlo estableciando la variable max_user_connections de mysqld. La sentencia GRANT tambin soporta opciones de control de recursos para limitar la extensin de uso de servidor permitido a una cuenta. Consulte Seccin 13.5.1.3, Sintaxis de GRANT y REVOKE.
Esto asegura que el usuario no pueda cambiar ninguna columna de privilegios directamente, pero debe usar el comando GRANT para dar privilegios a otros usuarios. --secure-auth Desactiva autenticacin para cuentas que usen antiguas contraseas (pre-4.1) --skip-grant-tables Esta opcin hace que el servidor no use el sistema de privilegios en absoluto. Esto da a todo el mundo acceso total a todas las bases de datos! (Puede decirle a un servidor en ejecucin que arranque usando las tablas de permisos de nuevo usando mysqladmin flush-privileges o el comando mysqladmin reload, o mediante el comando FLUSH PRIVILEGES.) --skip-name-resolve Los nombres de equipo no se resuelven. Todo valor en la columna Host en la tabla de permisos deben ser nmeros IP o localhost. --skip-networking No permite conexiones TCP/IP a travs de la red. Todas las conexiones a mysqld se realizan mediante ficheros socket de Unix. --skip-show-database Con esta opcin, el comando SHOW DATABASES se permite slo a usuarios que tengan el privilegio SHOW DATABASES , y el comando muestra todos los nombres de bases de datos. Sin esta opcin , SHOW DATABASES est permitido a todos los usuarios, pero muestra cada nombre de base de datos slo si el usuario tiene el privilegio SHOW DATABASES o algn privilegio para la base de datos.
271
explcitamente para invocar mysql_options(... MYSQL_OPT_LOCAL_INFILE, 0). Consulte Seccin 24.2.3.44, mysql_options(). Puede desactivar todos los comandos LOAD DATA LOCAL desde el lado del servidor arrancando mysqld con la opcin --local-infile=0. Para el cliente de lnea de comando mysql, LOAD DATA LOCAL puede activarse especificando la opcin --local-infile[=1] , o deshabilitarse con la opcin --local-infile=0 . De forma similar, para mysqlimport, las opciones --local o -L permite la carga de datos locales. En cualquier caso, el uso exitoso de una operacin de carga local requiere que el servidor lo permita. Si usa LOAD DATA LOCAL en scripts de Perl scripts u otros programsa que lean del grupo [client] en los ficheros de opciones, puede aadir la opcin local-infile=1 a ese grupo. De todos modos, para evitar que esto cause problemas en programas que no entiendan localinfile, especifquelo usando el prefijo loose- :
[client] loose-local-infile=1
Si LOAD DATA LOCAL INFILE est desactivado, tanto en el servidor o el cliente, un cliente que trate de ejecutar dicho comando recibe el siguiente mensaje de error:
ERROR 1148: The used command is not allowed with this MySQL version
272
una base de datos o eliminar una tabla de la base de datos, el servidor verifica que tenga el permiso SELECT para la tabla o el permiso DROP para la base de datos. Si sus permisos cambian (por usted mismo o alguien distinto) mientras est conectado, estos cambios no tienen porqu tener efecto inmediatamente para el siguiente comando que ejecute. Consulte Seccin 5.6.7, Cundo tienen efecto los camios de privilegios para ms detalles. El servidor guarda informacin de privilegios en las tablas de permisos de la base de datos mysql (esto es, en la base de datos llamada mysql). El servidor MySQL lee el contenido de dichas tablas en memoria cuando arranca y las vuelve a leer bajo las circunstancias indicadas en Seccin 5.6.7, Cundo tienen efecto los camios de privilegios. Las decisiones acerca de control de acceso se basan en las copias en memoria de las tablas de permisos. Normalmente, manipula los contenidos de las tablas de permisos indirectamente usando los comandos GRANT y REVOKE para configurar cuentas y controlar los privilegios disponibles para cada una. Consulte Seccin 13.5.1.3, Sintaxis de GRANT y REVOKE. La discusin aqu describe la estructura subyacente de las tablas de permisos y cmo el servidor usa sus contenidos cuando interacta con clientes. El servidor usa las tablas user, db, y host en la base de datos mysql en ambas etapas de control de acceso. Las columnas en estas tablas de permisos se muestran a continuacin: Nombre tabla Alcance columnas user Host User Password Columnas privilegios Select_priv Insert_priv Update_priv Delete_priv Index_priv Alter_priv Create_priv Drop_priv Grant_priv Create_view_priv Show_view_priv db Host Db User Select_priv Insert_priv Update_priv Delete_priv Index_priv Alter_priv Create_priv Drop_priv Grant_priv Create_view_priv Show_view_priv Select_priv Insert_priv Update_priv Delete_priv Index_priv Alter_priv Create_priv Drop_priv Grant_priv Create_view_priv Show_view_priv host Host Db
Create_routine_privCreate_routine_priv Alter_routine_priv Alter_routine_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 Lock_tables_priv Lock_tables_priv References_priv References_priv
273
Repl_slave_priv Repl_client_priv Columnas seguridad ssl_type ssl_cipher x509_issuer x509_subject Columnas recursos control max_questions max_updates max_connections max_user_connections Execute_priv se present en MySQL 5.0.0, pero no fue operacional hasta MySQL 5.0.3. Las columnas Create_view_priv y Show_view_priv se aadieron en MySQL 5.0.1. Las columnas Create_routine_priv, Alter_routine_priv, y max_user_connections se aadieron en MySQL 5.0.3. Durante la segunda etapa de control de acceso, el servidor efecta una verificacin de peticin para asegurar que cada cliente tiene suficientes privilegios para cada peticin que recibe. Adicionalmente las tablas de permisos user, db, y host , el servidor puede consultar las tablas tables_priv y columns_priv para peticiones que impliquen tablas. Las tablas tables_priv y columns_priv proveen de un control de privilegios ms fino a nivel de tabla y columna. Tienen las siguientes columnas: Nombre tabla Alcance de columnas tables_priv Host Db User Table_name Columnas privilegios Otras columnas columns_priv Host Db User Table_name Column_name Table_priv Column_priv Timestamp Grantor Las columnas Timestamp y Grantor actualmente no se usan y no se discuten ms en esta seccin. Para verificacin de peticiones que impliquen rutinas almacenadas, el servidor puede consultar la tabla procs_priv. Esta tabla tiene las siguientes columnas: Nombre tabla Alcance de columnas procs_priv Host Db User Routine_name Routine_type Columnas privilegios Proc_priv Timestamp Column_priv
274
Otras columnas
Timestamp Grantor
La tabla procs_priv existe desde MySQL 5.0.3. La columna Routine_type se aadi en MySQL 5.0.6. Hay una columna ENUM con valores de 'FUNCTION' o 'PROCEDURE' para indicar el tipo de rutina a que se refiere el registro. Esta columna permite que los privilegios se otorgen separadamente para una funcin y para un procedimiento con el mismo nombre. Las columnas Timestamp y Grantor no se usan actualmente y no se discuten ms aqu. Cada tabla de permisos contiene columnas de alcance y columnas de privilegios: Las columnas de alcance determinan el alcance de cada entrada (registro) en las tablas; esto es, el contexto en que el registro se aplica. Por ejemplo, un registro de la tabla user con los valores Host y User de 'thomas.loc.gov' y 'bob' se usaran para autenticar conexiones hechas al servidor desde el equipo thomas.loc.gov por un cliente que especifique un nombre de usuario de bob. De forma similar, un registro de la tabla db con las columnas Host, User, y Db con valores 'thomas.loc.gov', 'bob' y 'reports' se usara cuando bob conectase desde el equipo thomas.loc.gov para acceder a la base de datos reports . Las tablas tables_priv y columns_priv contienen columnas de alcance indicando tablas o combinaciones de tabla/ columna para las que cada registro se aplica. La columna de alcance procs_priv indica la rutina de almacenamiento que se aplica a cada registro. Las columnas de privilegios indican qu privilegios se otorgan a un registro de la tabla; esto es, qu operaciones pueden ejecutarse. El servidor combina la informacin de diversas tablas de permisos para tener una descripcin completa de los permisos de un usuario. Las reglas usadas para ello se describen en Seccin 5.6.6, Control de acceso, nivel 2: comprobacin de solicitudes. Las columnas de alcance contienen cadenas de caracteres. Se declaran tal y como se muestra a continuacin; el valor por defecto es la cadena de caracteres vaca: Nombre de columna Host User Password Db Table_name Column_name Routine_name Tipo CHAR(60) CHAR(16) CHAR(16) CHAR(64) CHAR(64) CHAR(64) CHAR(64)
Con propsito de chequeos de acceso, las comparaciones de los valores de Host no tienen en cuenta maysculas y minsculas. Los valores de User, Password, Db, y Table_name son sensibles a maysculas y minsuclas. Los valores de Column_name no son sensibles a maysculas y minsculas. En las tablas user, db, y host , cada privilegio se lista en una columna separada que se declara como ENUM('N','Y') DEFAULT 'N'. En otras palabras, cada privilegio puede estar desactivado o activado, estando desactivados por defecto. En las tablas tables_priv, columns_priv, and procs_priv , las columnas de privilegios se declaran como columnas de tipo SET. Los valores en estas columnas pueden contener cualquier combinacin de los privilegios controlados por la tabla: Nombre de tabla Nombre de columna Posible conjunto de elementos
275
tables_priv
Table_priv
'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter' 'Select', 'Insert', 'Update', 'References' 'Select', 'Insert', 'Update', 'References' 'Execute', 'Alter Routine', 'Grant'
tables_priv
Column_priv
Brevemente, el servidor usa las tablas de permisos como sigue: Las columnas de alcance de la tabla user determinan si se rechazan o permiten conexiones entrantes. Para conexiones permitidas, cualquier privilegio otorgado en la tabla user indica los privilegios globales del usuario (superusuario). Estos privilegios se aplican a todas las bases de datos en el servidor. Las columnas de alcance de la tabla db determinan qu usuarios pueden acceder a qu bases de datos desde qu equipo. La columna de privilegios determina qu operaciones se permiten. Un privilegio otorgado a nivel de base de datos se aplica a la base de datos y a todas sus tablas. La tabla host se usa en conjuncin con la tabla db cuando desea que un registro de la tabla db se aplique a varios equipos. Por ejemplo, si queiere que un usuario sea capaz de usar una base de datos desde varios equipos en su red, deje el valor Host vaco en el registro de usuario de la tabladb , luego rellene la tabla host con un registro para cada uno de estos equipos. Este mecanismo se describe con mayor detalle en Seccin 5.6.6, Control de acceso, nivel 2: comprobacin de solicitudes. Nota: La tabla host no se ve afectada por los comandos GRANT ni REVOKE . La mayora de instalaciones MySQSL no necesitan usar esta tabla en absoluto. Las tablas tables_priv y columns_priv son similares a la tabla db , pero son ms detalladas: se aplican a nivel de tabla y de columna en lugar de a nivel de base de datos. Un privilegio otorgado a nivel de tabla se aplica a la tabla y a todas sus columnas. Un privilegio otorgado a nivel de columna se aplica slo a la columna especificada. La tabla procs_priv se aplica a rutinas almacenadas. Un privilegio otorgado a nivel de rutina se aplica slo a una nica rutina. Permisos administrativos (tales como RELOAD o SHUTDOWN) se especifican slo en la tabla user . Esto es debido a que las operaciones administrativas son operaciones del propio servidor y no especficas de bases de datos, as que no hay ninguna razn para listar estos privilegios en las otras tablas de permisos. De hecho, para determinar si puede realizar una operacin administrativa, el servidor slo necesita consultar la tabla user. El privilegio FILE tambin se especifica slo en la tabla user . No es un privilegio administrativo como tal, pero la habilidad de leer o escribir archivos en el equipo servidor es independiente de las bases de datos a las que acceda. El servidor mysqld lee los contenidos de las tablas de permisos en memoria cuando arranca. Puede decirle que las vuelva a leer mediante el comando FLUSH PRIVILEGES o ejecutando los comandos mysqladmin flush-privileges o mysqladmin reload . Los cambios en las tablas de permisos tienen efecto como se indica en Seccin 5.6.7, Cundo tienen efecto los camios de privilegios. Cuando modifica los contenidos de las tablas de permisos, es una buena idea asegurarse que sus cambios configuran permisos tal y como desea. Para consultar los permisos de una cuenta dada, use el comando SHOW GRANTS . Por ejemplo, para determinar los permisos que se otorgan a una cuenta con valores Host y User de pc84.example.com y bob, use este comando:
mysql> SHOW GRANTS FOR 'bob'@'pc84.example.com';
Una herramienta de diagnstico til es el script mysqlaccess , proporcionado por Yves Carlier para la distribucin MySQL. Invoque mysqlaccess con la opcin --help para ver cmo funciona.
276
Note que mysqlaccess chequea acceso usando slo las tablas user, db, y host . No chequea los privilegios de tabla, columna, o rutina especificados en las tablas tables_priv, columns_priv, o procs_priv. Para ayuda adicional en problemas relacionados con el diagnstico de permisos, consulte Seccin 5.6.8, Causas de errores Access denied. Para consejos generales sobre seguridad , consulte Seccin 5.5, Cuestiones de seguridad general.
277
SUPER
Super_priv
CREATE VIEW y SHOW VIEW fueron aadidos en MySQL 5.0.1. CREATE USER, CREATE ROUTINE, y ALTER ROUTINE fueron aaidos en MySQL 5.0.3. Aunque EXECUTE ya estaba presente en MySQL 5.0.0, no se activ hasta MySQL 5.0.3. Para utilizar estos privilegios cuando se actualice desde una versin ms antigua de MySQL que no los tiene, debe actualizar sus tablas grant utilizando el script mysql_fix_privilege_tables proporcionado con la distribucin MySQL. Consulte Seccin 2.10.2, Aumentar la versin de las tablas de privilegios. Para crear o modificar procedimientos almacenados cuando el registro binario est activado, debe tambin tener el privilegio SUPER, tal y como se explica en Seccin 19.3, Registro binario de procedimientos almacenados y disparadores. Los privilegios CREATE y DROP permiten crear nuevas bases de datos y tablas, o eliminar las existentes. Si otorga el privilegio DROP para la base de datos mysql a un usuario, ese usuario puede eliminar la base de datos en la que MySQL almacena los privilegios de acceso. Los privilegios SELECT, INSERT, UPDATE, and DELETE permiten realizar operaciones en registros de tablas existentes en una base de datos. Las sentencias SELECT requieren el privilegio SELECT slo si realmente extraen registros de una tabla. Algunas sentencias SELECT no acceden a tablas, y pueden ser ejecutados por tanto sin permiso para ninguna base de datos. Por ejemplo, podra utilizar el cliente mysql como una simple calculadora para evaluar expresiones que no hacen referencia a tablas:
mysql> SELECT 1+1; mysql> SELECT PI()*2;
El privilegio INDEX permite crear o eliminar ndices. INDEX es aplicable a tablas existentes. Si tiene el privilegio CREATE para una tabla, entonces puede incluir definiciones de ndices en la sentencia CREATE TABLE. El privilegio ALTER permite utilizar ALTER TABLE para cambiar la estructura de o renombrar tablas. El privilegio CREATE ROUTINE es necesario para crear procedimientos almacenados (funciones y procedimientos). El privilegio ALTER ROUTINE se necesita para modificar o eliminar procedimientos almacenados, y EXECUTE es necesario para ejecutarlos. El privilegio GRANT permite dar a otros usuarios las privilegios que uno mismo posee. Puede ser utilizado para bases de datos, tablas, y procedimientos almacenados. El privilegio FILE otorga permiso para leer y escribir archivos en la mquina del servidor utilizando las sentencias LOAD DATA INFILE y SELECT ... INTO OUTFILE. Un usuario que tiene el privilegio FILE puede leer cualquier archivo de la mquina del servidor que sea legible por cualquiera o por el usuario que ejecuta el servidor MySQL. (Esto implica que el usuario puede leer cualquier archivo en el directorio de datos, porque el servidor puede acceder a cualquiera de estos archivos.) El privilegio FILE tambin permite al usuario crear archivos nuevos en cualquier directorio en que el servidor MySQL tiene acceso de escritura. Los archivos existentes no pueden ser sobreescritos. Los privilegios restantes son utilizados para operaciones administrativas. Muchas de ellas puede ser realizadas utilizando el programa mysqladmin o mediante sentencias SQL. La siguiente tabla muestra qu comandos de mysqladmin permite ejecutar cada privilegio administrativo. Privilegio RELOAD SHUTDOWN PROCESS SUPER Comandos permitidos a los poseedores del privilegio Holders flush-hosts, flush-logs, flush-privileges, flush-status, flushtables, flush-threads, refresh, reload shutdown processlist kill
278
El comando reload comunica al servidor que debe releer las tablas grant a memoria. flushprivileges es un sinnimo de reload. El comando reload cierra y vuelve a abrir los archivos de registro y vuelca todas las tablas. Los otros comandos flush-xxx realizan funciones similares a refresh, pero son ms especficas y pueden ser preferibles en algunos casos. Por ejemplo, si quiere tan solo volcar los archivos de registro, flush-logs es mejor opcin que refresh. El comando shutdown apaga el servidor. Este comando puede ejecutarse nicamente desde mysqladmin. No hay sentencia SQL equivalente. El comando processlist muestra informacin sobre los subprocesos que se estn ejecutando en el servidor (es decir, sobre las sentencias que se estn ejecutando por parte de clientes asociados con otras cuentas). El comando kill mata los subprocesos del servidor. Siempre puede mostrar informacin sobre sus propios subprocesos, o matarlos, pero necesita el privilegio PROCESS para ver subprocesos iniciados por otros usuarios, y el privilegio SUPER para matarlos. Consulte Seccin 13.5.5.3, Sintaxis de KILL. El privilegio CREATE TEMPORARY TABLES permite la utilizacin de la palabra clave TEMPORARY en sentencias CREATE TABLE. El privilegio LOCK TABLES permite la utilizacin de sentencias LOCK TABLES explcitas para bloquear tablas para las que tiene el privilegio SELECT. Esto incluye el uso de bloqueos de escritura, que evita que cualquier otra persona lea la tabla bloqueada. El privilegio REPLICATION CLIENT permite la utilizacin de las sentencias SHOW MASTER STATUS y SHOW SLAVE STATUS. El privilegio REPLICATION SLAVE debera otorgarse a cuentas que son utilizadas por servidores esclavos para conectarse al servidor actual como su maestro. Sin este privilegio, la cuenta esclava no puede pedir actualizaciones que se hayan hecho a las bases de datos del servidor maestro. El privilegio SHOW DATABASES permite a la cuenta ver los nombres de las bases de datos mediante la ejecucin de la sentencia SHOW DATABASE. Cuentas que no tengan este privilegio solo pueden ver las bases de datos para las que tienen privilegios, y no pueden utilizar la sentencia de ninguna manera si el servidor ha sido iniciado con la opcin --skip-show-database. En general, es una buena idea garantizar a una cuenta solo aquellos privilegios que necesita. Se debe tener especial cuidado en seguir esta regla con los privilegios administrativos y FILE: El privilegio FILE puede utilizarse inadecuadamente para introducir en una tabla de la base de datos cualquier archivo que el servidor MySQL sea capaz de leer en la mquina del servidor. Esto incluye todos los archivos que sean legibles para cualquiera, adems de los archivos almacenados en el directorio de datos del servidor. Esta tabla puede entonces ser accedida utilizando una sentencia SELECT para transferir sus contenidos a la mquina cliente. El privilegio GRANT permite a los usuarios otorgar sus mismos privilegios a otros usuarios. Dos usuarios con diferentes privilegios y con el privilegio GRANT pueden combinar sus privilegios. El privilegio ALTER puede ser utilizado inadecuadamente para sabotear el sistema de privilegios mediante el renombrado de tablas. El privilegio SHUTDOWN puede utilizarse inadecuadamente para denegar el servicio a otros usuarios de manera total, cerrando el servidor. El privilegio PROCESS puede utilizarse para ver el texto de las consultas que se estn ejecutando actualmente, incluyendo consultas que establecen o modifican passwords. El privilegio SUPER puede utilizarse para cerrar la conexin a otros clientes o cambiar como el servidor funciona. Los privilegios otorgados para la propia base de datos mysql pueden utilizarse para cambiar passwords y otra informacin de privilegios de acceso. Las passwords se almacenan cifradas,
279
as que un usuario malicioso no puede simplemente leerlas para conocer la password. An as, el usuario con privlegio de escritura a la columna Password de la tabla user puede cambiar la password de una cuenta, y seguidamente conectarse al servidor MySQL utilizando esa cuenta. Hay algunas cosas que no se pueden hacer con el sistema de privilegios de MySQL: No se puede especificar explcitamente que a un usuario se le deba denegar el acceso. No se puede especificar que un usuario tenga privilegios para crear o eliminar tablas en una base de datos, pero que no pueda crear o eliminar la propia base de datos.
Las sintaxis alternativas de las opciones -h, -u, y -p son --host=nombre_host, -user=nombre_usuario, y --password=su_clave. Ntese que no hay espacios entre -p o -password= y la clave que le sigue. Si utiliza una opcin -p o --password pero no especifica un valor para la clave, el programa cliente le pedir que introduzca la clave. La clave no se mostrar mientras la introduce. Esto es ms seguro que especificar la clave en la lnea de comandos. Cualquier usuario de su sistema podra ser capaz de ver la clave especificada en la lnea de comandos ejecutando un comando como ps auxww. Consulte Seccin 5.7.6, Guardar una contrasea de forma segura. Los programas clientes de MySQL utilizan valores por defecto para cualquier parmetro que no se especifique: El nombre de servidor por defecto es localhost. El nombre de usuario por defecto es ODBC en Windows y su nombre de usuario de Unix en Unix. No se aplica ninguna clave si -p no est especificado. De esta manera, para un usuario de Unix con un nombre de usuario de jose, todos los siguientes comandos son equivalentes:
shell> shell> shell> shell> mysql -h localhost -u jose mysql -h localhost mysql -u jose mysql
Otros clientes MySQL se comportan de manera similar. Puede especificar valores diferentes para que se utilicen cuando se realiza una conexin de manera que no tenga que introducirlos en la lnea de comandos cada vez que invoca un programa cliente. Esto puede llevarse a cabo de diversas maneras: Puede especificar los parmetros de conexin en la seccin [client] de un archivo de opciones. La seccin relevante del archivo debera tener el siguiente aspecto:
280
Los archivos de opciones son explicados en profundidad en Seccin 4.3.2, Usar ficheros de opciones. Puede especificar algunos parmetros de conexin utilizando variables de ambiente. El nombre del servidor para mysql puede ser especificado utilizando MYSQL_HOST. El nombre de usuario MySQL puede especificarse mediante USER (esto es para Windows y Netware nicamente). La clave se puede especificar utilizando MYSQL_PWD, aunque esto es inseguro; consulte Seccin 5.7.6, Guardar una contrasea de forma segura. Para ver la lista de variables, consulte Apndice E, Variables de entorno.
Esto permite a david conectarse desde cualquier cliente que tenga un nmero IP client_ip para el que la siguiente condicin sea cierta:
client_ip & netmask = host_ip
Es decir, para la sentencia GRANT recientemente mostrada: That is, for the GRANT statement just shown:
client_ip & 255.255.255.0 = 192.58.197.0
Los nmeros IP que satisfagan esta condicin y pueden conectar al servidor MySQL son lo que estn en el rango desde 192.58.197.0 hasta 192.58.197.255.
281
Nota: La mscara de red solo puede ser utilizada para decirle al servidor que use 8, 16, 24 o 32 bits para la direccin, por ejemplo:
192.0.0.0/255.0.0.0 (cualquier direccin de la red clase A 192) 192.168.0.0/255.255.0.0 (cualquier direccin de la red clase B 192.168) 192.168.1.0/255.255.255.0 (cualquier direccin de la red clase C 192.168.1) 192.168.1.1 (solo esta IP especfica)
Un valor vaco de Host en un registro de la tabla db significa que los privilegios de dicho registro deben ser combinados con aquellos que se encuentren en el registro de la tabla host que concuerde con el nombre del cliente. Los privilegios se combinan utilizando operaciones AND (interseccin), no OR (union). Puede encontrar ms informacin sobre la tabla host en Seccin 5.6.6, Control de acceso, nivel 2: comprobacin de solicitudes. Un valor de Host en blanco en las otras tablas grant lo mismo que '%'. Debido a que puede usar comodines en los valores IP de la columna Host (por ejemplo, '144.155.166.%' para conseguir cualquier IP en una subred), alguien podra intentar explotar esta capacidad ponindole a su cliente el nombre 144.155.166.cualquierhost.com. Para evitar estos intentos, MySQL no permite que los comodines sean utilizados para los nombres de cliente que empiezan con dgitos y un punto. As que si tiene un cliente con nombre similar a 1.2.cualquierhost.com, su nombre nunca concordar con la columna Host de las tablas grant. Un comodn de IP solo puede concordar con nmeros IP, no nombres de cliente. En la columna User, los caracteres comodn no estn permitidos, pero puede especificar un valor en blanco, que ser vlido para cualquier nombre. Si el registro de la tabla user que concuerda con una conexin entrante tiene un valor vacio, el usuario es considerado annimo, sin nombre de usuario, no un usuario con el nombre que el cliente especific realmente. Esto significa que el nombre de usuario vaco es utilizado para todas las comprobaciones de acceso posteriores durante la duracin de la conexin (es decir, durante el Estado 2). La columna Password puede estar vaca. Esto no es un comodn que permite que cualquier clave sea permitida. Significa que el usuario debe conectarse sin especificar una clave. Los valores que no estn vacos de Password en la tabla user representan claves cifradas. MySQL no almacena las claves en forma de texto llano para que cualquiera pueda verlo. En vez de esto, la clave suministrada por un usuario que se est intentando conetar es cifrada (utilizando la funcin PASSWORD()). La clave cifrada se utiliza entonces durante el proceso de conexin en el momento de comprobar si es correcta. (Esto se realiza sin que la clave cifrada viaje nunca sobre la conexin.) Desde el punto de vista de MySQL, la clave cifrada es la clave REAL, as que no debera darse acceso a ella a nadie. En concreto, no de acceso de lectura a las tablas de la base de datos mysql a usuarios no-administrativos. MySQL 5.0 utiliza el mtodo de autenticacin ms fuerte (implementado primeramente en MySQL 4.1) y que tiene una mejor proteccin de la clave durante el proceso de conexin que versiones previas. Es seguro an cuando los paquetes TCP/IP fuesen interceptados o la base de datos mysql capturada. El cifrado de claves es comentado en mayor profundida en Seccin 5.6.9, Hashing de contraseas en MySQL 4.1. Los siguientes ejemplos nos ensean como se aplicaran a las conexiones entrantes diferentes combinaciones de los valores de las columnas Host y User de la tabla user. Cliente Valor 'thomas.loc.gov' Usuario Valor 'fred' Conexiones que concuerdan con la entrada Entry fred, conectando desde thomas.loc.gov
282
Cualquier usuario, conectando desde thomas.loc.gov fred, conectando desde cualquier cliente Cualquier usuario conectando desde cualquier cliente fred, conectando desde cualquier cliente en el dominio loc.gov fred, conectando desde x.y.net, x.y.com, x.y.edu, etc. (esto, probablemente, no es til) fred, conectando desde el cliente con direccin IP 144.155.166.177 fred, conectando desde cualquier cliente en la subred de clase C 144.155.166 Idntico al ejemplo anterior
'144.155.166.0/255.255.255.0' 'fred'
Es posible que el nobre del cliente y del usuario de una conexin entrante concuerde con ms de un registro en la tabla user. El conjunto de ejemplos precedentes demuestra esto: Algunas de las entradas mostradas concuerdan con una conexin de fred desde thomas.loc.gov. Cuando hay la posibilidad de mltiples concordancias, el servidor debe determinar cual de ellas utilizar. El problema se resuelve de la siguiente manera: Siempre que el servidor lee la tabla user a memoria, ordena los registros. Cuando un cliente intenta conectar, el servidor mira a travs de los registros en el orden establecido. El servidor utiliza el primer registro que concuerda con el nombre y usuario del cliente. Para ver como esto ocurre, supongamos que la tabla user es como esta:
+-----------+----------+| Host | User | +-----------+----------+| % | root | | % | jeffrey | | localhost | root | | localhost | | +-----------+----------+-
Cuando el servidor lee la tabla, ordena las entradas con los valores de Host ms especficos primero. Los nombres de cliente y nmeros de IP son los ms especficos. El comodn '%' significa ``cualquier cliente'' y es menos especfico. Registros con el mismo valor de Host se ordenan con el valor de User ms especfico (un valor de User en blanco significa ``cualquier usuario'' y es menos especfico). En la tabla user recin mostrada, el resultado despus de ordenar sera el siguiente:
+-----------+----------+| Host | User | +-----------+----------+| localhost | root | | localhost | | | % | jeffrey | | % | root | +-----------+----------+-
Cuando un cliente intenta conectar, el servidor mira los registros ordenados y utiliza la primera concordancia. Para una conexin desde localhost por jeffrey, dos de las entradas de la tabla concuerdan: la primera con los valores 'localhost' y '' de Host y User respectivamente, y el registro con los valores '%' y 'jeffrey'. El registro con valor 'localhost' aparece primero en la tabla ordenada, as que es el que el servidor utiliza.
283
Aqu hay otro ejemplo. Supongamos que la tabla user tiene el siguiente aspecto:
+----------------+----------+| Host | User | +----------------+----------+| % | jeffrey | | thomas.loc.gov | | +----------------+----------+-
Una conexin de jeffrey desde thomas.loc.gov concuerda con el primer registro, mientras que una conexin de jeffrey desde whitehouse.gov concuerda con el segundo. Es una confusin comn el pensar que, para un nombre de usuario dado, todos los registros que nombran explcitamente con a ese usuario son utilizadas primero cuando el servidor intenta encontrar una concordancia para una conexin. Esto es sencillamente falso. El ejemplo anterior ilustra esto, donde una conexin de jeffrey desde thomas.loc.gov no concuerda primero con el registro que contiene 'jeffrey' como valor en la columna User, sino que ha concordado con el registro que no contiene nombre de usuario. Como resultado, jeffrey es tratado como un usuario annimo aunque ha especificado un nombre de usuario al conectarse. Si puede conectar al servidor, pero sus privilegios no son los que espera, probablemente est siendo identificado como algn otro usuario. Para averiguar qu cuenta de usuario utiliz el servidor para identificarle, use la funcin CURRENT_USER(). Devuelve un valor en formato user_name@host_name que indica los valores de User y Host del registro concordante en la tabla user. Suponga que jeffrey conecta y ejecuta la siguiente sentencia:
mysql> SELECT CURRENT_USER(); +----------------+ | CURRENT_USER() | +----------------+ | @localhost | +----------------+
El resultado mostrado indica que el registro que concuerda en la tabla user tiene un valor vaco en la columna User. En otras palabras, el servidor trata a jeffrey como a un usuario annimo. Otra cosa que puede hacer para localizar problemas de autentificacin es imprimir por pantalla la tabla user y ordenarla a mano para ver donde est la primera concordancia. Consulte Seccin 12.9.3, Funciones de informacin.
284
privilegios en la tabla user slo a superusuarios tales como administradores de base de datos. Para otros usuarios, debera dejar los privilegios de la tabla user con el valor 'N' y otorgar los privilegios nicamente a niveles ms especficos. Puede otorgar privilegios para bases de datos, tablas o columnas particulares. Las tablas db y host otorgan privilegios especficos para una base de datos. Los valores en las columnas de estas tablas pueden tener los siguientes formatos: Los caracteres comodn '%' y '_' pueden utilizarse en las columnas Db de cualquiera de las tablas. Estos tienen el mismo significado que en las operaciones de reconocimiento de patrones efectuadas con el operador LIKE. Si quiere utilizar cualquiera de estos caracteres literales al otorgar privilegios, debe incluirlos en una secuencia de escape con una barra invertida. Por ejemplo, para incluir el carcter '_' como parte del nombre de una base de datos, especifquelo como '\_' en la sentencia GRANT. Un valor de '%' en la columna Host de la tabla db significa ``cualquier host.'' Un valor vaco en la columna Host de la tabla db significa ``consulta la tabla host para ms informacin'' (un proceso que se describe ms adelante en esta seccin). Un valor de '%' o en blanco en la columna Host de la tabla host significa ``cualquier host.'' Un valor de '%' o en blanco de la columna Db en cualquiera de las dos tablas, significa ``cualquier base de datos.'' Un valor en blanco de la columna User en cualquiera de las tablas concuerda con el usuario annimo.
El servidor lee y ordena las tablas db y host al mismo tiempo que lee la tabla user. El servidor ordena la tabla db basndose en el rango de las columnas Host, Db y User, y ordena la tabla host basndose en el rango de las columnas Host y Db. Igual que con la tabla user, la ordenacin coloca los valores menos especficos en ltima posicin, y cuando el servidor busca correspondencias, utiliza la primera que encuentra. Las tablas tables_priv y columns_priv otorgan privilegios especficos para tablas y columnas respectivamente. Los valores en las columnas de rango de estas tablas pueden tener los siguientes formatos: Los caracteres comodn '%' y '_' pueden ser utilizados en la columna Host de cualquiera de las tablas. Estos comodines tienen el mismo significado que en las operaciones de bsqueda de patrones realizadas con el operador LIKE. Un valor de '%' o vaco en la columna Host de cualquiera de las tablas significa ``cualquier host.'' Las columnas Db, Table_name y Column_name no pueden contener caracteres comodn ni estar en blanco en ninguna de las tablas. El servidor ordena las tablas tables_priv y columns_priv basndose en las columnas Host, Db, y User. Esto es similar a la ordenacin de la tabla db, pero ms simple, porque nicamente la columna Host puede contener comodines. El proceso de verificacin de peticiones se describe aqu. (Si usted est familirizado con el cdigo fuente de control de acceso, se dar cuenta de que la descripcin aqu contenida difiere ligeramente de el algoritmo utilizado en el cdigo. La descripcin es equivalente a lo que el cdigo hace realmente; solo difiere para hacer la explicacin ms simple.) Para peticiones que requieran privilegios de administrador, como SHUTDOWN o RELOAD, el servidor comprueba nicamente el registro de la tabla user porque es la nica tabla que especifica los privilegios administrativos. El acceso se otorga si el registro permita la operacin demandada, y es denegado en caso contrario. Por ejemplo, si usted quisiera ejecutar mysqladmin shutdown, pero
285
su registro de la tabla user no le otorga el privilegio SHUTDOWN, el servidor deniega el acceso sin ni siquiera codnsultar las tablas db o host. (No contienen ninguna columna Shutdown_priv, as que no hay necesidad de hacerlo.) Para peticiones sobre bases de datos (INSERT, UPDATE, etc.), el servidor primero comprueba los privilegios globales del usuario (superuser) mirando el registro de la tabla user. Si el registro permite la operacin demandada, se otorga el acceso. Si los privilegios globales de la tabla user son insuficientes, el servidor determina los privilegios especficos sobre la base de datos comprobando las tablas db y host: 1. El servidor busca en la tabla db una concordancia en las columnas Host, Db y User. Las columnas Host y User se hacen concordar con el nombre de host y de usuario MySQL. La columna Db se hace concordar con la base de datos a la que el usuario quiere acceder. Si no hay ningn registro para Host y User, se deniega el acceso. 2. Si hay un registro que concuerda en el registro de la tabla db y su columna Host no est vaca, ese registro define los privilegios especficos del usuario en la base de datos. 3. Si la columna Host del registro concordante de la tabla db se encuentra vaca, significa que la tabla hosts enumera qu hosts pueden tener acceso a la base de datos. En este caso, una comprobacin ms se realiza en la tabla host para encontrar una concordancia en las columnas Host y Db. Si ningn registro de la tabla host concuerda, se deniega el acceso. Si hay una concordancia, los privilegios especficios sobre la base de datos del usuario son calculados como la interseccin (no unin!) de los privilegios en los registros de las tablas db y host; es decir, los privilegios que tienen valor 'Y' en ambos registros. (De esta manera puede otorgar privilegios en el registro de la tabla db y entonces restringir selectivamente host a host utilizando los registros de la tabla hosts.) Tras determinar los privilegios especficos de la base de datos otorgados por los registros de las tablas db y host, el servidor los aade a los privilegios globales otorgados por la tabla user. Si el resultado permite la operacin demandada, se otorga el acceso. En caso contrario, el servidor comprueba sucesivamente la tabla del usuario y los privilegios de las columnas en las tablas tables_priv y columns_priv, los aade a los privilegios del usuario, y permite o deniega el acceso basndose en el resultado. Expresado en trminos booleanos, la descripcin precedente de como se calculan los privilegios de un usuario, se puede resumir en:
privilegios globales O (privilegios de base de datos Y privilegios de host) O privilegios de tabla O privilegios de columna
Puede no ser evidente por qu, si los privilegios globales del registro en la tabla user no han sido inicialmente suficientes para la operacin demandada, el servidor aado estos privilegios a los de base de datos, tabla y columna ms tarde. La razn es que una peticin puede requerir ms de un tipo de privilegio. Por ejemplo, si usted ejecuta una sentencia INSERT INTO ... SELECT, necesita tanto el privilegio INSERT como el privilegio SELECT. Sus privilegios podran estar configurados de manera que la tabla user otorgue un privilegio, y la tabla db otorgue el otro. En este caso, necesita ambos privilegios para realizar la sentencia, pero el servidor no puede saberlo desde cada una de las tablas nicamente; los privilegios otorgados por los registros de ambas tablas deben ser combinados. La tabla host no es afectada por sentencias GRANT o REVOKE, as que en la mayora de las instalaciones MySQL queda sin utilizar. Si usted la modifica directamente, puede utilizarla para algunos propsitos especficos, como mantener una lista de servidores seguros. Por ejemplo, en TcX, la tabla host contiene una lista de todas las mquinas en la red local. stas tienen otorgados todos los privilegios. Tambin puede utilizar la tabla host para indicar hosts que no son seguros. Supongamos que tiene una mquina public.su.dominio que est situada en un lugar pblico que no considera seguro.
286
Puede permitir el acceso a todos los hosts de su red excepto a esa mquina utilizando registros de la tabla host como este:
+--------------------+----+| Host | Db | ... +--------------------+----+| public.your.domain | % | ... (all privileges set to 'N') | %.your.domain | % | ... (all privileges set to 'Y') +--------------------+----+-
Nauturalmente, usted debe siempre comprobar sus entradas en las tablas grant (por ejemplo, utilizando SHOW GRANTS o mysqlaccess) para estar seguro de que sus privilegios de acceso son realmente los que piensa que son.
Tambin podra ser que el servidor se est ejecutando, pero usted se est intentando conectar utilizando un puerto TCP/IP, named pipe, o archivo socket de Unix diferentes de aquellos a los que el servidor atiende. Para corregir esto cuando invoca a un programa cliente, especifique la opcin -287
port para indicar el puerto adecuado, o la opcin --socket para indicar la named pipi o el archivo socket de Unix apropiados. Para averiguar dnde se encuentra el archivo socket, puede ejecutar:
shell> netstat -ln | grep mysql
Las tablas grant deben estar correctamente configuradas para que el servidor pueda utilizarlas en el control de acceso. Para algunos tipos de distribucin (como las distribuciones binarias de Windows, o las distribuciones RPM de Linux), el proceso de instalacin inicializa la base de datos mysql que contiene las tablas grant. Para distribuciones que no hacen esto, usted debe inicializar las tablas grant manualmente ejecutando el script mysql_install_db. Para ms detalles, consulte Seccin 2.9.2, Pasos a seguir despus de la instalacin en Unix. Una manera de determinar si debe inicializar las tablas grant es buscar un directorio mysql bajo el directorio de datos. (El directorio de datos normalmente se llama data o var y se encuentra bajo su directorio de instalacin de MySQL.) Asegrese de que tiene un archivo llamado user.MYD en el directorio mysql de la base de datos. Si no, ejecute el script mysql_install_db. Tras ejecutar este script e iniciar el servidor, compruebe los privilegio siniciales ejecutando este comando:
shell> mysql -u root test
El servidor debera dejarle conectar sin error. Tras una nueva instalacin, usted debera conectarse al servidor y configurar sus usuarios y sus permisos de acceso:
shell> mysql -u root mysql
El servidor debera dejarle conectar porque el usuario MySQL root no tiene clave de acceso inicialmente. Esto, adems, es un riesgo de seguridad, as que asignar la clave de acceso para las cuentas root es algo que debe hacer mientras se configuran el resto de usuarios. Puede consultar las instrucciones para asignar las claves iniciales aqu Seccin 2.9.3, Hacer seguras las cuentas iniciales de MySQL. Si usted ha actualizado una instalacin MySQL existente a una nueva versin, ejecut el script mysql_fix_privilege_tables? En caso negativo, hgalo. La estructura de las tablas grant cambia ocasionalmente cuando se aaden nuevas caractersticas, as que tras una actualizacin debera siempre asegurarse de que sus tablas tienen la estructura actual. Para ms instrucciones, consulte Seccin 2.10.2, Aumentar la versin de las tablas de privilegios. Si un programa cliente recibe el siguiente mensaje de error cuando intenta conectar, significa que el servidor est esperando las claves de acceso en un formato ms nuevo del que el cliente es capaz de generar:
shell> mysql Client does not support authentication protocol requested by server; consider upgrading MySQL client
Para ms informacin sobre atajar este problema, consulte Seccin 5.6.9, Hashing de contraseas en MySQL 4.1 y Seccin A.2.3, Client does not support authentication protocol. Si intenta conectarse como root y obtiene el siguiente error, significa que usted no tiene un registro en la tabla user con un valor en la columna User de 'root' y que mysqld no puede resolver el nombre de host para su cliente:
Access denied for user ''@'unknown' to database mysql
En este caso, debera reiniciar el servidor con la opcin --skip-grant-tables y editar su archivo /etc/hosts o \windows\hosts para aadir una entrada para su host. Recuerde que los programas cliente utilizan parmetros de conexin especificados en archivos de opciones o variables de entorno. Si un programa cliente parece estar enviando parmetros de conexin por defecto incorrectos cuando no los especifica en lnea de comandos, compruebe su entorno y cualquier archivo de opciones implicado. Por ejemplo, si obtiene Access denied cuando
288
intenta ejecutar un cliente sin ninguna opcin, asegrese de que no ha especificado una clave de acceso antigua en sus archivos de opciones. Puede suprimir el uso de archivos de opciones por parte de un programa cliente invocndolo con la opcin --no-default. Por ejemplo:
shell> mysqladmin --no-defaults -u root version
Los archivos de opciones que los clientes utilizan estn enumerados en Seccin 4.3.2, Usar ficheros de opciones. Las variables de entorno se enumeran en Apndice E, Variables de entorno. Si obtiene el siguiente error, significa que est utilizando una clave de root incorrecta:
shell> mysqladmin -u root -pxxxx ver Access denied for user 'root'@'localhost' (using password: YES)
Si este error precedente ocurre an cuando usted no ha especificado ninguna clave de acceso, significa que tiene una clave incorrecta en algn archivo de opciones. Intente utilizar la opcin -no-defaults como se explica en el punto anterior. Para ms informacin sobre el cambio de claves, consulte Seccin 5.7.5, Asignar contraseas a cuentas. Si usted ha perdido u olvidado la clave de root, puede reiniciar mysqld con --skip-granttables para cambiar la clave. Consulte Seccin A.4.1, Cmo reiniciar la contrasea de root. Si usted cambia la clave utilizando SET PASSWORD, INSERT, o UPDATE, debe cifrar la clave utilizando la funcin PASSWORD(). Si no utiliza PASSWORD() para estas sentencias, la clave no funcionar. Por ejemplo, la siguiente sentencia asigna una clave, pero no la cifra, as que el usuario no es capaz de conectar tras ella:
mysql> SET PASSWORD FOR 'abe'@'host_name' = 'eagle';
La funcin PASSWORD() no es necesaria cuando se especifica la clave utilizando sentencias GRANT o (a partir de MySQL 5.0.2) CREATE USER, o tambin con el comando mysqladmin password, los cuales utilizan automticamente PASSWORD() para cifrar la clave. Consulte Seccin 5.7.5, Asignar contraseas a cuentas y Seccin 13.5.1.1, Sintaxis de CREATE USER. localhost es un sinnimo para su nombre de mquina local, y tambin es la mquina por defecto al que los clientes se intentan conectar si no se especifica explcitamente. Para evitar este problema en sistemas como ese, puede utilizar la opcin --host=127.0.0.1 para mencionar la mquina t explcitamente. Esto crea una conexin TCP/IP al servidor mysqld local. Tambin puede utilizar TCP/IP especificando una opcin --host que utilice el nombre real de la mquina local. En este caso, el nombre de host debe ser especificado en una fila de la tabla user del servidor, aun cuando el cliente est corriendo en la misma mquina que el servidor. Si obtiene un error Access denied cuando intenta conectarse a la base de datos con mysql- u user_name, puede que tenga un problema con la tabla user. Compruebe esto ejecutando mysql -u root mysql e introduciendo esta sentencia SQL:
mysql> SELECT * FROM user;
El resultado debera incluir una fila cuyas columnas Host y User coincidan con el nombre de su mquina y su nombre de usuario MySQL. El mensaje de error Access denied indica con qu nombre de usuario se est intentando entrar al sistema, la mquina cliente desde la que se est intentando conectar, y si se est utilizando clave de acceso o no. Normalmente, debera tener una lnea en la tabla user que concuerde exactamente
289
con el nombre de mquina y el nombre de usuario que se ha obtenido en el mensaje de error. Por ejemplo, si obtiene un mensaje de error que contiene using password: NO, significa que se ha intentado entrar sin utilizar una clave de acceso. Si el siguiente error aparece cuando se intenta conectar desde una mquina diferente a la que est ejecutando el servidor MySQL, significa que no hay ninguna fila en la tabla user con un valor Host que concuerde con la mquina cliente:
Host ... is not allowed to connect to this MySQL server
Puede corregir esto estableciendo una cuenta para la combinacin de nombre de mquina y usuario que est utilizando cuando se intenta conectar. Si usted no conoce el nmero de IP o el nombre de mquina del ordenador desde el que se est conectando, debera poner una fila con un valor de '%' en la columna Host de la tabla user, y reiniciar mysqld en el servidor con la opcin --log. Tras intentar conectar desde la mquina cliente, la informacin en el log de MySQL indica desde donde se conect realmente. (Entonces cambie el valor '%' en la tabla user para introducir el nombre real de la mquina que se muestra en el log. De otra manera obtendra un sistema inseguro, porque permitira conexiones desde cualquier mquina para ese usuario dado.) En Linux, hay otra razn por la que este error puede ocurrir, y es que est utilizando una versin binaria de MySQL que haya sido compilada con una versin diferente de la librera glibc de la que usted est utilizando. En este caso, usted debera actualizar su sistema operativo o glibc, o descargarse una distribucin MySQL en cdigo fuente y compilarla usted mismo. Un paquete RPM de cdigo fuente es, normalmente, trivial de compilar e instalar, as que esto no es un gran problema. Si especifica un nombre de mquina cuando se intenta conectar, pero obtiene un mensaje de error donde el nombre de mquina no se muestra, o es un nmero IP, significa que el servidor MySQL obtuvo un error al intentar resolver el nmero IP de el cliente a un nombre:
shell> mysqladmin -u root -pxxxx -h some-hostname ver Access denied for user 'root'@'' (using password: YES)
Esto indica que existe un problema con DNS. Para arreglarlo, ejecute mysqladmin flush-hosts para reestablecer la cache interna de DNS. Consulte Seccin 7.5.6, Cmo usa MySQL las DNS. Estas son algunas soluciones permanentes: Intente encontrar qu le ocurre a su servidor DNS y arrglelo. Especifique nmeros IP en vez de nombres de mquina en las tablas grant de MySQL Introduzca una lnea para la mquina cliente en /etc/hosts. Ejecute mysqld con la opcin --skip-name-resolve. Ejecute mysqld con la opcin --skip-host-cache. En Unix, si est ejecutando el servidor y el cliente en la misma mquina, conctese a localhost. Las conexiones a localhost en Unix utilizan un archivo socket en vez de TCP/IP. En Windows, si est ejecutando cliente y servidor en la misma mquina, y el servidor tiene activada la caracterstica de conexin mediante named pipe, conctese a . (punto). Las conexiones a . utilizan una named pipe en vez de TCP/IP. Si el comando mysql -u root test funciona pero mysql -h your_hostname -u root test termina con un Access denied (donde your_hostname es el nombre real de su mquina local), puede que no haya especificado correctamente el nombre de su mquina en la tabla user. Un problema comn es que el valor de Host en la fila de la tabla user especifique un nombre de mquina incompleto, pero las rutinas de resolucin de nombres de dominio de su sistema retornen
290
un nombre de dominio completo (o viceversa). Por ejemplo, si tiene una entrada con valor 'tcx' en Host de la tabla user, pero sus DNS dicen que su nombre de mquina es 'tcx.subnet.se', esta entrada no funcionar. Intente aadir una entrada a la tabla user con un valor de Host que contenga un comodn; por ejemplo 'tcx.%'. En cualquier caso, el uso de nombres que acaben con '%' es inseguro y no recomendado! Si mysql -u user_name test funciona pero mysql -u user_name other_db_name no funcionado, entonces es que no tiene concedidos los permisos para acceder a la base de datos other_db_name para ese usuario dado. Si mysql -u user_name funciona cuando se ejecuta en la mquina del servidor, pero mysql -h host_name -u user_name no lo hace cuando se ejecuta en una mquina cliente remota, entonces no tiene activado el acceso a el servidor para el usuario dado en la mquina remota. Si no es capaz de averiguar por qu obtiene el error de Access denied, borre de la tabla user todos los valores que contengan comodines (que contengan caracteres '%' o '_'). Un error muy comn es insertar un nuevo registro con Host='%' y User='some_user', pensando que esto permite especificar que localhost se conecte desde la misma mquina. La razn por la que esto no funciona es que los privilegios por defecto incluyen un registro con Host='localhost' y User=''. Debido a que ese registro es ms especfico que '%', se utiliza preferentemente frente al nuevo registro cuando conecta desde localhost. El procedimiento correcto es insertar una segunda entrada con Host='localhost' y User='some_user', o borrar la entrada con Host='localhost' y User=''. Tras borrar la entrada, recuerde ejecutar una sentencia FLUSH PRIVILEGES para recargar las tablas grant. Si obtiene el siguiente error, puede ser que tenga un problema con las tablas db o host:
Access to database denied
Si la entrada seleccionada de la tabla db contiene un valor vacio en la columna Host, asegrese de que hay una o ms entradas correspondientes en la tabla host especificando a qu mquinas se aplica la entrada de la tabla db. Si usted puede conectar al servidor MySQL, pero obtiene un mensaje Access denied siempre que ejecuta una sentencia SELECT ... INTO OUTFILE o LOAD DATA INFILE, su entrada en la tabla user no tiene el privilegio FILE activado. Si cambia las tablas grant directamente (por ejemplo, mediante sentencias INSERT, UPDATE, o DELETE) y sus cambios parecen que son ignorados, recuerde que debe ejecutar la sentencia FLUSH PRIVILEGES statement or el comando mysqladmin flush-privileges para que el servidor relea las tablas de privilegios. En otro caso, los cambios no tendrn efecto hasta la prxima vez que el servidor sea reiniciado. Recuerde que tras cambiar la clave de root con un comando UPDATE, no necesita especificar la nueva clave hasta que se haga la relectura de privilegios, porque el servidor no sabr que la clave ha cambiado hasta ese momento. Si sus privilegios parecen haber cambiado en el medio de una sesin, podra ser que un administrador de MySQL los haya cambiado. La recarga de las tablas grant afecta a las nuevas conexiones de cliente, pero tambin a las ya existentes tal y como se indica en Seccin 5.6.7, Cundo tienen efecto los camios de privilegios. Si tiene problemas de acceso con un programa Perl, PHP, Python u ODBC, intente conectar al servidor con mysql -u user_name db_name o mysql -u user_name -pyour_pass db_name. Si puede conectar utilizando el programa cliente mysql, el problema est en su programa, no en los privilegios de acceso. (No hay ningn espacio entre -p y la clave; tambin puede utilizar la sintaxis --password=your_pass para especificar la clave. Si utiliza la opcin -p sola, MySQL le preguntar por la clave.) Para hacer comprobaciones, inicie el servidor mysqld con la opcin --skip-grant-tables. Puede cambiar las tablas grant y utilizar el script mysqlaccess para comprobar que sus modificaciones tienen el efecto deseado. Cuando est satisfecho con los cambios, ejecute mysqladmin flush-privileges para decirle al servidor mysqld que comience a utilizar las
291
nuevas tablas grant. (Recargar las tablas sobresee la opcin --skip-grant-tables. Esto permite decirle al servidor que comience a utilizar las tablas sin tener que reiniciarlo.) Si todo lo anterior falla, inicie el servidor mysqld con una opcin de depuracin (por ejemplo, -debug=d,general,query). Esto imprime la informacin de host y usuario sobre los intentos de conexin, as como informacin sobre cada comando ejecutado. Consulte Seccin D.1.2, Crear ficheros de traza. Si tiene cualquier otro problema con las tablas grant de MySQL y cree que debe enviar el problema a la lista de correo, proporcione siempre un volcado de las tablas grant MySQL. Puede hacer ete volcado con el comando mysqldump mysql. Como siempre, enve su problema utilizando el script mysqlbug. Consulte Seccin 1.6.1.3, Cmo informar de bugs y problemas. En elgunos casos, podra necesitar reiniciar mysqld con --skip-grant-tables para ejecutar mysqldump.
Otro ejemplo comn es cuando se trata de usar la antigua extensin de mysql para PHP tras actualizar a MySQL 4.1 o posterior. (Consulte Seccin 24.3.1, Problemas comunes con MySQL y PHP.) La siguiente discusin describe las diferencias entre el antiguo y nuevo mecanismo de contraseas, y qu debe hacer si actualiza su servidor pero necesita matener compatibilidad con clientes versin pre-4.1. Puede encontrar informacin adicional en Seccin A.2.3, Client does not support authentication protocol. Esta informacin es de especial importancia para programadores de PHP que migran de versiones de bases de datos MySQL 4.0 o anteriores a versiones 4.1. o posteriores. Nota: Esta discusin contrasta el comportamiento 4.1. con el pre-4.1, pero el comportamiento 4.1 descrito aqu realmente empieza en el 4.1.1. MySQL 4.1.0 es una versin ``particular'' ya que tiene
292
mecanismos ligeramente distintos a los implementados en 4.1.1 y posteriormente. Las diferencias entre 4.1.0 y reciones ms recientes se describen con ms detalle en Manual de referencia de MySQL 4.1. Antes de MySQL 4.1, los hashes de contraseas computados por la funcin PASSWORD() tienen una longitud de 16 bytes. Tales hashes tienen este aspecto:
mysql> SELECT PASSWORD('mypass'); +--------------------+ | PASSWORD('mypass') | +--------------------+ | 6f8c114b58f2ce9e | +--------------------+
La columna Password de la tabla user (en la que se guardan los hashes) tambin tiene una longitud de 16 bytes antes de MySQL 4.1. En MySQL 4.1, la funcin PASSWORD() se modific para producir un valor hash ms largo de 41bytes:
mysql> SELECT PASSWORD('mypass'); +-----------------------------------------------+ | PASSWORD('mypass') | +-----------------------------------------------+ | *43c8aa34cdc98eddd3de1fe9a9c2c2a9f92bb2098d75 | +-----------------------------------------------+
Por consiguiene, la columna Password en la tabla user debe tener una longitud de 41 bytes para almacenar estos valores: Si realiza una nueva instalacin de MySQL 5.0, la columna Password se ampla a 41 bytes automticamente. Actualizar desde MySQL 4.1 (4.1.1 o posterior en la serie 4.1 ) a MySQL 5.0 no debera afectar a nada de todo esto, ya que ambas versiones usan el mismo mecanismo de hash de contraseas. Si desea actualizar una versin antorior de MySQL a 5.0, debe actualizar primero a la versin 4.1, y luego actualizar la instalacin de 4.1. a 5.0. Una columna Password ms amplia puede almacenar hashes de contraseas en el antiguo y nuevo formato. El formato de cualquier valor hash de una contrasea puede determinarse de dos formas: La diferencia bvia es la longitud (16 bytes contra 41 bytes). Una segunda diferencia es que los hashes de contraseas en el nuevo formato simpre empieza con un carcter '*', mientras que una contrasea en el antiguo formato nunca lo hace. El hash de la contrasea ms larga tiene mejores propiedades criptogrficas, y la autenticacin de clientes basada en hashes largos es ms segura que la basada en los antiguos hashes cortos. Las diferencias entre hashes cortos y largos son relevantes para cmo el servidor usa las contraseas durante la autenticacin y por cmo genera los hashes de contraseas para clientes conectados que realizan operaciones de cambio de contrasea. La forma en que el servidor usa los hashes de contraseas durante la autenticacin se ve afectada por la longitud de la columna Password : Si la columna es corta, slo se usa autenticacin de hash cortos. Si la columna es larga, puede soportar hashes cortos o largos, y el servidor puede usar cualquier formato: Clientes pre-4.1 pueden conectar, aunque slo conocen el antiguo mecanismo de hash, pueden autenticar slo para cuentas que tengan hashes cortos. Clientes 4.1 y posterior pueden autenticar para cuentas que tengan hashes cortos o largos.
293
Para cuentas con hash corto, el proceso de autenticacin es un poco ms seguro para clientes 4.1 y posteriores que para clientes ms antiguos. Respecto a seguridad, el gradienet de menos a ms seguro es: Cliente pre-4.1 autenticando con hash de contrasea corto Cliente 4.1 o posterior autenticando con hash de contrasea corto. Cliente 4.1 o posterior autenticando con hash de contrasea largo. La forma en que el servidor genera los hashes de contrasea para clientes conectados se ve afectado por la longitud de la columna Password y por la opcin --old-passwords. Un servidor 4.1. o posterior genera hashes largos slo si se cumplen ciertas condiciones: La columna Password debe ser lo suficientemente larga para guardar valores largos y no debe darse la opcin --oldpasswords. Estas condiciones se aplican como sigue: La columna Password debe ser lo suficientemente grande para guardar hashes largos (41 bytes). Si la columna no se ha actualizado y todava tiene la longitud pre-4.1 de 16 bytes, el servidor entiende que no puede guardar hashes largos y genere slo hashes cortos cuando un cliente realiza opraciones de cambio de contrasea mediante PASSWORD(), GRANT, o SET PASSWORD. Este es el comportamiento que ocurre si ha actualizado a 4.1 pero no ha ejecutado todava el script mysql_fix_privilege_tables para ensanchar la columna Password . Si la columna Password es amplia, puede almacenar tanto hashes de contraseas largos como cortos. En este caso, PASSWORD(), GRANT, y SET PASSWORD generan hashes largos a no ser que el servidor se haya iniciado con la opcin --old-passwords. Este opcin fuerza al servidor a generar hashes de contraseas cortos. El propsito de la opcin --old-passwords es permitirle mantener compatibilidad con clientes anteriores a 4.1 bajo circunstancias donde el servidor generara hashes de contraseas largos. La opcin no afecta la autenticacin (clientes 4.1. y posteriores pueden usar cuentas que tengan hashes largos de contrasea), pero no evita la creacin de hashes largos de contraseas en la tabla user como resultado de una operacin de cambio de contrasea. Si eso ocurre, la cuenta no puede usarse por clientes pre-4.1. Sin la opcin --old-passwords, es posible el siguiente escenario no deseable: Un cliente viejo trata de conectar a una cuenta que tenga hash de contrasea corto. El cliente cambia su propia contrasea. Sin --old-passwords, esto acaba con la cuenta con un hash de contrasea largo. La siguiente vez que el viejo cliente trate de conectar a la cuenta, no podr, ya que la cuenta tiene un hash de contrasea largo que requiere un nuevo mecanismo de hash durante la autenticacin. (Una vez que una cuenta tiene un hash de contrasea largo en la tabla de usuario, slo clientes 4.1. y posteriores pueden autenticar, ya que clientes pre-4.1. no entienden hashes largos.) Este escenario ilustra que, si debe soportar clientes pre-4.1, es peligroso ejecutar un servidor 4.1 o posterior sin usar la opcin --old-passwords . Ejecutando el servidor con --old-passwords, las operaciones de cambio de contrasea no generan hashes largos de contrasea y por lo tanto, no provocan que las cuentas sean inaccesibles para clientes antiguos. (Aquellos clientes no pueden bloquearse a ellos mismos mediante el cambio de su contrasea y acabando con un hash de contrasea largo.) La desventaja de la opcin --old-passwords es que cualquier contrasea que cree o cambie usar hashes cortos, incluso para clientes 4.1. As, pierde la seguridad adicional proporcionada por los hashes de contrasea largos. Si quiere crear una cuenta que tiene un hash largo (por ejemplo, para usar con un cliente 4.1), debe hacerlo mientras el servidor se est ejecutando sin --old-passwords. Los siguientes escenarios son posibles al ejecutar un servidor 4.1 o posterior, incluyendo servidores MySQL 5.0: Escenario 1:Columna Password corta en tabla de usuario:
294
Slo se pueden guardar hashes cortos en la columna Password . El servidor usa slo hashes cortos durante la autenticacin del cliente. Para clientes conectados, las operaciones de generacin de hashes de contraseas mediante PASSWORD(), GRANT, o SET PASSWORD usan hashes cortos exclusivamente. Cualquier cambio a una contrasea de una cuenta resulta en una cuenta teniendo un hash de contrasea corto. La opcin --old-passwords puede usarse pero es suprflua ya que con una columna Password corta, el servidor genera slo hashes de contrasea cortos de todas formas.. Escenario 2: Columna Password larga; servidor no arrancado con la opcin --old-passwords : Hashes cortos o largos pueden almacenarse en la columna Password . Clientes 4.1 y posteriores (incluyendo clientes 5.0) pueden autenticar para cuentas que tengan tanto hashes cortos como largos. Clientes pre-4.1 pueden autenticar slo para cuentas que tengan hashes cortos. Para clientes conectados, operaciones generadoras de hash como PASSWORD(), GRANT, o SET PASSWORD usan hashes largos exclusivamente. Un cambio en la contrasea de una cuenta resulta en dicha cuenta con un hash largo. Como se ha indicado, un peligro en este escenario es que es posible para cuentas con hash corto quedar inaccesibles para clientes pre-4.1. Un cambio en tales contraseas hecho via GRANT, PASSWORD(), o SET PASSWORD resulta en la cuenta con una contrasea larga. A partir de ah, ningn cliente pre-4.1 puede autenticar a dicha cuenta hasta que el cliente actualice a 4.1. Para tratar este problema, puede cambiar una contrasea de forma especial. Por ejemplo, normalmente usa SET PASSWORD como sigue para cambiar una contrasea de cuenta:
mysql> SET PASSWORD FOR 'some_user'@'some_host' = PASSWORD('mypass');
Para cambiar la contrasea pero crear un hash corto, use la funcin OLD_PASSWORD() en su lugar:
mysql> SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('mypass');
OLD_PASSWORD() es til para situaciones en que explcitamente quiera generar un hash corto. Escenario 3: Columna Password larga; servidor 4.1 o posterior arrancado con la opcin --oldpasswords: Hashes crotos o largos pueden guardarse en la columna Password. Clientes 4.1 y posteriores pueden autenticar para cuentas que tengan hashes cortos o largos ( pero tenga en cuenta que es posible crear hashes largos slo cuando el servidor se arranca sin --oldpasswords). Clientes pre-4.1 clients pueden autenticar slo para cuentas que tengan hashes cortos. Para clientes conectados, operaciones de generacin de hashes como PASSWORD(), GRANT, o SET PASSWORD usan hashes cortos exclusivamente. Cualquier cambio en la contrasea de una cuenta resulta en que dicha cuenta tenga un hash de contrasea corto. En este escenario, no puede crear cuentas que tengan hashes de contrasea cortos, ya que la opcin --old-passwords evita la generacin de hashes largos. Tambin, si crea una cuenta con hashes largos antes de usar la opcin --old-passwords, cambiar la contrasea de la cuenta mientras -old-passwords est en efecto resulta en la cuenta teniendo una contrasea corta, causando que se pierdan los beneficios de seguridad de un hash ms largo. Las desventajas de estos escenarios pueden resumirse as: En el escenario 1, no puede beneficiarse de hashes largos que proporcionan ms seguridad de autenticacin.
295
En el escenario 2, las cuentas con hashes cortos son inaccesibles para clientes pre-4.1 si cambia sus contraseas sin usar explcitamente OLD_PASSWORD(). En el escenario 3, --old-passwords evita que las cuentas con hashes cortos sean inaccesibles, pero las operaciones de cambio de contrasea causa que las cuentas con hashes largos vuelvan a ser hashes cortos, y no puede volver a hacerlos hashes largos mientras --old-passwords tenga efecto.
296
Nombre de usuarios en MySQL pueden tener como mximo 16 caracteres de longitudo. Este lmite est hard-codeado en los servidores y clientes MySQL, y tratar de evitarlo mediante la modificacin de las tablas en la base de datos mysql no funciona . Nota: Nunca debe alterar ninguna de las tablas en la base de datos mysql de ninguna forma excepto mediante la ejecucin de los scpripts proporcionados expresamente para este propsito con la distribucin MySQL. Tratar de redefinir las tablas de sistema MySQL de cualquier otra forma da como resultado un comportamiento indefinido (y no soportado). Nombres de usuario en el sistema operativo estn completamente desligados de los nombres de usuario de MySQL y pueden tener longitud mxima diferente. Por ejemplo, los nombres de usuario Unix tpicamente estn limitados a 8 caracteres. Las contraseas MySQL no tienen nada que ver con las contraseas para loguear en el sistema operativo. No hay una conexin necesaria entre la contrasea que usa para entrar en una mquina Windows o Unix y la contrasea usada para acceder al servidor MySQL en esa mquina. MySQL cifra contraseas usando su propio algoritmo. Este cifrado es diferente del usado durante el proceso de logueo de Unix. El cifrado de contrasea es el mismo que el implementado en la funcin PASSWORD() . El cifrado de contraseas Unix es el mismo que el implementado por la funcin SQL ENCRYPT() . Consulte la descripcin de las funciones PASSWORD() y ENCRYPT() en Seccin 12.9.2, Funciones de cifrado. Desde la versin 4.1, MySQL usa un mtodo ms fuerte de autenticacin que tiene una mejor proteccin de contrasea durante el proceso de conexin que en versiones anteriores. Es seguro incluso si los paquetes TCP/IP se esnifan o la base de datos mysql se captura. (En versiones anteriores, incluso aunque las contraseas se guardan cifradas en la tabla user, se poda usar conocimiento de la contrasea cifrada para conectar al servidor MySQL.) Cuando instala MySQL, las tablas de permisos se inicializan con un conjunto inicial de cuentas. Estas cuentas tienen nombres y privilegios de acceso descritos en Seccin 2.9.3, Hacer seguras las cuentas iniciales de MySQL, que discute cmo asignarles contraseas. As mismo, normalmente inicialice, modifique y borre cuentas mediante los comandos GRANT y REVOKE. Consulte Seccin 13.5.1.3, Sintaxis de GRANT y REVOKE. Cuando conecta a un servidor MySQL con un cliente de lneas de comando, puede especificar el nombre de usuario y contrasea para la cuenta que desea usar:
shell> mysql --user=monty --password=guess db_name
No deben haber espacios entre la opcin -p y el valor de contrasea a continuacin. Consulte Seccin 5.6.4, Conectarse al servidor MySQL. El comando precedente incluye el valor de la contrasea en la lnea de comando, lo que puede ser un riesgo de seguridad. Consulte Seccin 5.7.6, Guardar una contrasea de forma segura. Para evitarlo, especifique la opcin --password o -p sin ningn valor de contrasea:
shell> mysql --user=monty --password db_name shell> mysql -u monty -p db_name
A continuacin, el programa cliente muestra un prompt y espera a que introduzca la contrasea. (En estos ejemplos, db_name no se interpreta como contrasea, ya que est separado de la precedente opcin de contrasea con un espacio.) En algunos sistemas, la llamada que MySQL usa para pedir una contrasea automticamente limita la contrasea a ocho caracteres. Este es un problema con la librera de sistema, no con MySQL. Internamente, MySQL no tienen ningn lmite para la longitud de la contrasea. Para solventar este problema, cambie su contrasea MySQL a un valor que tenga ocho o menos caracteres, o ponga su contrasea en un fichero de opciones.
297
Si ha asignado una contrasea a la cuenta root, necesitar la opcin --password o -p para este comando mysql y tambin para los mostrados a continuacin en esta seccin. Tras la conexin al servidor como root, puede aadir nuevas cuentas. El siguiente comando usa GRANT para inicializar nuevas cuentas:
mysql> -> mysql> -> mysql> mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' IDENTIFIED BY 'some_pass' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' IDENTIFIED BY 'some_pass' WITH GRANT OPTION; GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost'; GRANT USAGE ON *.* TO 'dummy'@'localhost';
Las cuentas creadas con estos comandos GRANT tienen las siguientes propiedades: Dos de las cuentas tienen un nombre de usuario de monty y una contrasea de some_pass. Ambas cuentas son cuentas de superusuario con plenos permisos para hacer cualquier cosa. Una cuenta ('monty'@'localhost') puede usarse slo cuando se conecte desde el equipo local. La otra ('monty'@'%') puede usarse para conectarse desde cualquier otro equipo. Note que es necesario tener ambas cuentas para que monty sea capaz de conectarse desde cualquier sitio como monty. Sin la cuenta localhost, la cuenta annima para localhost creada por mysql_install_db tendra precedencia cuando monty conecte desde el equipo local. Como resultado, monty se tratara como un usuario annimo. La razn para ello es que el usuario annimo tiene un valor ms especfico en la columna Host que la cuenta 'monty'@'%' y por lo tanto toma precedencia en la ordenacin de la tabla user. (La ordenacin de la tabla user se discute en Seccin 5.6.5, Control de acceso, nivel 1: Comprobacin de la conexin.) Una cuenta tiene un nombre de usuario de admin y no tiene contrasea. Esta cuenta puede usarse slo desde el equipo local. Tiene los privilegios administrativos RELOAD y PROCESS . stos permiten al usuario admin ejecutar los comandos mysqladmin reload, mysqladmin refresh, y mysqladmin flush-xxx , as como mysqladmin processlist . No se dan permisos para acceder a ninguna base de datos. Puede aadir tal privilegio posteriormente mediante un comando GRANT adicional. Una cuenta tiene un nombre de usuario de dummy sin contrasea. Esta cuenta puede usarse slo desde el equipo local. No tiene ningn privilegio. El permiso USAGE en el comando GRANT permite crear una cuenta sin darle ningn privilegio. Tiene el efecto de inicializar todos los privilegios globales a 'N'. Se asume que se otorgarn privilegios especficos posteriormente.
298
Como alternativa a GRANT, puede crear la misma cuenta directamente mediante comandos INSERT y despus diciendo al servidor que recargue las tablas de permisos usando FLUSH PRIVILEGES:
shell> mysql> -> -> mysql> -> -> mysql> -> mysql> -> mysql> mysql --user=root mysql INSERT INTO user VALUES('localhost','monty',PASSWORD('some_pass'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); INSERT INTO user VALUES('%','monty',PASSWORD('some_pass'), '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;
La razn de usar FLUSH PRIVILEGES al crear cuantas con INSERT es decir al servidor que vuelva a leer las tablas de permisos. De otro modo, los cambios no se tienen en cuenta hasta que se reinicie el servidor. Con GRANT, FLUSH PRIVILEGES no es necesario. La razn para usar la funcin PASSWORD() con INSERT es cifrar las contraseas. El comando GRANT cifra la contrasea, as que PASSWORD() no es necesario. El valor 'Y' activa permisos para las cuentas. Para la cuenta admin , puede emplear la sintaxis ms clara extendida INSERT usando SET. En el comando INSERT para la cuenta dummy account, slo las columnas Host, User, y Password en el registro de la tabla user tienen valores asignados. Ninguna de las columnas de permisos se asignan explcitamente, as que MySQL les asigna a todas el valor por defecto de 'N'. Esto es equivalente al funcionamiento de GRANT USAGE. Para inicializar una cuenta de super usuario, slo es necesario crear una entrada en la tabla user con las columnas de permisos inicializadas a 'Y'. Los privilegios de la tabla user son globales, as que no se necesitan registros en ninguna de las otras tablas de permisos. Los siguientes ejemplos crean tres cuentas y les dan acceso a bases de datos especficas. Cada una de ellas tiene un nombre de usuario custom y contrasea obscure. Para crear las cuentas con GRANT, use los siguientes comandos:
shell> mysql> -> -> -> mysql> -> -> -> mysql> -> -> -> mysql --user=root mysql GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO 'custom'@'localhost' IDENTIFIED BY 'obscure'; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO 'custom'@'whitehouse.gov' IDENTIFIED BY 'obscure'; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO 'custom'@'server.domain' IDENTIFIED BY 'obscure';
Las tres cuentas pueden usarse de la siguiente manera: La primera cuenta puede acceder a la base de datos bankaccount, pero slo desde el equipo local. La segunda cuenta puede acceder la base de datos expenses, pero slo desde el equipo whitehouse.gov. La tercera cuenta puede acceder la base de datos customer, pero slo desde el equipo server.domain. Para inicializar las cuentas custom sin usar GRANT, use los comandos INSERT como se explica para modificar las tablas de permisos directamente:
299
shell> mysql> -> mysql> -> mysql> -> mysql> -> -> -> -> mysql> -> -> -> -> mysql> -> -> -> -> mysql>
mysql --user=root mysql INSERT INTO user (Host,User,Password) VALUES('localhost','custom',PASSWORD('obscure')); INSERT INTO user (Host,User,Password) VALUES('whitehouse.gov','custom',PASSWORD('obscure')); INSERT INTO user (Host,User,Password) VALUES('server.domain','custom',PASSWORD('obscure')); 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('server.domain','customer','custom', 'Y','Y','Y','Y','Y','Y'); FLUSH PRIVILEGES;
Los primeros tres comandos INSERT aaden registros en la tabla user que permiten al usuario custom conectar desde los equipos con la contrasea dada, pero no otorga privilegios blobales (todos los privilegios se inicializan al valor por defecto 'N'). Los siguientes tres comandos INSERT aaden registros en la tabla db que otorgan privilegios a custom para las bases de datos bankaccount, expenses, y customer, pero slo cuando se accede desde los equipos apropiados. Como siempre, cuando modifique las tablas de permisos directamente, debe decirle al servidor que las recargue con FLUSH PRIVILEGES para que los cambios en los permisos tengan efecto. Si quiere dar a un usuario especfico acceso desde todas las mquinas dentro de un dominio dado (por ejemplo, mydomain.com), puede realizar un comando GRANT que use el carcter comodn '%' en la parte del equipo del nombre de cuenta:
mysql> GRANT ... -> ON *.* -> TO 'myname'@'%.mydomain.com' -> IDENTIFIED BY 'mypass';
Para hacer lo mismo modificando las tablas de permisos directamente, haga lo siguiente:
mysql> INSERT INTO user (Host,User,Password,...) -> VALUES('%.mydomain.com','myname',PASSWORD('mypass'),...); mysql> FLUSH PRIVILEGES;
300
El nmero de veces que una cuenta puede conectar con el servidor por hora Cualquier comando que un cliente puede realizar cuenta en el lmite de consultas. Slo los comandos que modifiquen la base de datos o las tablas cuentan en el lmite de actualizaciones. Desde MySQL 5.0.3, es posible limitar el nmero de conexiones simultneas al servidor por cuenta. Una cuenta en este contexto es un registro en la tabla user . Cada cuenta se identifica unvocamente por los valores de las columnas User y Host. Como prerrequisito para usar esta caracterstica, la tabla user en la base de datos mysql debe contener las columnas relacionadas con el recurso. Los lmites de recursos se guardan en las columnas max_questions, max_updates, max_connections, y max_user_connections . Si su tabla user no tiene estas columnas, debe actualizarla; consulte Seccin 2.10.2, Aumentar la versin de las tablas de privilegios. Para cambiar el lmite de recursos con un comando GRANT use la clusula WITH que nombra cada recurso a ser limitado y un contador por hora indicando el valor lmite. Por ejemplo, para crear una nueva cuenta que pueda acceder a la base de datos customer, pero slo de forma limitada, utilice este comando:
mysql> GRANT ALL ON customer.* TO 'francis'@'localhost' -> IDENTIFIED BY 'frank' -> WITH MAX_QUERIES_PER_HOUR 20 -> MAX_UPDATES_PER_HOUR 10 -> MAX_CONNECTIONS_PER_HOUR 5 -> MAX_USER_CONNECTIONS 2;
No todos los tipos de lmites necesitan nombrarse en la clusula WITH, pero los nombrados pueden presentarse en cualquier orden. El valor para cada lmite por hora debe ser un entero representando el contador por hora. Si el comando GRANT no tiene clusula WITH, los lmites se inicializan con el valor por defecto de cero (o sea, sin lmite). Para MAX_USER_CONNECTIONS, el lmite es un entero indicando el mximo nmero de conexiones simultneas que la cuenta puede hacer en cualquier momento. Si el lmite asignado es el valor por defecto de cero, la variable de sistema max_user_connections determina el nmero de conexiones simultneas para la cuenta. Para inicializar o cambiar los lmites de una cuenta existente, use un comando GRANT USAGE a nivel global (ON *.*). El siguiente comando cambia el lmite de consultas para francis a 100:
mysql> GRANT USAGE ON *.* TO 'francis'@'localhost' -> WITH MAX_QUERIES_PER_HOUR 100;
Este comando deja los permisos existentes de la cuenta inalterados y modifica slo los valores cuyo lmite se especifica. Para eliminar un lmite existente, ponga su valor a cero. Por ejemplo, para eliminar el lmite de cuntas veces por hora puede conectar francis , use este comando:
mysql> GRANT USAGE ON *.* TO 'francis'@'localhost' -> WITH MAX_CONNECTIONS_PER_HOUR 0;
El conteo del uso de recursos toma lugar cuando una cuenta tiene un lmite distinto a cero para el uso de cualquier recurso. Mientras el servidor est en ejecucin, cuenta el nmero de veces que cada cuenta usa los recursos. Si una cuenta llega a su lmite en el nmero de conexiones en la ltima hora, se rechazan cualquier intento de conexin mientras dure la hora. De forma similar, si la cuenta llega a su lmite de consultas o actualizaciones, consultas o actualizaciones adicionales se rechazan mientras dure la hora. En cualquier caso, se muestra el mensaje de error apropiado El conteo de recursos se hace por cuenta, no por cliente. Por ejemplo, si una cuenta tiene un lmite de 50 consultas, no puede incrementar el lmite a 100 haciendo dos conexiones simultneas al servidor. Las consultas de ambas conexiones se cuentan juntas.
301
El contador actual por hora de uso de recursos puede reiniciarse globalmente para todas las cuentas, o individualmente para una cuenta dada: Para reiniciar los contadores actuales a cero para todas las cuentas, ejecute el comando FLUSH USER_RESOURCES. Los contadores tambin pueden reiniciarse recargando las tablas de permisos (por ejemplo,k con un comando FLUSH PRIVILEGES o mysqladmin reload). Los contadores para una cuenta individual pueden ponerse a cero cambiando cualquiera de sus lmites. Para hacerlo, use GRANT USAGE como se ha descrito anteriormente y especifique un valor lmtite igual al valor que tiene la cuenta en ese momento. Los reinicios de contadores no afectan el lmite MAX_USER_CONNECTIONS . Todos los contadores empiezan a cero cuando el servidor arranca; los contadores no se guardan al reiniciar.
La cuenta para la que este comando cambia la contrasea es la que tiene un registro en la tabla user que coincida el user_name con la columna User y un equipo cliente desde el que se conecta en la columna Host. Otra forma de asignar una contrasea en una cuenta es con el comando SET PASSWORD :
mysql> SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');
Slo los usuarios tales como root con acceso de modificacin para la base de datos mysql puede cambiar la contrasea de otro usuario. Si no est conectado como un usuario annimo, puede cambiar su propia contrasea omitiendo la clusula FOR :
mysql> SET PASSWORD = PASSWORD('biscuit');
Puede usar el comando GRANT USAGE globalmente (ON *.*) para asignar una contrasea a una cuenta sin afectar los permisos actuales de la cuenta:
mysql> GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';
Aunque generalmente es peferible asignar contraseas usando uno de los mtodos precedentes, puede hacerlo modificando la tabla user directamente: Para establecer una contrasea al crear una nueva cuenta, especifique un valor para la columna Password:
shell> mysql> -> mysql> mysql -u root mysql INSERT INTO user (Host,User,Password) VALUES('%','jeffrey',PASSWORD('biscuit')); FLUSH PRIVILEGES;
Para cambiar la contrasea en una cuenta existente, use UPDATE para especificar el valor de la columna Password:
shell> mysql> -> mysql> mysql -u root mysql UPDATE user SET Password = PASSWORD('bagel') WHERE Host = '%' AND User = 'francis'; FLUSH PRIVILEGES;
Cuando especifique una contrasea en una cuenta mediante SET PASSWORD, INSERT, o UPDATE, debe usar la funcin PASSWORD() para cifrarla. (La nica excepcin es que no necesita usar PASSWORD() si la contrasea est vaca). PASSWORD() es necesario ya que la tabla user guarda las contraseas cifradas, no en texto plano. Si olvida este hecho, es posible que guarde contraseas as:
shell> mysql -u root mysql mysql> INSERT INTO user (Host,User,Password)
302
El resultado es que el valor literal 'biscuit' se guarda como contrasea en la tabla user, no el valor cifrado. Cuando jeffrey trate de conectar al servidor usando esta contrasea, el valor se cifra y se compara con el valor guardado en la tabla user. Sin embargo, el valor guardado es la cadena de caracteres literal 'biscuit', as que la comparacin falla y el servidor rechaza la conexin:
shell> mysql -u jeffrey -pbiscuit test Access denied
Si inicializa la contrasea usando el comando GRANT ... IDENTIFIED BY o mysqladmin password , ambos cifran la contrasea. En estos casos, el uso de la funcin PASSWORD() no es necesario. Nota: El cifrado de PASSWORD() es diferente al de contraseas Unix. Consulte Seccin 5.7.1, Nombres de usuario y contraseas de MySQL.
Esto es conveniente pero inseguro, porque la clave se vuelve visible para programas de consulta del estado del sistema, como ps que pueden ser invocados por otros usuarios para mostrar lneas de comando. Los clientes de MySQL normalmente sobreescriben el parmetro de la clave en la lnea de comandos con ceros durante la secuencia de inicializacin, pero an as hay un breve intervalo de tiempo en que el valor es visible. Utilice la opcin -p o --password sin especificar ningn valor para la clave. En este caso, el programa cliente solicita la clave desde el terminal:
shell> mysql -u francis -p db_name Enter password: ********
Los caracteres '*' indican donde se introduce la clave. La clave no se muestra mientras se est introduciendo. Es ms seguro introducir la clave de esta manera que especificarla en la lnea de comandos, porque as no es visible a otros usuarios. No obstante, este mtodo es tan solo aplicable para programas que se ejecutan de manera interactiva. Si quiere invocar un programa cliente desde un script que no se ejecute interactivamente, no hay oportunidad de introducir la clave mediante el terminal. En algunos sistemas, incluso podra darse que la primera lnea del script sea leida e interpretada (incorrectamente) como la clave. Almacene su clave en un archivo de opciones. Por ejemplo, en Unix puede introducir su clave en la seccin [client] del archivo .my.cnf de su directorio personal.
[client] password=your_pass
Si almacena su calve en .my.cnf, el archivo no debera ser accesible para nadie ms que usted. Para asegurarse de esto, establezca el modo de acceso del archivo a 400 o 600. Por ejemplo:
shell> chmod 600 .my.cnf
303
Seccin 4.3.2, Usar ficheros de opciones habla sobre los archivos de opciones con ms detalle. Almacene su clave en la variable de entorno MYSQL_PWD. Este mtodo de especificar su clave MySQL debe ser considerado extremadamente inseguro y no debera ser utilizado. Algunas versiones de ps incluyen una opcin para mostrar las varialbes de entorno de los procesos en ejecucin. Si establece MYSQL_PWD, su clave estar expuesta a cualquier otro usuario que ejecute ps. An en sistemas con una versin tal de ps, no es inteligente asumir que no habr cualquier otro mtodo mediante el cual los usuarios puedan examinar las variables de entorno. Consulte Apndice E, Variables de entorno. De todas maneras, la manera ms segura de hacerlo es, o bien hacer que el programa cliente pregunte por la clave, o especificarla en un archivo de opciones protegido.
304
Si necesita ms informacin sobre SSL, X509, o cifrado, utilice su buscador de Internet favorito para buscar las palabras clave en que est interesado.
305
# # # # # # # # # # # #
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 admin Email Address []:
# # Create server request and key # openssl req -new -keyout $DIR/server-key.pem -out \ $DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf # # # # # # # # # # # # # # # # # # # # # # # # # # # # # Sample output: 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]:. 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 []:
# # Remove the passphrase from the key (optional) # openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem # # Sign server cert # openssl ca -policy policy_anything -out $DIR/server-cert.pem \ -config $DIR/openssl.cnf -infiles $DIR/server-req.pem # # # # # # # # # # # Sample output: 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)
306
# # # # # #
1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
# # Create client request and key # openssl req -new -keyout $DIR/client-key.pem -out \ $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf # # # # # # # # # # # # # # # # # # # # # # # # # # # # # Sample output: 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 A challenge password []: An optional company name []:
# # Remove a passphrase from the key (optional) # openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem # # Sign client cert # openssl ca -policy policy_anything -out $DIR/client-cert.pem \ -config $DIR/openssl.cnf -infiles $DIR/client-req.pem # # # # # # # # # # # # # # # # # Sample output: 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
307
# # Create a my.cnf file that you can use to test the certificates # 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
Para comprobar las conexiones SSL, inicie el servidor de la siguiente manera, donde $DIR es la ruta a el directorio donde est el archivo de opciones de ejemplo my.cnf:
shell> mysqld --defaults-file=$DIR/my.cnf &
Si tiene una distribucin de cdigo fuente de MySQL, usted puede tambier comprobar su configuracin modificando el archivo my.cnf precedente para que se refiera al certificado y los archivos de claves en el directorio SSL de la distribucin.
REQUIRE X509 significa que el cliente debe tener un certificado pero que el certificado exacto, entidad certificadora y sujeto no importan. El nico requerimiento es que debera ser posible verificar su firma con uno de los certificados CA.
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' -> IDENTIFIED BY 'goodsecret' REQUIRE X509;
REQUIRE ISSUER 'issuer' coloca una restriccin en la conexin mediante la cual el cliente debe presentar un certificado X509 vlido, emitido por la CA 'issuer'. Si el cliente presenta un certificado que es valido pero tiene un emisor diferente, el servidor rechaza la conexin. La utilizacin de certificados X509 siempre implica cifrado, as que la opcin SSL no es necesaria.
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@example.com';
308
Ntese que el valor de ISSUER debe introducirse como una nica cadena de caracteres. REQUIRE SUBJECT 'subject' establece la restriccin a los intentos de conexin de que el cliente debe presentar un certificado X509 vlido con sujeto 'subject'. Si el cliente presenta un certificado que, aunque vlido, tiene un sujeto diferente, el servidor rechaza la conexin.
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';
Ntese que el valor de SUBJECT debe ser introducido como una nica cadena de caracteres. REQUIRE CIPHER 'cipher' es necesario para asegurar que se utilizan longitudes de cifra y claves suficientemente fuertes. El protocolo SSL por s mismo puede ser dbil si se utilizan viejos algorimots con claves de cifrado cortas. Utilizando esta opcin, podemos pedir un mtodo exacto de cifrado para permitir una conexin.
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' -> IDENTIFIED BY 'goodsecret' -> REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
Las opciones SUBJECT, ISSUER, y CIPHER pueden combinarse en la sentencia REQUIRE de la siguiente manera:
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';
Ntese que los valores de SUBJECT e ISSUER deben ser introducidos cada uno como una nica cadena de caracteres. En MySQL 5.0, la palabra clave AND es opcional entre las opciones de REQUIRE. El orden de las opciones no importa, pero ninguna opcin puede ser especificada dos veces.
309
--ssl-ca=file_name La ruta a un archivo con una lista de CAs SSL en las que se confa. --ssl-capath=directory_name La ruta a un direcotrio que contiene certificados de CA confiables en formato pem. --ssl-cert=file_name El nombre del archivo de certificado SSL a utilizar para establecer una conexin segura. --ssl-cipher=cipher_list Una lista de cifras permisibles para usar en el cifrado SSL. cipher_list tiene el mismo formato que el comando openssl ciphers. Ejemplo: --ssl-cipher=ALL:-AES:-EXP --ssl-key=file_name El nombre del archivo de clave SSL utilizado para establecer una conexin segura.
310
O:
shell> mysqlhotcopy db_name /path/to/some/dir
Tambin puede simplemente copiar todos los archivos de tablas (*.frm, *.MYD, y *.MYI) siempre que el servidor no est actualizando nada. El script mysqlhotcopy utiliza este mtodo. (Pero tenga en cuenta que estos mtodos no funcionan si su base de datos contiene tablas InnoDB. InnoDB no almacena los contenidos de las tablas en directorios de base de datos, y mysqlhotcopy funciona solo para tablas MyISAM e ISAM.) 2. Pare mysqld si se est ejecutando, y despus reinicielo con la opcin --logbin[=file_name]. Consulte Seccin 5.10.3, El registro binario (Binary Log). Los archivos binarios de registro le dan la informacin que necesita para replicar los cambios que se han producido en la base de datos tras el punto en que usted ejecut mysqldump. Para las tablas InnoDB es posible realizar una copia de seguridad en lnea que no requiere bloqueos en las tablas; consulte Seccin 8.7, El programa de copia de seguridad de base de datos mysqldump MySQL tiene soporte para copias de seguridad incrementales: Usted necesita iniciar el servidor con la opcin --log-bin para activar el registro binario; consulte Seccin 5.10.3, El registro binario (Binary Log). En el momento en que usted quiera realizar una copia de seguridad incremental (que contenga todos los cambios que han ocurrido desde la ltima copia de seguridad, completa o incremental), usted debe rotar el registro binario utilizando FLUSH LOGS. Hecho esto, necesita copiar a la localizacin de seguridad todos los registros binarios que daten desde el momento de la ltima copia de seguridad hasta el ltimo. Estos logs binarios son la copia de seguridad incremental; cuando necesite restaurar la copia, los puede aplicar tal como se explica ms adelante. La prxima vez que haga una copia de seguridad compelta, tambin debe rotar el registro binario haciendo FLUSH LOGS, mysqldump --flush-logs, o mysqlhotcopy --flushlogs. Consulte Seccin 8.7, El programa de copia de seguridad de base de datos mysqldump y Seccin 8.8, El programa de copias de seguridad de base de datos mysqlhotcopy. Si su servidor MySQL es un servidor esclavo de replicacin, entonces independientemente del mtodo de copia de seguridad que elija, tambin debe copiar los archivos master.info y relay-log.info cuando copie los datos de su esclavo. Estos archivos son siempre necesarios para continuar la
311
replicacin despus de una restauracin de los datos del esclavo. Si su esclavo est replicando comandos LOAD DATA INFILE, debera tambin copiar cualquier archivo SQL_LOAD-* que pueda existir en el directorio especificado por la opcin --slave-load-tmpdir. (Esta localizacin es por defecto el valor de la variable tmpdir, si no se especifica.) El esclavo necesita estos archivos para reiniciar la replicacin de cualquier operacin LOAD DATA INFILE interrumpida. Si tiene que restaurar tablas MyISAM, intente recuperarlas utilizando REPAIR TABLE o myisamchk r primero. Esto debera funcionar en el 99.9% de los casos. Si myisamchk falla, intente el siguiente procedimiento. Tenga en cuenta que solo funciona si tiene activado el registro binario iniciando el servidor MySQL con la opcin --log-bin; consulte Seccin 5.10.3, El registro binario (Binary Log). 1. Restaure la copia de seguridad original de mysqldump, o la copia de seguridad binaria. 2. Ejecute el siguiente comando para ejecutar de nuevo las actualizaciones de los registros binarios:
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
En algunos casos, quiz quiera reejecutar solo ciertos registros binarios, desde ciertas posiciones (lo usual es querer reejecutar todos los registros binarios desde el punto de restauracin, excepto, posiblemente, algunas sentencias incorrectas). Consulte Seccin 8.5, La utilidad mysqlbinlog para registros binarios para ms informacin sobre la utilidad mysqlbinlog y como utilizarla. Tambin puede hacer copias de seguridad selectivas de archivos individuales: Para volcar la tabla, utilice SELECT * INTO OUTFILE 'file_name' FROM tbl_name. Para recargar la tabla, restaurela con LOAD DATA INFILE 'file_name' REPLACE ... Para evitar registros duplicados, la tabla tiene que tener un ndice PRIMARY KEY o UNIQUE. La palabra clave REPLACE hace que los viejos registros sean reemplazados con los nuevos cuando un nuevo registro tiene la misma clave que uno antiguo. Si tiene problema de rendimientos con su servidor mientras realiza copias de seguridad, una estrategia que puede ayudarle es crear replicacin y hacer las copias de seguridad en el esclavo en vez de en el maestro. Consulte Seccin 6.1, Introduccin a la replicacin. Si est utilizando un sistema de ficheros Veritas, puede hacer una copia de seguridad as: 1. Desde un programa cliente, ejecute FLUSH TABLES WITH READ LOCK. 2. Desde otra lnea de comandos, ejecute mount vxfs snapshot. 3. Desde el primer cliente, ejecute UNLOCK TABLES. 4. Copie los archivos de la captura (snapshot). 5. Desmonte la captura.
312
Asumiremos que los datos estn almacenados en el motor InnoDB de MySQL, que tiene soporte para transacciones y recuperacin automtica de fallos. Siempre asumiremos que el servidor MySQL est bajo carga de trabajo en el momento del fallo. Si no fuera as, no se necesitara ninguna recuperacin. Para casos de fallos de energa o de sistema operativo, podemos asumir que el disco de datos de MySQL est disponible tras el reinicio. Puede que entonces los archivos de datos de InnoDB no contengan datos consistentes debido al fallo, pero InnoDB lee sus registros y encuentra en ellos la lista de transacciones confirmadas y no confirmadas que todava no han sido volcadas a sus archivos de datos, y los vuelca. La informacin sobre este proceso de recuperacin de errores se le muestra al usuario a travs del registro de errores de MySQL. Lo siguiente, es un extracto de ejemplo del registro:
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
En casos de fallos del sistema de fichero o de hardware, podemos asumir que el disco de datos de MySQL no est disponible tras el reinicio. Esto significa que MySQL no puede arrancar normalmente porque algunos bloques de datos del disco no son legibles. En este caso, es necesario reformatear el disco, instalar uno nuevo, o en cualquier caso, corregir el problema subyacente. Despus es necesario recuperar nuestros datos de MySQL desde copias de seguridad, lo que significa que tenemos que tener copias ya realizadas. Para asegurarse de que sea as, vayamos hacia atrs en el tiempo y diseemos una poltica de copias de seguridad.
Esto es una copia de seguridad en lnea, sin bloqueos, que no molesta a las lecturas y escrituras de las tablas. Hemos supuesto antes que nuestras tablas son InnoDB, as que --singletransaction hace una lectura consistente y garantiza que los datos vistos por mysqldump no cambian. (Los cambios hechos por otros clientes a las tablas InnoDB no son vistas por el proceso mysqldump.) Si tambin tenemos otros tipos de tablas, debemos suponer que no han sido cambiadas durante la copia de seguridad. Por ejemplo, para las tablas MyISAM en la base de datos mysql, debemos suponer que no se estaban haciendo cambios administrativos a las cuentas MySQL durante la copia de seguridad.
313
El archivo .sql resultante producido por el comando mysqldump contiene una serie de sentencias SQL INSERT que se pueden utilizar para recargar las tablas volcadas ms tarde. Las copias de seguridad completas son necesarias, pero no son siempre convenientes. Producen ficheros muy grandes y llevan tiempo generarse. No son ptimos en el sentido de que cada copia completa sucesiva incluye todos los datos, incluidas las partes que no han cambiado desde el ltimo. Despus de realizar una copia de seguridad completa inicial, es ms eficiente hacer copias incrementales. Son ms pequeas, y llevan menos tiempo de realizacin. A cambio, en el momento de la recuperacin, no podr restaurarlo nicamente recargando la copia completa. Tambin deber procesar las copias incrementales para recuperar los cambios incrementales. Para hacer copias de seguridad incrementales, necesitamos guardar los cambios incrementales. El servidor MySQL debera ser iniciado siempre con la opcin --log-bin para que almacene estos cambios en un archivo mientras actualiza los datos. Esta opcin activa el registro binario, as que el servidor escribe cada sentencia SQL que actualiza datos en un archivo lllamado registro binario de MySQL. Miremos al directorio de datos de un servidor MySQL que fue iniciado con la opcin --logbin y que se ha estado ejecutando durante algunos das. Encontramos estos archivos de registro binario:
-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
Cada vez que se reinicia, el servidor MySQL crea un nuevo archivo de registro binario utilizando el siguiente nmero en la secuencia. Mientras el servidor se est ejecutando, podemos comunicarle manualmente que cierre el archivo de registro binario actual y comience otro nuevo, ejecutando la sentencia SQL FLUSH LOGS o con el comando mysqladmin flush-logs. mysqldump tambin tiene una opcin para volcar los logs. El archivo .index en el directorio de datos contiene la lista de todos los archivos de registro binario de MySQL en el directorio. Este archivo se utiliza para replicacin. El registro binario de MySQL es importante para la restauracin, porque son copias incrementales de datos. Si se asegura de volcar los registros cuando hace su copia de seguridad completa, entonces cualquier registro binario creado tras esa copia contiene todos los cambios hechos desde entonces. Modifiquemos el comando mysqldump previo un poco para que vuelque los registros binarios de MySQL en el momento de la copia de seguridad completa, y para que el archivo de volcado contenga el nombre del registro binario actual:
shell> mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > backup_sunday_1_PM.sql
Tras ejecutar este comando, el directorio de datos contiene un nuevo archivo de registro binario, gbichot2-bin.000007. El archivo .sql resultante contiene estas lneas:
-- Position to start replication or point-in-time recovery from -- CHANGE MASTER TO MASTER_LOG_FILE='gbichot2-bin.000007',MASTER_LOG_POS=4;
Como el comando mysqldump ha hecho una copia de seguridad completa, estas lneas significan dos cosas: El archivo .sql contiene todos los cambios hechos antes de cualquier cambio escrito al registro binario gbichot2-bin.000007 o posterior. Todos los cambios registrados tras la copia de seguridad no estn presentes en el archivo .sql, pero lo estn en el registro binario gbichot2-bin.000007 o posterior. El lunes, a las 1 PM, podemos crear una copia de seguridad incremental volcando los registros para comenzar un nuevo registro binario. Por ejemplo, ejecutando un comando mysqladmin flushlogs creamos gbichot2-bin.000008. Todos los cambios producidos entre el domingo a la 1 PM
314
cuando se hizo la copia completa, y el lunes a la 1 PM estn en el archivo gbichot2-bin.000007. Esta copia incremental es importante, as que es una buena idea copiarla a un lugar seguro. (Por ejemplo, en cinta o DVD, o copindolo a otra mquina.) El martes a la 1 PM, ejecute otro comando mysqladmin flush-logs. Todos los cambios desde el lunes a la 1 PM hasta el martes a la 1 PM estn en el archivo gbichot2-bin.000008 (que tambin debera ser copiado a un lugar seguro). Los registros binarios de MySQL ocupan espacio de disco. Para ligerar espacio, prguelos de vez en cuando. Una manera de hacerlo es borrar los registros binarios que no se necesiten, como cuando hacemos una copia de seguridad completa:
shell> mysqldump --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > backup_sunday_1_PM.sql
Tenga en cuenta que: Borrar los registros binarios de MySQL con mysqldump --delete-masterlogs puede ser peligroso si su servidor es un servidor maestro de replicacin, porque los servidores esclavos pueden no haber procesado completamente los contenidos del registro binario. La descripcin de la sentencia PURGE MASTER LOGS explica lo que debe ser verificado antes de borrar los registros binarios de MySQL. Consulte Seccin 13.6.1.1, Sintaxis de PURGE MASTER LOGS.
En este punto, el estado de los datos ha sido restaurado al del domingo a la 1 PM. Para restaurar los datos hechos desde entonces, debemos usar las copias incrementales, es decir los archivos de registro binario gbichot2-bin.000007 y gbichot2-bin.000008. Extraigalos, si es necesario, de all donde estuviesen guardados, y luego procese sus contenidos de la siguiente manera:
shell> mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql
Ahora hemos recuperado los datos hasta su estado del martes a la 1 PM, pero todava hay cambios que faltan desde esa fecha hasta el momento del fallo. Para no perderlos, deberamos haber hecho que el servidor MySQL almacenase sus registros MySQL en un lugar seguro (discos RAID, ...) diferente del lugar donde almacena sus archivos de datos, para que estos registros no estuvieran nicamente en el disco destruido. (Es decir, iniciar el servidor con la opcin --log-bin que especifique una localizacin en un dispositivo fsico diferente del que contiene el directorio de datos. De esta manera, los registros no se pierden an si el dispositivo que contiene el directorio s.) Si hubisemos hecho esto, podramos tener el archivo gbichot2-bin.000009 a mano, y podramos aplicarlo para restaurar hasta los cambios ms recientes sin ninguna prdida a como estaban en el momento del fallo.
315
Haga copias de seguridad incrementales periodicamente volcando los registros con FLUSH LOGS o mysqladmin flush-logs.
Las options especifican lo que quiere que myisamchk haga. Se describen en las secciones posteriores. Tambin puede obtener una lista de las opciones invocando myisamchk --help. Sin opciones, myisamchk simplemente comprueba la tabla, como operacin por defecto. Para obtener ms informacin, o decirle a myisamchk que tome medidas correctivas, especifique las opciones tal como se explica en la siguiente gua. tbl_name es el nombre de la tabla que quiere comprobar o reparar. Si ejecuta myisamchk desde otro lugar que no sea el directorio de la base de datos, debe especificar la ruta hasta este directorio, porque myisamchk no tiene la ms mnima idea de en qu lugar se encuentra la base de datos. De hecho, myisamchk no se preocupa por si los archivos sobre los que trabaja se encuentran en un directorio de base de datos. Puede copiar los archivos que corresponden a la tabla en cualquier otro lugar, y hacer las operaciones de recuperacin all. Puede invocar varios nombres de tablas en la lnea de comandos de myisamchk, si lo desea. Tambin puede especificar una tabla nombrando a su archivo de ndices (el archivo con extensin .MYI). Esto permite que especifique todas las tablas de un directorio utilizando el patrn *.MYI. Por
316
ejemplo, si se encuentra en un directorio de una base de datos, puede comprobar todas las tablas MyISAM de ese directorio de la siguiente manera:
shell> myisamchk *.MYI
Si no se encuentra en el directorio de la base de datos, puede comprobar todas las tablas especificando la ruta al directorio:
shell> myisamchk /path/to/database_dir/*.MYI
Incluso se podra comprobar todas las tablas en todas las bases de datos especificando un comodn en la ruta a el archivo de datos MySQL:
shell> myisamchk /path/to/datadir/*/*.MYI
La manera recomendada de comprobar rpidamente todas las tablas MyISAM e ISAM es:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI shell> isamchk --silent /path/to/datadir/*/*.ISM
Si usted quiere comprobar todas las tablas MyISAM e ISAM y repararlas si alguna est corrompida, puede utilizar los siguientes comandos:
shell> 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 shell> isamchk --silent --force -O key_buffer=64M \ -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M \ /path/to/datadir/*/*.ISM
Estos comandos asumen que tiene ms de 64MB libres. Para ms informacin sobre reserva de memoria con myisamchk, consulte Seccin 5.8.3.6, Utilizacin de la memoria por parte de myisamchk. Debe asegurarse de que ningn otro programa est utilizando las tablas mientras ejecute myisamchk. Si no es as, cuando ejecute myisamchk, puede obtener el siguiente mensaje de error:
warning: clients are using or haven't closed the table properly
Esto significa que est intentando comprobar una tabla que ha sido cambiada por otro programa (como podra ser el servidor mysqld) que no ha cerrado an el archivo, o que ha muerto sin cerrar el archivo adecuadamente. Si mysqld se est ejecutando, debe forzarlo a volcar cualquier modificacin de tablas que todava est almacenada en memoria, utilizando FLUSH TABLES. Debera entonces asegurarse de que nadie est utilizando las tablas sobre las que se ejecuta myisamchk. La manera ms fcil de evitar este problema es utilizar CHECK TABLE en vez de myisamchk para comprobar las tablas.
317
--silent, -s Modo silencioso. Escribe solo cuando ocurre algn tipo de error. Puede usar -s dos veces (-ss) para hacer que myisamchk sea muy silencioso. --verbose, -v Modo explcito. Imprime ms informacin. Esto puede ser utilizado en conjuncin con -d y -e. Utilice -v mltiples veces (-vv, -vvv) para producir an ms informacin. --version, -V Muestra informacin sobre la versin y finaliza. --wait, -w En vez de terminar con un error si la tabla se encuentra bloqueada, espera a que la tabla se desbloquee antes de continuar. Tenga en cuenta que si est ejecutando mysqld con la opcin --skip-external-locking, la tabla slo puede haber sido bloqueada por otro comando myisamchk. Tambin puede establecer las variables utilizando --var_name=value opciones: 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 Valor por defecto 9 dependiente-de-versin 4 lista interna 523264 1024 262136 2097144 16 262136
Las posibles variables de myisamchk y sus valores por defecto pueden ser examinadas con myisamchk --help: sort_buffer_size se utiliza cuando las claves son reparadas mediante ordenacin, que es el caso normal cuando se utiliza --recover. key_buffer_size se utiliza cuando se est comprobando una tabla con --extend-check o cuando las claves se estn reparando insertndolas registro a registro en la tabla (como cuando se hacen inserciones normales). La reparacin a travs del "key buffer" se utiliza en los siguientes casos: Ha utilizado --safe-recover. Los archivos temporales necesarios para ordenar las claves seran ms del doble de grandes que cuando se crea el archivo de claves directmaente. Esto ocurre usualmente cuando hay valores grandes en la clave (tipos de columna como CHAR, VARCHAR, o TEXT), porque la operacin de ordenamiento necesita almacenar los valores de las claves por completo mientras procede. Si tiene mucho espacio temporal y puede forzar a que myisamchk repare mediante ordenacin, puede utilizar la opcin --sort-recover. La reparacin mediante el "key buffer" necesita mucho menos espacio de disco que utilizar ordenacin, pero es tambin mucho ms lenta. 318
Si quiere una reparacin ms rpida, establezca las variables key_buffer_size y sort_buffer_size a un valor aproximadamente dle 25% de la memoria disponible. Puede subir ambas variables a un valor grande, porque solo se utiliza una de ellas a la vez. myisam_block_size es el tamao utilizado para los bloques de ndices. ft_min_word_len y ft_max_word_len indican la longitud de palabra mnima y mxima para ndices FULLTEXT. ft_stopword_file indica un archivo de "palabra de parada". Esto necesita establecerse en las siguientes circunstancias. Si utiliza myisamchk para realizar una operacin que modifica los ndices de las tablas (como una reparacin o un anlisis), los ndices FULLTEXT son reconstruidos utilizando el archivo de palabra de parada por defecto a menos que especifique lo contrario. Esto puede resultar en el fallo de sentencias. El problema ocurre porque estos parmetros son slo conocidos por el servidor. No estn almacenados en los archivos de ndices de MyISAM. Para evitar el problema, si usted a modificado la longitud mnima o mxima de palabra, o el archivo de palabra de parada en el servidor, especifique los mismos valores de ft_min_word_len, ft_max_word_len, y ft_stopword_file para myisamchk que los que ha utilizado para mysqld. Por ejemplo, si ha establecido una longitud de palabra mnima de 3, puede reparar una tabla con myisamchk as:
shell> myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
Para asegurarnos de que myisamchk y el servidor utilizan los mismos valores para los parmetros de full-text, podemos ponerlos en las secciones [mysqld] y [myisamchk] de un archivo de opciones:
[mysqld] ft_min_word_len=3 [myisamchk] ft_min_word_len=3
Una alternativa a utilizar myisamchk es usar las sentencias REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE, o ALTER TABLE. Estas sentencias son ejecutadas por el servidor, que conoce los parmetros de full-text apropiados que debe utilizar.
319
Realiza una operacin de reparacin automaticamente si myisamchk encuentra cualquier error en la tabla. El tipo de reparacin es el mismo que el que se espcifica con la opcin --repair o -r. --information, -i Imprime estadsticas informativas sobre la tabla que se comprueba. --medium-check, -m Realiza una comprobacin que es ms rpida que --extend-check. Esta comprobacin encuentra solo el 99.99% de todos los errores, lo que debera ser suficiente en la mayor parte de los casos. --read-only, -T No seala la tabla como comprobada. Esto es til si utiliza myisamchk para comprobar una tabla que est siendo utilizada por otra aplicacin que no utiliza bloqueos, como mysqld cuando se ejecuta con la opcin --skip-external-locking. --update-state, -U Almacena informacin en el archivo .MYI para indicar que la tabla ha sido comprobada, o si la tabla tiene fallos. Esto debera utilizarse par obtener el mximo beneficio de la opcin --check-onlychanged, pero no debera utilizarse esta opcin si se est ejecutando el servidor mysqld, con la opcin --skip-external-locking, y ste est utilizando la tabla.
320
esta opcin indica que slo los primeros # ndices de la tabla deben ser actualizados. En cualquier caso, un valor de 0 en la opcin desahbilita las actualizaciones a todos los ndices, lo que puede ser utilizado para obtener inserciones ms rpidas. Los ndices desactivados pueden ser reactivados utilizando myisamchk -r. --no-symlinks, -l No sigue los enlaces simblicos. Normalmente repara una tabla que est apuntada por un enlace simblico. Esta opcin no existe en MySQL 4.0, porque las versiones a partir de la 4.0 no eliminan los enlaces simblicos durante las operaciones de reparacin. --parallel-recover, -p Utiliza la misma tcnica que -r y -n, pero crea todas las claves en paralelo, utilizando hilos de ejecucin diferentes. Esto es cdigo en estado alpha. Utilcelo bajo su propia responsabilidad. --quick, -q Consigue una reparacin ms rpida al no modificar el archivo de datos. Puede especificar esta opcin dos veces para forzar a myisamchk a modificar el archivo original de datos en el caso de claves duplicadas. --recover, -r Realiza una reparacin que puede resolver casi cualquier problema, excepto las claves nicas que no son nicas (que es un error extremadamente raro en tablas MyISAM). Si quiere recuperar una tabla, esta es la primera opcin a intentar. Debera intentar con -o slo si myisamchk comunica que la tabla no puede recuperarse con -r. (En el improbable caso de que -r falle, el archivo de datos permanece intacto.) Si tiene memoria suficiente, debera incrementar el valor de sort_buffer_size. --safe-recover, -o Hace una reparacin utilizando un mto de recuperacin antiguo que lee todos los registros en orden y actualiza todos los rboles de ndices basndose en los registros encontrados. Esto es de un orden de magnitud ms lento que -r, pero puede gestionar un puado de casos muy improbables que -r no puede. Este mtodo de recuperacin tambin utiliza mucho menos espacio de disco que -r. Normalmente debera reparar primero con -r, y luego utilizar -o solo si -r falla. Si tiene mucha memoria, debera incrementar el valor de key_buffer_size. --set-character-set=name Cambia el juego de caracteres utilizado por los ndices de tabla. Esta opcin fue reemplazada por --set-collation en MySQL 5.0.3. --set-collation=name Cambia la colacin utilizada para ordenar los ndices de las tablas. El nombre del cdigo de caracteres viene implcito en la primera parte del nombre de la colacin. Esta opcin fue aadida en MySQL 5.0.3. --sort-recover, -n Fuerza a que myisamchk utilice ordenacin para establecer las claves aunque los archivos temporales puedan ser muy grandes. --tmpdir=path, -t path La ruta a el directorio que debe utilizarse para almacenar archivos temporales. Si no est establecida, myisamchk utiliza el valor de la variable de entorno TMPDIR. tmpdir puede ser
321
establecido como una lista de rutas de directorios que son utilizadas sucesivamente de una manera a lo "round-robin" para crear archivos temporales. El carcter de separacin entre los nombres de directorio es el de dos puntos en Unix (':') y el punto y coma en Windows, Netware, y OS/2 (';'). --unpack, -u Descomprime una tabla que fue comprimida con myisampack.
Utilizar -O sort=16M probablemente sea suficiente para la mayora de los casos. Tenga en cuenta que myisamchk utiliza archivos temporales en TMPDIR. Si TMPDIR apunta a un sistema de ficheros en memoria, podra quedarse fcilmente sin memoria y obtener errores. Si esto ocurre, haga que TMPDIR apunte a algn directorio de un sistema de ficheros con ms espacio y ejecute el comando myisamchk de nuevo.
322
Mientras est reparando, myisamchk tambin necesita mucho espacio de disco: Doble el espacio del archivo de datos (el original y una copia). Este espacio no se necesitar si hace una reparacin con la opcin --quick; en este caso solo se reconstruye el archivo de ndices (la copia se crea en el mismo directorio que el original.) El espacio para el archivo de ndices que reemplaza al viejo. El archivo de ndices viejo se trunca en el inicio de la operacin de reparacin, as que usualmente este espacio se ignora. Este espacio debe estar en el mismo sistema de ficheros que el archivo de ndices original. Cuando utilice --recover o --sort-recover (pero no al utilizar --safe-recover), necesitar espacio para un buffer de ordenacin. El espacio requerido es:
(clave_ms_larga + longitud_de_puntero_a_registro) * nmero_de_registros * 2
Puede comprobar la longitud de las claves y la longitud_de_puntero_a_registro con myisamchk dv tbl_name. Este espacio se reserva en el directorio temporal (especificado por TMPDIR o -tmpdir=path). Si tiene algn problema con el espacio de disco durante una reparacin, puede intentar utilizar -safe-recover en vez de --recover.
Cada uno de estos tres tipos de archivos tiene un tipo de peligro de corrupcin diferente, pero la mayora de problemas ocurren ms frecuentemente en los archivos de datos e ndices.
323
myisamchk trabaja creando una copia de el archivo de datos .MYD registro a registro. Finaliza el estadio de reparacin borrando el viejo archivo .MYD y renombrando el nuevo archivo a el nombre original. Si utiliza --quick, myisamchk no crea un archivo.MYD temporal, sino que asume que el archivo .MYD est correcto y solo genera un nuevo archivo de ndices sin tocar el archivo .MYD. Esto es seguro porque myisamchk automticamente detecta s el archivo .MYD est corrompido, y para la reparacin si lo est. Tambin puede especificar la opcin --quick dos veces. En este caso, myisamchk no aborta al encontrar algunos errores (como erroes de clave duplicada), sino que intenta resolverlo modificando el archivo .MYD. Normalmente, la utilizacin de dos opciones --quick es til slo si tiene muy poco espacio libre para realizar una reparacin normal. En este caso, al menos debera hacer una copia de seguridad antes de ejecutar myisamchk.
324
Record file is crashed Got error ### from table handler Para obtener ejecucin acerca de los errores puede ejectuar perror ###, donde ### es el nmero de error. El siguiente ejemplo muestra cmo usar perror para encontrar el significado de la mayora de errores comunes que indican un problema con la tabla:
shell> perror 126 127 132 134 135 136 141 144 145 126 = Index file is crashed / Wrong file format 127 = Record-file is crashed 132 = Old database file 134 = Record was already deleted (or record file crashed) 135 = No more room in record file 136 = No more room in index file 141 = Duplicate unique key or constraint on write or update 144 = Table is crashed and last repair failed 145 = Table was marked as crashed and should be repaired
Tenga en cuenta que el error 135 (no more room in record file) y el error 136 (no more room in index file) no son errores que puedan arreglarse con una simple reparacin. En este caso, debe usar ALTER TABLE para incrementar los valores de las opciones de tabla MAX_ROWS y AVG_ROW_LENGTH:
ALTER TABLE tbl_name MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;
Si no conoce los valores actuales de las opciones de tabla, use SHOW CREATE TABLE o DESCRIBE. Para los otros errores, debe reparar las tablas. myisamchk normalmente detecta y arregla la mayora de problemas que ocurren. El proceso de reparacin incluye hasta cuatro etapas, descritas aqu. Antes de empezar, debe cambiar la localizacin al directorio de la base de datos y comprobar los permisos de los ficheros de las tablas. En Unix, asegrese que puede leerlos el usuario con el que corre mysqld (y con su usuario, ya que necesita acceder a los ficheros que est comprobando). En caso que necesite modificar ficheros, debe tener tambin permiso de escritura. Las opciones que puede usar para el mantenimiento de tablas con myisamchk y isamchk se describen en varias de las primeras subsecciones de Seccin 5.8.3, Mantenimiento de tablas y recuperacin de un fallo catastrfico (crash). La siguiente seccin es para los casos en los que los comandos anteriores fallen o si quiere usar las caractersticas extendidas que myisamchk y isamchk proporcionan. Si va a reparar una tabla desde la lnea de comandos, debe parar el servidor mysqld en primer lugar. Tenga en cuenta que cuando ejectua mysqladmin shutdown en un servidor remoto, el servidor mysqld todava est activo durante un periodo de tiempo una vez que mysqladmin devuelve el control, hasta que todas las consultas estn paradas y todas las claves se han volcado a disco. Etapa 1: Comprobacin de tablas Ejecute myisamchk *.MYI o myisamchk -e *.MYI si tiene ms tiempo. Use la opcin -s (silencio) para suprimir informacin innecesaria. Si el servidor mysqld est parado, debe usar la opcin --update-state para decirle a myisamchk que marque la tabla como 'comprobada'. Debe reparar slo las tablas en que myisamchk anuncia un error. Para estas tables, pase a la Etapa 2. Si obtiene errores extraos al hacer la comprobacin (tales como errores out of memory), o si myisamchk cae, pase a la Etapa 3. Etapa 2: Reparacin sencilla
325
Nota: Si quiere que una operacin de reparacin sea mucho ms rpida, debe cambiar los valores de las variables sort_buffer_size y key_buffer_size al 25% aproximado de la cantidad de memoria disponible al ejecutar myisamchk o isamchk. En primer lugar, intente myisamchk -r -q tbl_name (-r -q significa ``modod de recuperacin rpido''). Intenta reparar el fichero de indexacin sin tocar el fichero de datos. Si el fichero de datos contiene todo lo que debera y los vnculos de borrado apuntan a la localizacin correcta dentro del fichero de datos, esto debera funcionar, y la tabla estara reparada. Empiece a reparar la siguiente tabla. Si no es as, use el siguiente procedimiento: 1. Haga una copia de seguridad del fichero de datos antes de continuar. 2. Use myisamchk -r tbl_name (-r significa ``modo de recuperacin''). Esto elimina registros incorrectos y registros borrados del fichero de datos y recunstruye el fichero de indexacin. 3. Si el paso precedente falla, use myisamchk --safe-recover tbl_name. El modo de recuperacin seguro usa un mtodo de reucperacin antiguo que soporta algunos casos que los metodos normales de recuperacin no soportan (pero es ms lento). Si obtiene errores extraos al reparar (tales como errores out of memory ), o si myisamchk cae, pase a la Etapa 3. Etapa 3: Reparaciones complicadas Debe llegar a esta etapa slo si el primer bloque de 16KB en el fichero de indexacin est destruido o contiene informacin incorrecta, o si el fichero de indexacin no se encuentra. En este caso, es necesario crear un nuevo fichero de indexacin. Hgalo as: 1. Mueva el fichero de datos a una ubicacin segura. 2. Use el fichero descriptor de la tabla para crear unos ficheros de datos e indexacin nuevos (vacos):
shell> mysql> mysql> mysql> mysql db_name SET AUTOCOMMIT=1; TRUNCATE TABLE tbl_name; quit
Si su versin de MySQL no soporta TRUNCATE TABLE, use DELETE FROM tbl_name en su lugar. 3. Copie el antiguo fichero de datos otra vez sobre el nuevo fichero de datos (recin creado). (No se limite a mover el fichero antiguo sobre el nuevo; debe guardar una copia por si algo falla.) Vuelva a la Etapa 2. myisamchk -r -q debera funcionar. (Este no debera ser un bucle sin fin.) Puede usar REPAIR TABLE tbl_name USE_FRM, que realiza el proceso completo automticamente. Etapa 4: Reparaciones muy complicadas Debe llegar a esta etapa slo si el fichero de descripcin .frm ha tenido problemas. Esto no debera ocurrir nunca, ya que el fichero de descripcin nunca cambia una vez que la tabla se crea: 1. Restaure el fichero de descripcin desde una copia de seguridad y vuelva a la Etapa 3. Tambin puede restaurar el fichero ndice y volver a la Etapa 2. En este ltimo caso, puede comenzar con myisamchk -r. 2. Si no tiene una copia de seguridad pero sabe exactamente cmo se cre la tabla, cree una copia de la tabla en otra base de datos. Borre el nuevo fichero de datos, luego mueva los ficheros .frm de descripcin y .MYI de indexacin desde la otra base de datos a la base de datos que tiene problemas. Esto le da unos nuevos ficheros de descripcin e indexacin, pero deja el fichero de datos .MYD solo. Vuelva a la Etapa 2 y trate de reconstruir el fichero de indexacin.
326
Puede optimizar una tabla de la misma forma usando el comando SQL OPTIMIZE TABLE . OPTIMIZE TABLE realiza una reparacin de la tabla y un anlisis de las claves, y tambin ordena el rbol de ndices para obtener un mejor rendimiento en la bsqueda de claves. No hay posibilidad de interaccin no deseada entre una utilidad y el servidor, ya que el servidor hace todo el trabajo cuando usa OPTIMIZE TABLE. Consulte Seccin 13.5.2.5, Sintaxis de OPTIMIZE TABLE. myisamchk tiene una serie de opciones que puede usar para mejorar el rendimiento de una tabla: -S, --sort-index -R index_num, --sort-records=index_num -a, --analyze Para una descripcin completa de estas opciones, consulte Seccin 5.8.3.1, Sintaxis para invocar myisamchk.
Esto muestra informacin acerca de tablas que han fallado de forma que podemos examinarlas y repararlas cuando es necesario. Como no hemos tenido tablas que hayan fallado inesperadamente (tablas que se corrompen por razones distintas a fallos de hardware) durante un par de aos (esto es cierto), una vez a la semana es ms que suficiente para nosotros. Recomendamos que para empezar, ejecute myisamchk -s cada noche en todas la tablas que se hayan actualizado durante las ltimas 24 horas, hasta que confe en MySQL tanto como nosotros. Normalmente, las tablas MySQL necesitan poco mantenimiento. Si cambia las tablas MyISAM con registros de tamao dinmico (tablas con columnas VARCHAR, BLOB, o TEXT ) o tiene tablas con muchos registros borrados puede que quiera defragmentar/reaprovechar espacio de las tablas de vez en cuendo (una vez al mes?).
327
Puede hacerlo con OPTIMIZE TABLE en las tablas en cuestin. O, si puede parar el servidor mysqld por un rato, cambiando la localizacin al directorio de datos y usando este comando mientras el servidor est parado:
shell> myisamchk -r -s --sort-index -O sort_buffer_size=16M */*.MYI
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
328
Recover time: 1999-10-31 19:13:01 Status: checked Data records: 1403698 Deleted blocks: 0 Datafile parts: 1403698 Deleted data: 0 Datafile pointer (bytes): 3 Keyfile pointer (bytes): 3 Max datafile length: 3791650815 Max keyfile length: 4294967294 Recordlength: 226 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
Root Blocksize 15845376 1024 25062400 1024 40907776 1024 48097280 1024 55200768 1024 65145856 1024 75090944 1024 85036032 1024 96481280 1024
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
0% 50%
4 4
329
Key: 3: Keyblocks - check data record Key: 4: Keyblocks - check data record Key: 5: Keyblocks - check data record Key: 6: Keyblocks - check data record Key: 7: Keyblocks - check data record Key: 8: Keyblocks - check data record Key: 9: Keyblocks Total: Keyblocks
used: 97% references used: 99% references used: 99% references used: 99% references used: 99% references used: 99% references used: 98% used: 9%
Packed: index: 4 Packed: index: 5 Packed: index: 6 Packed: index: 7 Packed: index: 8 Packed: index: 9 Packed: Packed:
0% 60% 0% 0% 0% 0% 0% 17%
Max levels: Max levels: Max levels: Max levels: Max levels: Max levels: Max levels:
4 3 3 3 3 3 4
- check records and index references [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: 0% Blocks/Record: 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
Explicacin de los tipos de informacin que produce myisamchk se dan a continacin. ``Keyfile'' se refiere al fichero ndice. ``Record'' y ``row'' son sinnimos. MyISAM file(Fichero MyISAM) Nombre del fichero ndice MyISAM. File-version(Versin del fichero) Versin del formato MyISAM. Actualmente siempre es 2. Creation time(Fecha de creacin) Cuando se cre el fichero de datos. Recover time(Fecha de recuperacin) Cuando el fichero de ndices/datos se reconstruy por ltima vez. Data records(Fecha de recuperacin) Cuntos registros hay en la tabla. Deleted blocks(Bloques borrados) Cuntos bloques borrados todava tienen espacio reservado. Puede optimizar la tabla para minimizar este espacio. Consulte Seccin 5.8.3.10, Optimizacin de tablas. Datafile parts(Partes de ficheros de datos) Para el formato de registros dinmicos, indica cuntos bloques de datos hay. Para una tabla optimizada sin registros fragmentados, es lo mismo que Registros de datos. Deleted data(Datos borrados) Cuntos bytes hay de datos borrados sin reclamar. Puede optimizar la tabla para minimizar este espacio. Consulte Seccin 5.8.3.10, Optimizacin de tablas.
330
Datafile pointer(Puntero fichero de datos) El tamao del puntero del fichero de datos, en bytes. Normalmente es de 2, 3, 4, o 5 bytes. La mayora de tablas se administran con 2 bytes, pero MySQL no puede controlar esto todava. Para tablas arregladas, esta es la direccin de un registro. Para tablas dinmicas, es la direccin de un byte. Keyfile pointer(Puntero fichero de claves) El tamao del puntero del fichero ndice, en bytes. Normalmente es de 1, 2, o 3 bytes. La mayora de tablas se administran con 2 bytes, pero esto se calcula automticamente por MySQL. Siempre es la direccin de un bloque. Max datafile length(Mximo tamao fichero de datos) Cunto puede crecer el fichero de datos, en bytes. Max keyfile length(Mximo tamao fichero de claves) Cunto puede creceer el fichero ndice, en bytes. Recordlength(Tamao registro) El tamao de cada registro, en bytes. Record format(Formato de registro) El formato usado para almacenar registro de tablas. Los ejemplos precedentes usan Fixed length. Otros valores posibles son Compressed y Packed. table description(Descripcin de tabla) Una lista de todas las claves en la tabla. Para cada clave, myisamchk muestra alguna informacin a bajo nivel: Key(Clave) El nmero de esta clave. Start(Inicio) Dnde en el registro comienza esta parte del ndice. Len(Longitud) El tamao de esta parte del ndice. Para nmeros empaquetados, este debera ser siempre la longitud completa de la columna. Para cadenas de caracteres, podra ser menor que la longitud total de la columna indexada, ya que puede indexar un prefijo de una columna de cadenas de caracteres. Index(ndice) Si un valor clave puede existir mltiples veces en el ndice. Los valores son unique o multip. (mltiples). Type(Tipo) Qu tipo de datos tiene esta parte del ndice. Este es un tipo de datos MyISAM con las opciones packed, stripped, o empty. Root(Raz) Direccin del bloque ndice raz.
331
Blocksize(Tamao de bloque) El tamao de cada bloque de ndices. Por defecto es de 1024, pero el valor puede cambiar en tiempo de compilacin cuando MySQL se construye desde el cdigo fuente. Rec/key(Registros/clave) Este es un valor estadstico usado por el optimizador. Dice cuntos registros hay por valor para esta clave. Una clave nica siempre tiene un valor de 1. Puede actualizarse tras la carga de una tabla (o muy cambiada) con myisamchk -a. Si no se actualiza en absoluto, el valor por defecto es 30. Para la tabla mostrada en los ejemplos, hay dos lneas para table description (descripcin de tabla) para el noveno ndice. Esto indica que es un ndice de mltiples partes, en este caso con dos. Keyblocks used(Bloques de claves usados) Porcentaje de los bloques de clave usados. Cuando una tabla se ha reorganizad con myisamchk, como en los ejemplos, los valores son muy altos (muy cerca del mximo terico). Packed(Empaquetado) MySQL intenta empaquetar las claves con un sufijo comn. Slo puede usarse para ndices en columnas CHAR, VARCHAR . Para cadenas de caracteres largas que tienen partes izquierdas de la cadena similares, esto puede reducir significativamente el espacio usado. En el tercer ejemplo dado anteriomente, la cuarta clave tiene una longitud de 10 caracteres y se consigue una reduccin del 60% del espacio. Max levels(Nmero mximo de niveles) La profunidad del rbol-B para esta clave. Tablas grandes con valores de clave grandes obtienen valores altos. RecordsRegistros Nmero de registros en la tabla. M.recordlengthLongitud de registro media La media de la longitud de los registros. Este valor es la longitud de registro para tablas con registros de longitud fija, ya que todos los registros tienen la misma longitud. PackedEmpaquetado Espacios vacos al final de las cadenas de caracteres en MySQL. El valor Packed indica el porcentaje de ahorro conseguido haciendo un empaquetado. Recordspace usedEspacio de registro usado Porcentaje del fichero de datos usado. Empty spaceEspacio vaco Porcentaje del fichero de datos sin usar. Blocks/RecordBloques/Registro Nmero medio de bloques por registro (de cuntos enlaces se compone un registro fragmentado). Siempre es 1.0 para una tabla con formato fijo. Este valor debe estar tan cercano a 1.0 como sea posible. Si crece mucho, puede reorganizar la tabla. Consulte Seccin 5.8.3.10, Optimizacin de tablas.
332
RecordblocksBloques de registro Cuntos bloques (enlaces) se usan. Para formato fijo, esto es lo mismo que el nmero de registros. DeleteblocksBloques borrados Cuntos bloques (enlaces) estn borrados. RecorddataDatos de registro Cuntos bytes en el fichero de datos se usan. Deleted dataDatos borrados Cuntos bytes en el fichero de datos estn borrados (no usados). Lost spaceEspacio perdido Si un registro se actualiza a una longitudo ms pequea, se pierde algo de espacio. Este valor es la suma de todas estas prdidas, en bytes. LinkdataDatos enlazados Cuando se usa el formato de tabla dinmico, los fragmentos de registros se enlazan con punteros (de 4 a 7 bytes cada uno). Linkdata es la suma de la cantidad de almacenamiento usada por estos punteros. Si una tabla se ha comprimido con myisampack, myisamchk -d muestra informacin adicional acerca de cada columna de la tabla. Consulte Seccin 8.2, myisampack, el generador de tablas comprimidas de slo lectura de MySQL, para un ejemplo de esta informacin y una descripcin de lo que significa.
333
de caracteres por defecto. (Utilice la sentencia SHOW COLLATION para determinar qu colaciones estn disponibles para cada juego de caracteres.) Consulte Seccin 2.8.2, Opciones tpicas de configure. Si usted cambia el juego de caracteres cuando ejecuta MySQL, esto tambin podra cambiar la ordenacin. En consecuencia, debe ejecutar myisamchk -r -q --set-characterset=charset en todas sus tablas, o sus ndices podran no estar ordenados correctamente. Cuando un cliente se conecta a un servidor MySQL, el servidor indica al cliente cal es el juego de caracteres por defecto del servidor. El cliente se adapta entonces para utilizar este juego de caracteres en su conexin. Debera utilizar mysql_real_escape_string() cuando escape cadenas de caracteres para una sentencia SQL. mysql_real_escape_string() es idntica a la antigua funcin mysql_escape_string(), excepto que toma el identificador de conexin MYSQL como primer parmetro para que pueda tenerse en cuenta el juego de caracteres apropiado cuando se escapan caracteres. Si el cliente ha sido compilado con rutas diferentes a las del servidor que est instalado, y el usuario que configur MySQL no incluy todos los juegos de caracteres en el binario de MySQL, debe indicarle al cliente dnde puede encontrar los juegos de caracteres adicionales que necesita si el servidor ejecuta un juego de caracteres diferente. Puede hacerlo especificando la opcin --character-sets-dir para indicar la ruta al directorio donde se encuentra los juegos de caracteres dinmicos de MySQL. Por ejemplo, podra poner lo siguiente en un archivo de opciones:
[client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
Puede forzar a que el cliente utilice un juego de caracteres especfico de la siguiente manera:
[client] default-character-set=charset
O:
334
El nombre del idioma debe ser especificado en minsculas. Los archivos de idiomas estn almacenados (por defecto) en el directorio share/LANGUAGE bajo el directorio base de MySQL. Para cambiar el archivo de mensajes de error, debera editar el archivo errmsg.txt, y despus ejecutar el siguiente comando para generar el archivo errmsg.sys:
shell> comp_err errmsg.txt errmsg.sys
Si actualiza a una versin ms nueva de MySQL, recuerde repetir los cambios con el nuevo archivo errmsg.txt.
335
3. Mira uno de los archivos ctype-*.c existentes (por ejemplo strings/ctype-big5.c) para ver qu necesita definir. Tenga en cuenta que los arrays del archivo deben tener nombres como ctype_MYSET, to_lower_MYSET, y etc. Estos corresponden a los arrays para un juego de caracteres simple. Consulte Seccin 5.9.4, Los vectores de definicin de caracteres. 4. Cerca del inicio del archivo, ponga un comentario especial como este:
/* * This comment is parsed by configure to create ctype.c, * so don't change it unless you know what you are doing. * * .configure. number_MYSET=MYNUMBER * .configure. strxfrm_multiply_MYSET=N * .configure. mbmaxlen_MYSET=N */
El programa configure utiliza este comentario para incluir el juego de caracteres en la librera MySQL automaticamente. Las lneas strxfrm_multiply y mbmaxlen se explican en las siguientes secciones. Necesita incluirlas slo si necesita las funciones de colacin de cadenas de caracteres o de caracteres multi-bye, respectivamente. 5. Debera crear entonces alguna de las siguientes funciones: my_strncoll_MYSET() my_strcoll_MYSET() my_strxfrm_MYSET() my_like_range_MYSET() Consulte Seccin 5.9.5, Soporte para colacin de cadenas de caracteres. 6. Aada el nombre del juego de caracteres a las listas CHARSETS_AVAILABLE y COMPILED_CHARSETS en configure.in. 7. Reconfigure, recompile, y compruebe. El archivo sql/share/charsets/README incluye instrucciones adicionales. Si quiere que el juego de caracteres sea incluido en la distribucin MySQL, enve un parche a la lista de correo internals de MySQL. Consulte Seccin 1.6.1.1, Las listas de correo de MySQL.
sort_order[] es un mapa indicando cmo deberan ser ordenados los caracteres para comparacin y propsitos de ordenacin. Frecuentemente (pero no en todos los juegos de caracteres) este es idntico a to_upper[], lo que significa que la ordenacin es independiente de la capitalizacin. MySQL ordena caracteres basndose en los valores de los elementos de sort_order[]. Para reglas de ordenacin ms complicadas, consulte la explicacin de colacin de cadena de caracteres en Seccin 5.9.5, Soporte para colacin de cadenas de caracteres. ctype[] es un array de valores binarios, con un elemento para cada carcter. (Tenga en cuenta que to_lower[], to_upper[], y sort_order[] son idexados por valor del carcter, pero ctype[] es indexado por el valor del carcter + 1. Esto es una convencin antigua heredada para poder gestionar EOF.)
336
El valor de ctype[] para cada carcter debera ser la unin de los valors de mscara aplicables que describan al carcter. Por ejemplo, 'A' es un carcter en maysculas (_U) y tambin es un dgito hexadecimal (_X), as que ctype['A'+1] debera tener el valor:
_U + _X = 01 + 0200 = 0201
337
En este caso, debera obtener un nuevo archivo Index o bien aadir el nombre manualmente de cualquier juego de caracteres que falte en el archivo actual. Para las tablas MyISAM, puede comprobar el nombre del juego de caracteres y el nmero de una tabla con myisamchk -dvv tbl_name.
Zonas horarias por conexin. Cada cliente que se conecta tiene su propio ajuste de zona horaria, otorgado por la variable de sesin time_zone. Inicialmente esta es la misma que la variable global time_zone, pero puede reestablecerse con esta sentencia:
mysql> SET time_zone = timezone;
Los valores actuales de las zonas horarias globales y por conexin pueden consultarse as:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Los valores de timezone pueden darse como cadenas de caracteres indicando una variacin con respecto a UTC, como por ejemplo '+10:00' o '-6:00'. Si las tablas relativas a las zonas horarias han sido creadas y rellenadas, tambin puede utilizar zonas horarias por su nombre, como 'Europe/ Helsinki', 'US/Eastern', o 'MET'. El valor 'SYSTEM' indica que la zona horaria debera ser la misma que la del sistema. Los nombres de zonas horarias no distinguen capitalizacin (maysculas/ minsculas). El procedimiento de instalacin de MySQL crea las tablas de zonas horarias en la base de datos mysql, pero no las carga. Debe hacerlo usted manualmente. (Si est actualizando a MySQL 4.1.3 o superior desde una versin anterior, debe crear las tablas actualizando su base de datos mysql. Utilice las instrucciones que puede encontrar en Seccin 2.10.2, Aumentar la versin de las tablas de privilegios.) Si su sistema tiene su propia base de datos de informacin de zonas (el conjunto de archivos que describen zonas horarias), debera utilizar el programa mysql_tzinfo_to_sql para rellenar las tablas de zonas horarias. Ejemplos de esos sistemas son algunos como Linux, FreeBSD, Sun Solaris, y Mac OS X. Una localizacin probable para estos ficheros es el directorio /usr/share/ zoneinfo. Si su sistema no tiene una base de datos de informacin de zonas, puede utilizar un paquete descargable descrito ms adelante en esta seccin. El programa mysql_tzinfo_to_sql se utiliza para cargar las tablas de zonas horarias. En la lnea de comandos, pase la ruta del directorio de los archivos de informacin de zonas a mysql_tzinfo_to_sql y enve la salida al programa mysql. Por ejemplo:
shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
mysql_tzinfo_to_sql lee los archivos de zona horaria de su sistema y genera sentencias SQL a partir de ellos. mysql procesa esas sentencias y las carga en las tablas de zona horaria. mysql_tzinfo_to_sql tambin puede utilizarse para cargar un solo archivo de zona horaria.
338
Para cargar un solo archivo de zona horaria tz_file que corresponde a una zona horaria tz_name, invoque a mysql_tzinfo_to_sql de esta manera:
shell> mysql_tzinfo_to_sql tz_file tz_name | mysql -u root mysql
Si su zona horaria necesita tener en cuenta segundos de diferencia, inicialice la informacin sobre segundos de diferencia de esta manera, donde tz_file es el nombre de su archivo de zona horaria:
shell> mysql_tzinfo_to_sql --leap tz_file | mysql -u root mysql
Si su sistema no tiene una base de datos de informacin de zonas (por ejemplo, Windows o HP-UX), puede utilizar el paquete preconfigurado de tablas de zonas horarias que est disponible en http:// dev.mysql.com/downloads/timezones.html. Este paquete contiene los archivos .frm, .MYD, y .MYI para las tablas de zonas horarias MyISAM. Estas tablas deben pertenecer a la base de datos mysql, as que debe depositar los archivos en el subdirectorio mysql de su directorio de datos de MySQL. Debera apagar el servidor mientras hace esto. Cuidado! Por favor, no utilice el paquete descargable si su sistema ya tiene una base de datos de informacin de zonas. Utilice en cambio la utilidad mysql_tzinfo_to_sql. Si no es as, podra causar una diferencia en el manejo de fechas entre MySQL y otras aplicaciones de su sistema. Para informacin sobre los ajustes de zonas horarias en configuraciones de replicacin consulte Seccin 6.7, Caractersticas de la replicacin y problemas conocidos.
El registro de error Registra problemas encontrados iniciando, ejecutando, o parando mysqld. Registra las conexiones de clientes establecidas, y las sentencias ejecutadas. Registra las sentencias que cambian datos. Este registro est ya en desuso.
Registra todas las sentencias que cambian datos. Tambin utilizado para replicacin. Registra todas las sentencias que tardarn ms de long_query_time segundos en ejecutarse, o no utilizaron ndices.
Por defecto, todos los registros son creados en el directorio de datos de mysqld. Puede forzar a mysqld a que cierre y reabra los archivos de registro (o en algunos casos, cambiar a un nuevo registro) mediante el volcado de registros. El volcado de registros ocurre cuando ejecuta la sentencia FLUSH LOGS o el comando mysqladmin flush-logs or mysqladmin refresh. Consulte Seccin 13.5.5.2, Sintaxis de FLUSH. Si est utilizando las capacidades de replicacin de MySQL, los servidores esclavos de replicacin mantienen unos registros adicionales llamados registros relay. Estos se explican en Captulo 6, Replicacin en MySQL.
339
Si mysqld termina inesperadamente y mysqld_safe necesita reiniciarlo, mysqld_safe escribe un mensaje restarted mysqld en el registro de errores. Si mysqld se da cuenta de que hay una tabla que necesita ser automticamente comprobada o reparada, escribe un mensaje al registro de errores. En algunos sistemas operativos, el registro de errores contiene un volcado de la pila si mysqld muere. El volcado puede ser utilizado para determinar cuando mysqld muri. Consulte Seccin D.1.4, Usar stack trace. En MySQL 5.0, puede especificar dnde quiere que mysqld almacene el registro de errores con la opcin --log-error[=file_name]. Si no se proporciona ningn valor para file_name, mysqld utiliza el nombre host_name.err y escribe el archivo en el directorio de datos. Si ejecuta FLUSH LOGS, el registro de errores es renombrado con el sufijo -old y mysqld crea un nuevo archivo de registro. Si no especifica --log-error, o (en Windows) no utiliza la opcin --console, los errores se escriben en stderr, la salida estndar de erroes. Usualmente esto es su terminal. En Windows, la salida de errores es siempre escrita al archivo .err si no se especifica la opcin -console.
En Windows, no puede renombrar el archivo de registro mientras el servidor lo tiene abierto. Debe parar el servidor y renombrar el registro. Despus, reinicie el servidor para crear el nuevo registro.
340
El propsito principal del registro binario es el de actualizar la base de datos durante una operacin de recuperacin tan completamente como sea posible, porque el registro binario contiene todas las actualizaciones hechas tras la copia de seguridad. El registro binario tambin se utiliza en los servidores maestros de replicacin como recordatorio de las sentencias que deben ser enviadas a los servidores esclavos. Consulte Captulo 6, Replicacin en MySQL. Ejecutar el servidor con el registro binario activado hace que el rendimiento baje un 1%. An as, los beneficios del registro binario para las operaciones de restauracin y el hecho de permitirnos poder establecer replicacin generalmente son superiores a este decremento de rendimiento. Cuando se ha iniciado con la opcin --log-bin[=file_name] mysqld escribe un archivo de registro que contiene todos los comandos SQL que actualizan datos. Si no se da ningn valor para file_name, el valor por defecto es el nombre de la muqina host seguido por -bin. Si se da el nombre del archivo, pero ninguna ruta, el archivo se escribe en el directorio de datos. Se recomienda especificar un nombre de archivo, consulte Seccin A.8.4, Cuestiones abiertas en MySQL para ver el motivo. Si usted proporciona una extensin en el nombre del registro (por ejemplo, --logbin=file_name.extension), la extensin se ignora y elimina sin aviso. mysqld agraga una extensin numrica a el nombre del registro binario. Este nmero se incrementa cada vez que se inicia el servidor o se vuelcan los registros. Tambin se crea un nuevo registro binario cuando el actual llega al tamao especificado en max_binlog_size. Un registro binario puede llegar a ser ms grande de max_binlog_size si est utilizando transacciones grandes: Una transaccin se escribe en el registro de una sola pieza, nunca se parte entre diferentes registros. Para poder averiguar qu archivos de registro binario diferentes han sido utilizados, mysqld tambin crea un archivo de ndice de los registros binarios que contiene los nombres de todos los archivos de registro binario utilizados. Por defecto ste tiene el mismo nombre que el archivo de registro binario, con la extensin '.index'. Puede cambiar el nombre del archivo de ndice con la opcin --logbin-index[=file_name]. No debera editar este archivo manualmente mientras mysqld se est ejecutando; hacerlo podra confundir a mysqld. Puede borrar todos los archivos de registro binario con la sentencia RESET MASTER, o slo algunos de ellos con PURGE MASTER LOGS. Consulte Seccin 13.5.5.5, Sintaxis de RESET y Seccin 13.6.1, Sentencias SQL para el control de servidores maestros. El formato del registro binario tiene algunas limitaciones conocidas que pueden afectar a la recuperacin de copias de seguridad. Consulte Seccin 6.7, Caractersticas de la replicacin y problemas conocidos. El registro binario de procedimientos almacenados y disparadores se hace tal como se explica en Seccin 19.3, Registro binario de procedimientos almacenados y disparadores. Puede utilizar las siguientes opciones de mysqld para determinar lo que se registra en el registro binario. Vea tambin la explicacin que sigue a esta lista de opciones. --binlog-do-db=db_name Le dice al maestro que debera registrar los cambios en el registro binario si la base de datos actual (es decir, la que est seleccionada mediante USE) es db_name. Todos las otras bases de datos que no sean mencionadas explcitamente son ignoradas. Si utiliza esto, debera asegurarse de que slo hace cambios en la base de datos actual. Tenga en cuenta que hay una excepcin a esto en lo que respecta a las sentencias CREATE DATABASE, ALTER DATABASE, y DROP DATABASE, que utilizan la base de datos manipulada en vez de la actual para decidir si deberan registrar la sentencia. 341
Un ejemplo de algo que no funciona como podra esperarse: Si el servidor se inici con binlogdo-db=sales, y usted ejecuta USE prices; UPDATE sales.january SET amount=amount +1000;, esta sentencia no llega a escribirse en el registro binario. --binlog-ignore-db=db_name Le dice al maestro que las actualizaciones donde la base de datos actual (es decir, la que ha sido seleccionada mediante USE) es db_name no deberan ser almacenadas en el registro binario. Si utiliza esto, debera asegurarse de que solo hace actualizaciones en la base de datos actual. Un ejemplo de algo que no funciona como podra esperarse: Si el servidor se inici con binlogignore-db=sales, y ejecuta USE prices; UPDATE sales.january SET amount=amount +1000;, esta sentencia no se escribe en el registro binario. De la misma forma que en el caso de --binlog-do-db, hay una excepcin para las sentencias CREATE DATABASE, ALTER DATABASE, y DROP DATABASE, que utilizan la base de datos manipulada para decidir si deben registrar la sentencia, en vez de la base de datos actual. Para registrar o ignorar mltiples bases de datos, utilice mltiples opciones, especificando la opcin apropiada una vez para cada base de datos. Las reglas para registrar o ignorar actualizaciones en el registro binario son evaluadas de acuerdo a las siguientes normas. Tenga en cuenta que hay una excepcin para las sentencias CREATE DATABASE, ALTER DATABASE, y DROP DATABASE. En esos casos, la base de datos que est siendo creada, alterada, o eliminada reemplaza a la base de datos actual en las reglas siguientes. 1. Hay alguna regla binlog-do-db o binlog-ignore-db? No: Escribir la sentencia al registro binario y salir. S: Proceder al siguiente paso. 2. Hay algunas reglas (binlog-do-db o binlog-ignore-db o ambas). Hay una base de datos actual (ha sido seleccionada alguna base de datos mediante USE?)? No: No escribir la sentencia, y salir. S: Proceder al siguiente paso. 3. Hay una base de datos actual. Hay alguna regla binlog-do-db? S: Concuerda la base de datos con alguna de las reglas binlog-do-db? S: Escribir la sentencia y salir. No: No escribir la sentencia, y salir. No: Proceder al siguiente paso. 4. Hay alguna regla binlog-ignore-db. Concuerda la base de datos con alguna de las reglas binlog-ignore-db? S: No escribir la sentencia, y salir. No: Escribir la sentencia y salir. Por ejemplo, un esclavo ejecutndose con slo binlog-do-db=sales no escribe en el registro binario ninguna sentencia en la que la base de datos actual sea diferente de sales (es decir, a veces binlog-do-db puede significar ``ignora otras bases de datos''). Si est utilizando replicacin, debera no borrar los archivos de registros binarios viejos hasta que est seguro de que ningn esclavo los necesita. Una manera de averiguarlo es hacer mysqladmin
342
flush-logs una vez al da y borrar cualquier registro que tenga ms de tres das de antigedad. Puede borrarlos manualmente, o mejor an mediante PURGE MASTER LOGS (consulte Seccin 13.6.1, Sentencias SQL para el control de servidores maestros), que adems tambin actualiza de manera segura el archivo de ndice de registros binarios (y que puede recibir parmetros de fecha). Un cliente con el privilegio SUPER puede desactivar el registro binario de sus propias sentencias utilizando una sentencia SET SQL_LOG_BIN=0. Consulte Seccin 13.5.3, Sintaxis de SET. Puede examinar el archivo de registro binario con la utilidad mysqlbinlog. Esto podra ser til cuando usted quiera reprocesar sentencias almacenadas en el registro. Por ejemplo, puede actualizar un servidor MySQL desde el registro binario de la siguiente manera:
shell> mysqlbinlog log-file | mysql -h server_name
Consulte Seccin 8.5, La utilidad mysqlbinlog para registros binarios para obtener ms informacin sobre la utilidad mysqlbinlog y su utilizacin. Si usted est utilizando transacciones, debera utilizar el registro binario de MySQL para hacer las copias de seguridad, en vez del antiguo registro de actualizaciones. El registro binario se hace inmediatamente despus de que se completa una consulta, pero antes de que se libere cualquier bloqueo o se haga ningn commit. Esto asegura que el registro est almacenado en el orden de ejecucin. Las actualizaciones a las tablas no-transaccionales se almacenan en el registro binario inmediatamente despus de su ejecucin. Para las tablas transaccionales como las tablas BDB o InnoDB, todas las actualizaciones (UPDATE, DELETE, o INSERT) que cambian alguna tabla son almacenadas en cache hasta que se recibe una sentencia COMMIT en el servidor. En ese momento mysqld escribe la transaccin completa al registro binario antes de que se ejecute el COMMIT. Cuando el flujo de ejecucin que gestiona la transaccin comienza, reserva un buffer de tamao binlog_cache_size para almacenar consultas. Si una sentencia es ms grande de esto, el flujo abre un archivo temporal para almacenar la transaccin. El archivo temporal se borra cuando acaba el flujo. La variable de estado Binlog_cache_use muestra el nmero de transacciones que han utilizado este buffer (y posiblemente un archivo temporal) para almacenar sentencias. La variable de estado Binlog_cache_disk_use muestra cuantas de esas transacciones llegaron realmente a utilizar un archivo temporal. Estas dos variables pueden utilizarse para establecer el valor de binlog_cache_size y evitar el uso de archivos temporales. El tamao max_binlog_cache_size (por defecto 4GB) se puede utilizar para restringir el tamao total utilizado para almacenar una transaccin con mltiples sentencias. Si una transaccin es ms grande que esto, falla y se hace un rollback. Si usted est utilizando el registro de actualizaciones o el binario, las inserciones concurrentes se convierten a inserciones normales cuando se utiliza CREATE ... SELECT o INSERT ... SELECT. Esto se hace as para asegurarse de que se puede reconstruir una copia exacta de sus tablas aplicando los registros a una copia de seguridad. Tenga en cuenta que el formato del registro binario es diferente en MySQL 5.0 al de versiones anteriores de MySQL, debido a mejoras en la replicacin. Consulte Seccin 6.5, Compatibilidad entre versiones de MySQL con respecto a la replicacin. Por defecto, el registro binario no se sincroniza con el disco en cada escritura. As que si el sistema operativo o la mquina (no nicamente el servidor MySQL) falla, existe la posibilidad de que las ltimas sentencias del registro binario se pierdan. Para prevenir esto, puede hacer que el registro binario se sincronice con el disco tras cada N escrituras, con la variable global sync_binlog (siendo 1 el valor ms seguro, pero tambin el ms lento). Consulte Seccin 5.3.3, Variables de sistema del servidor. An con el valor de sync_binlog establecido en 1, existe una posibilidad de que haya una inconsistencia entre las tablas y el registro binario en el caso de fallo. Por ejemplo, si est utilizando
343
tablas InnoDB, y el servidor MySQL procesa una sentencia COMMIT, escribe la transaccin completa al registro binario, y despus la enva a InnoDB. Si el fallo se produce entre estas dos operaciones, al reiniciar la transaccin es rechazada por InnoDB, pero todava existe en el registro binario. Este problema puede resolverse con la opcin --innodb-safe-binlog, que aade consistencia entre el contenido de las tablas InnoDB y el registro binario. Para que esta opcin proporcione un grado mayor de seguridad, el servidor MySQL debe estar tambin configurado para sincronizar a disco, en cada transaccin, el registro binario (sync_binlog=1) y (lo que es cierto por defecto) los registros InnoDB. El efecto de esta opcin es que al reiniciar tras un fallo, o tras hacer un rollback de transacciones, el servidor MySQL elimina las transacciones InnoDB que han sufrido una cancelacin del registro binario. Esto asegura que el registro binario refleje los datos exactos que hay en las tablas InnoDB y, as, el esclavo permanece sincronizado con el maestro (no recibe una sentencia que ha sido cancelada). Tenga en cuenta que --innodb-safe-binlog se puede utilizar an cuando el servidor MySQL actualice otros motores de almacenamiento que no sean InnoDB. Slo las sentencia/transacciones que afecten a tablas InnoDB son candidatas a ser eliminadas del registro binario durante la recuperacin de un fallo de InnoDB. Si durante la recuperacin el servidor MySQL descubre que el registro binario es ms corto de lo que debera ser (es decir, le falta al menos una transaccin InnoDB realizada con xito), lo que no debera ocurrir con sync_binlog=1 y el disco/sistema de archivos hace una sincronizacin real cuando se le pide (algunos no lo hacen), muestra un mensaje de error ("The binary log <name> is shorter than its expected size"). En este caso el registro binario no es correcto, y la replicacin debera reiniciarse desde una nueva imagen de los datos del maestro. La escrituras al archivo del registro binario y al de ndice de registros son gestionados de la misma manera que las escrituras a las tablas MyISAM. Consulte Seccin A.4.3, Cmo se comporta MySQL ante un disco lleno.
344
345
--socket controla la ruta del archivo socket de Unix y el nombre de la named pipe en Windows. En Windows, es necesario especificar diferentes nombres de pipe solo para los servidores que soporten conexiones mediante named pipe. --shared-memory-base-name=name Esta opcin, actualmente, se utiliza slo en Windows. Designa el nombre de memoria compartida utilizado por un servidor Windows para permitir a los clientes conectarse mediante memoria compartida. --pid-file=path Esta opcin se utiliza nicamente en Unix. Indica el nombre del archivo en el que el servidor escribe su ID de proceso. Si utiliza las siguientes opciones de archivo de registro, deben ser diferentes para cada servidor: --log=path --log-bin=path --log-update=path --log-error=path --bdb-logdir=path Las opciones de archivo de registro se explican en Seccin 5.10.5, Mantenimiento de ficheros de registro (log). Para un mejor rendimiento, puede especificar las siguientes opciones a cada servidor, de manera que se distribuya la carga entre discos fsicos: --tmpdir=path --bdb-tmpdir=path Tener diferentes directorios temporales tambin es una buena prctica, para hacer ms fcil determinar qu servidor MySQL cre cualquier archivo temporal. Generalmente, cada servidor debera utilizar un directorio de datos diferente, lo que se especifica con la opcin --datadir=path. Atencin: Normalmente no debera tener dos servidores que actualicen los datos de la misma base de datos. Esto podra llevar a obtener sorpresas indeseadas si su sistema operativo no tiene soporte para bloqueos sin posibilidad de fallo. Si (a pesar de este aviso) ejecuta mltiples servidores que utilicen el mismo directorio de datos y tienen el registro activado, debera utilizar las opciones adecuadas para especificar nombres de archivos de registro que sean nicos para cada servidor. De otra manera, lo servidores intentan registrar en los mismos archivos. Por favor, tengan cuenta que este tipo de configuracin slo funciona con tablas MyISAM y MERGE, y no con ningn otro de los motores de almacenamiento. Este aviso en contra de compartir un directorio de datos entre servidores tambin se aplica en entornos NFS. Permitir que mltiples servidores MySQL accedan a un directorio comn es una muy mala idea. El principal problema es que NFS es un cuello de botella de velocidad. No est diseado para un uso tal. Otro riesgo con NFS es que tiene que encontrar una manera de asegurarse que dos o ms servidores no se interfieran unos con otros. Usualmente, el bloqueo de archivos de NFS est
346
gestionado por el demonio lockd, pero de momento no hay ninguna plataforma que realice bloqueos 100% seguros en todas las situaciones. Faciltese las cosas: Olvdese de compartir un directorio de datos entre servidores sobre NFS. Una solucin mejor es tener una mquina que tenga diferentes CPUs y utilizar un sistema operativo que gestione los hilos de ejecucin eficientemente. Si tiene mltiples instalaciones de MySQL en diferentes lugares, normalmente puede especificar el directorio base de instalacin para cada uno con la opcin --basedir=path, de manera que cada servidor utilice un directorio de datos, archivo de registro, y archivo de PID diferentes. (Los valores por defecto de todos ellos son determinados en relacin al directorio base). En ese caso, las nicas opciones adicionales que necesita especificar son las opciones --socket y --port. Por ejemplo, suponga que debe instalar diferentes versiones de MySQL utilizando distribuciones binarias en archivos tar. Se instalan en diferentes lugares, as que puede iniciar el servidor de cada instalacin utilizando el comando bin/mysqld_safe bajo su correspondiente directorio base. mysqld_safe determina la opcin --basedir apropiada para pasarle a mysqld, y usted slo necesita especificar las opciones --socket y --port a mysqld_safe. Tal como se explica en las siguientes secciones, es posible iniciar servidores adicionales mediante el establecimiento de sus variables de entorno, o especificando opciones de lnea de comandos apropiadas. An as, si necesita ejecutar servidores mltiples de manera permanente, es ms conveniente utilizar archivos de opciones para especificar a cada servidor las opciones que deben ser nicas para l.
347
En NT, cada servidor arranca en primer plano (no aparece un nuevo prompt hasta que acaba el servidor); necesitar ejectura estos dos comandos en una consola separada. Para parar los servidores, debe conectarse al puerto apropiado:
C:\> C:\mysql\bin\mysqladmin --port=3307 shutdown C:\> C:\mysql\bin\mysqladmin --port=3308 shutdown
Los servidores configurados tal y como se ha descrito permiten a los clientes la conexin mediante TPC/IP. Si su versin de Windows soporta named pipes y quiere permitir este tipo de conexiones, use los servidores mysqld-nt o mysqld-max-nt y especifique opiones que permitan la named pipe y especifique su nombre. Cada servidor que soporte conexiones mediante named pipes debe usear un nombre nico. Por ejemplo, el fichero C:\my-opts1.cnf puede escribirse as:
[mysqld] datadir = C:/mydata1 port = 3307 enable-named-pipe socket = mypipe1
348
Basndonos en la informacin precedente, hay varias formas de inicializar mltiples servicios. Las siguientes instrucciones describen algunos ejemplos. Antes de probar cualquiera de ellos, asegrese que apaga y elimina cualquier servicio MySQL antes de nada. Aproximacin 1: Espeficique las opciones para todos los servicios en uno de los ficheros de opciones . Para ello, use un nombre de servicio distinto para cada servidor. Suponga que quiere ejecutar mysqld-nt 4.1.8 usando el nombre de servicio de mysqld1 y mysqld-nt 5.0.7 usando el nombre de servicio mysqld2. En ese caso, puede usar el grupo [mysqld1] para 4.1.8 y el grupo [mysqld2] para 5.0.7. Por ejemplo, puede rellenar C:\my.cnf as:
# options for mysqld1 service [mysqld1] basedir = C:/mysql-4.1.8 port = 3307 enable-named-pipe socket = mypipe1 # options for mysqld2 service [mysqld2] basedir = C:/mysql-5.0.7 port = 3308 enable-named-pipe socket = mypipe2
Instale los servicios como se describe a continuacin, usando las rutas completas de los servidores para asegurarse que Windows registra el programa ejecutable correcto para cada servicio:
C:\> C:\mysql-4.1.8\bin\mysqld-nt --install mysqld1 C:\> C:\mysql-5.0.7\bin\mysqld-nt --install mysqld2
Para arrancar los servicios, use el administrador de servicios, o use NET START con los nombres de servicio apropiados:
C:\> NET START mysqld1 C:\> NET START mysqld2
Para parar los servicios, use el administrador de servicios, o use NET STOP con el nombre de servicio apropiado:
C:\> NET STOP mysqld1 C:\> NET STOP mysqld2
Aproximacin 2: Especifique opciones para cada servidor en ficheros separados y use -defaults-file cuando instale los servicios para decirle a cada servidor que fichero usar. En ese caso, cada fichero debe listar las opciones en el grupo [mysqld]. Con esta aproximacin, para especificar opciones para mysqld-nt 4.1.8, cree un fichero C:\myopts1.cnf como se muestra a continuacin:
[mysqld] basedir = C:/mysql-4.1.8 port = 3307 enable-named-pipe socket = mypipe1
Instale los servicios como se muestra (introduzca cada comando en una lnea distinta):
C:\> C:\mysql-4.1.8\bin\mysqld-nt --install mysqld1 --defaults-file=C:\my-opts1.cnf
349
Para usar la opcin --defaults-file cuando instale un servidor MySQL como servicio, debe preceder la opcin con el nombre de servicio. Tras instalar los servicios, arranque y prelos igual que en el ejemplo precedente. Para eliminar mltiples servicios, use mysqld --remove para cada uno, especificando un nombre de servicio con la opcin --remove a continuacin. Si el nombre de servicio es el nombre por defecto (MySQL), puede omitirlo.
Aqu, port_number y file_name deben ser distintos del puerto TPC/IP por defecto y de la ruta del fichero socket Unix, y el valor --prefix debe especificar un fichero de instalacin distinto del que hay donde MySQL se ha instalado por defecto. Si tiene un servidor MySQL escuchando en un puerto dado, puede usar el siguiente comando para encontrar que parmetros est usando para algunas importantes variables de configuracin, incluyendo el directorio base y el nombre del fichero socket Unix:
shell> mysqladmin --host=host_name --port=port_number variables
Con la informacin mostrada por este comando, puede decir los valores de las opciones que no debe usar para configurar un servidor adicional. Tenga en cuenta que si especifica localhost como nombre de equipo, el comportamiento por defecto de mysqladmin es usar una conexin mediante un fichero socket Unix en lugar de TCP/IP. A partir de MySQL 4.1 , puede especificar explcitamente el protocolo de conexin a usar usando la opcin --protocol={TCP | SOCKET | PIPE | MEMORY}. No tiene que compilar un nuevo servidor MySQL para arrancar con un fichero socket Unix distinto o con otro puerto TCP/IP. Tambin es posible especificar estos valores en tiempo de ejecucin. Una forma de hacerlo es usando opciones por lneas de comandos:
shell> mysqld_safe --socket=file_name --port=port_number
Para arrancar un segundo servidor, proporcione distintas opciones para --socket y --port option , e incluya la opcin --datadir=path para mysqld_safe de forma que el servidor use un directorio de datos distinto. Otra forma de conseguir un efecto similar es usar variables de entorno para inicializar el nombre de fichero socket Unix y el puerto TCP/IP:
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock shell> MYSQL_TCP_PORT=3307 shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
350
Hay una forma rpida de arrancar un segundo servidor para hacer pruebas. Lo bueno de este mtodo es que los cambios en las variables de entorno se aplican a cualquier programa cliente que invoque desde la misma consola. As, las conexiones de dichos clientes se redireccionan automticamente al segundo servidor! Apndice E, Variables de entorno incluye una lista de otras variables de entorno que puede usar para afectar a mysqld. Para ejecucin automtica del servidor, el script de arranque que se ejecuta al arrancar debe ejecutar el siguiente comando una vez para cada servidor con la ruta apropiada del fichero de opciones para cada comando:
mysqld_safe --defaults-file=path
Cada fichero de opciones debe contener valores especficos para un servidor dado. En Unix, el script mysqld_multi es otra forma de arrancar mltiples servidores. Consulte Seccin 5.1.5, El programa mysqld_multi para gestionar mltiples servidores MySQL.
351
Consulte Seccin 24.4, La API Perl de MySQL. Otras interfaces de programacin pueden proporcionar funcionalidad similar para leer ficheros de opciones.
Las consultas deben ser exactamenten las mismas (byte a byte) para se consideradas idnticas. Adems, las consultas que son idnticas pueden tratarse como diferentes por otras razones. Las consultas que usan distintas bases de datos, distintas versiones de protocolo, o distintos conjuntos de caracteres se consideran distintas consultas y se cachean por separado.
352
Antes que una consulta se guarde en la cache de consultas, MySQL comprueba que el usuario tenga permisos de SELECT para todas las bases de datos y tablas involucradas. Si no es el caso, el resultado cacheado no se usa. Si un resultado de consulta se retorna desde la cach de consultas, el servidor incrementa la variable de estado Qcache_hits, no Com_select. Consulte Seccin 5.12.4, Estado y mantenimiento de la cach de consultas. Si una tabla cambia, entonces todas las consultas cacheadas que usen esa tabla pasan a ser invlidas y se eliminan de la cach.Esto incluye consultas que usen tablas MERGE que mapeen las tablas cambiadas. Una tabla puede cambiarse por varios tipos de comandos, tales como INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, o DROP DATABASE. Las tablas transaccionales InnoDB que se han cambiado se invalidan cuando se realiza un COMMIT. En MySQL 5.0, la cach de consultas tambin funciona dentro de transacciones cuando se usa tablas InnoDB ,haciendo uso del nmero de versin para detectar si sus contenidos han cambiado. En MySQL 5.0, las consultas generadas por vistas se cachean. En MySQL 5.0.3 se resolvi un problema con los resultados en la cach de consultas generados por vistas que no se invalidaban apropiadamente tras algunas operaciones en dichas vistas. Consulte Seccin C.1.9, Cambios en la entrega 5.0.3 (23 Mar 2005: Beta). Antes de MySQL 5.0, una consulta que empezase con un comentario poda cachearse, pero no poda obtenerse de la cach. Este problema est resuelto en MySQL 5.0. La cach de consultas funciona para consultas del tipo SELECT SQL_CALC_FOUND_ROWS ... y SELECT FOUND_ROWS(). FOUND_ROWS() devuelve el valor correcto incluso si la consulta precedente se obtuvo de la cache debido a que el nmero de registros encontrados tambin se almacena en la cach. Una consulta no puede cachearse si contiene cualquiera de las siguientes funciones: BENCHMARK() CURRENT_DATE() CURTIME() FOUND_ROWS() LOAD_FILE() RAND() UNIX_TIMESTAMP() sin parmetros CONNECTION_ID() CURRENT_TIME() DATABASE() GET_LOCK() MASTER_POS_WAIT() RELEASE_LOCK() USER() CURDATE() CURRENT_TIMESTAMP() ENCRYPT() con un parmetro LAST_INSERT_ID() NOW() SYSDATE()
Una consulta tampoco se cachea bajo las siguientes condiciones: Se refiere a funciones definidas por el usuario (UDFs). Se refiere a variables de usuario. Se refiere a las tablas en la base de datos del sistema mysql . Es cualquiera de las siguientes formas:
SELECT SELECT SELECT SELECT SELECT ... IN SHARE MODE ... FOR UPDATE ... INTO OUTFILE ... ... INTO DUMPFILE ... * FROM ... WHERE autoincrement_col IS NULL
La ltima forma no se cachea ya que se usa como solucin de ODBC para obtener el ltimo ID insertado. Consulte Seccin 25.1.6.1.1, Obtaining Auto-Increment Values.
353
Se us como comando preparado, incluso sin emplear marcadores. Por ejemplo, la consulta usada aqu:
char *my_sql_stmt = "SELECT a, b FROM table_c"; /* ... */ mysql_stmt_prepare(stmt, my_sql_stmt, strlen(my_sql_stmt));
no se cachea. Consulte Seccin 24.2.4, Sentencias preparadas de la API C. Usa tablas TEMPORARY. No usa ninguna tabla. El usuario tiene permisos a nivel de columan para cualquiera de las tablas involucradas.
Cuando se usa un binario MySQL 5.0 estndar, este valor siempre es YES, incluso si el cacheo de consultas est desactivado. Muchas otras variables de sistema controlan las operaciones de la cach de consultas. Pueden especificarse en un fichero de opciones o en la lnea de comandos al arrancar mysqld. Todas las variables de sistema de la cach de consultas tienen nombres que empiezan con query_cache_. Se describen brevemente en Seccin 5.3.3, Variables de sistema del servidor, con informacin adicional de configuracion dada aqu. Para especificar el tamao de la cach de consulta, inicialice la variable de sistema query_cache_size. Ponerla a 0 desactiva la cach de consultas. El tamao por defecto es 0; esto es, que est desactivada. Si el tamao de la cach de consultas es mayor que 0, la variable query_cache_type influye en su funcionamiento. Esta variable puede tener los siguientes valores: Un valor de 0 o OFF evita cachear o recibir valores cacheados. Un valor de 1 o ON permite el cacheo excepto para aquellos comandos que empiecen con SELECT SQL_NO_CACHE.
354
Un valor de 2 o DEMAND provoca el cacheo de slo los comandos que empiecen con SELECT SQL_CACHE. Inicializar con el valor GLOBAL la variable query_cache_type determina el comportamiento de la cach de consultas para todos los clientes que se conecten tras el cambio. Cada clientes puede controlar el comportamiento de la cach para su propia conexin meidante el valor SESSION de query_cache_type. Por ejemplo, un cliente puede desactivar el uso de la cach de consultas para sus propias consultas as:
mysql> SET SESSION query_cache_type = OFF;
Para controlar el tamao mximo de resultados de consultas individuales que pueden cachearse, inicialice la variable query_cache_limit variable. El valor por defecto es 1MB. Cuando se cachea una consulta, su resultado (los datos que se envan al cliente) se guardan en la cach a medida que se reciben. Por lo tanto los datos normalmente no se guardan en un gran paquete. La cach reserva bloques para guardar estos datos bajo demanda, as que cuando se llena un bloque, se prepara un nuevo bloque. Puesto que la reserva de memoria es una operacin costosa (lenta), la cach de consultas reserva bloques con un tamao mnimo dado por la variable de sistema query_cache_min_res_unit. Cuando la consulta queda ejecutada, el ltimo bloque de resultados se ajusta a su tamao real para liberar la memoria no usada. En funcin del tipo de consulta que ejecute el servidor, puede encontrar til cambiar el valor de query_cache_min_res_unit: El valor por defecto de query_cache_min_res_unit es 4KB. Debera ser un valor adecuado para la mayora de los casos. Si tiene muchas consultas con resultados pequeos, el tamao por defecto del bloque puede llevar a fragmentacin de memoria, que se evidencia con un alto nmero de bloques libres. La fragmentacin puede obligar a la cach a borrar consultas por falta de memoria. En este caso, debe decrementar el valor de query_cache_min_res_unit. El nmero de bloques libres y de consultas borradas debido a falta de espacio se da en las variables Qcache_free_blocks y Qcache_lowmem_prunes. Si la mayora de las consultas tienen resultados grandes (compruebe las variables de estado Qcache_total_blocks y Qcache_queries_in_cache ), puede incrementar el rendimiento incrementando query_cache_min_res_unit. Sin embargo, tenga cuidado de no hacerlo demasiado grande (consulte el punto anterior).
Puede defragmentar la cach de consultas para mejor uso de esta memoria con el comando FLUSH QUERY CACHE . El comando no elimina ninguna consulta de la cach. El comando RESET QUERY CACHE elimina todos los resultados de consultas de la cach de consultas. El comando FLUSH TABLES tambin lo hace. Para monitorizar el rendimiento de la cach de consultas, use SHOW STATUS para ver las variables de estado de la cach:
mysql> SHOW STATUS LIKE 'Qcache%'; +-------------------------+--------+ | Variable_name | Value |
355
+-------------------------+--------+ | 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 | +-------------------------+--------+
Las descripicones de estas variables se dan en Seccin 5.3.4, Variables de estado del servidor. Algunos de sus usos se describen aqu. El nmero total de consultas SELECT es igual a:
Com_select + Qcache_hits + consultas con errores detectados por el parser
La cach de consultas usa bloques de tamao variable, as que Qcache_total_blocks y Qcache_free_blocks pueden indicar fragementacin de memoria de la cach. Tras FLUSH QUERY CACHE, slo queda un bloque de memoria libre. Cada consulta cacheada requiere como mnimo dos bloques (uno para el texto de la consulta y otro o ms para el resultado de la misma). Adems, cada tabla utilizada por una consulta requiere un bloque. Sin embargo, si dos o ms consultas usan la misma tabla, slo se reserva un bloque. La informacin proporcionada por la variable de estado Qcache_lowmem_prunes puede ayudarle a ajustar el tamao de la cach de consultas. Cuenta el nmero de consultas que se han eliminado de la cach para liberar memoria con el fin de cachear nuevas consultas. La cach de consultas usa una estrategia de resultado usado menos recientemente (LRU, siglas en ingls de least recently used) para decidir qu consultas eliminar de la cach. Ms informacin para afinar las variables en Seccin 5.12.3, Configuracin de la cach de consultas.
356
Las capacidades de replicacin que permiten a las bases de datos de un servidor MySQL ser duplicadas en otro se introdujeron en MySQL 3.23.15. Este captulo describe las caractersticas de replicacin proporcionadas por MySQL . Presenta conceptos de replicacin, muestra cmo preparar servidores de replicacin, y sirve como referencia para las opciones de replicacin disponibles. Tambin proporciona una lista de preguntas frecuentes (con respuestas), y consejos para resolver problemas. Para una descripcin de la sintaxis de comandos SQL relacionados con replicacin, consulte Seccin 13.6, Sentencias de replicacin. Sugerimos que visite nuestra pgina web http://www.mysql.com frecuentemente as como que chequee para revisiones de este captulo. La replicacin est siendo mejorada constantemente, y actualizamos frecuentemente el manual con la informacin ms actual.
357
La robustez se incrementa con un escenario maestro/esclavo. En caso de problemas con el maestro, puede cambiar al esclavo como copia de seguridad. Puede conseguirse un mejor tiempo de respuesta dividiendo la carga de consultas de clientes a procesar entre los servidores maestro y esclavo. Se puede enviar consultas SELECT al esclavo para reducir la carga de proceso de conultas del maestro. Sin embargo, las sentencias que modifican datos deben enviarse siempre al maestro, de forma que el maestro y el esclavo no se desincronicen. Esta estrategia de balanceo de carga es efectiva si dominan consultas que no actualizan datos, pero este es el caso ms habitual. Otro beneficio de usar replicacin es que puede realizar copias de seguridad usando un servidor esclavo sin molestar al maestro. El maestro contina procesando actualizaciones mientras se realiza la copia de seguridad. Consulte Seccin 5.8.1, Copias de seguridad de bases de datos.
358
identificarse como el flujo Binlog Dump en la salida de SHOW PROCESSLIST en el maestro. El flujo de entrada/salida del esclavo lee lo que el flujo Binlog Dump del maestro enva y copia estos datos en ficheros locales, llamados logs retardados, en el directorio de datos del esclavo. El tercer flujo es el flujo SQL, que crea el esclavo para leer los logs retardados y para ejecutar las actualizaciones que contiene. En la descripcin precedente, hay tres flujos por esclavo. Un maestro que tiene varios esclavos crea un flujo para cada esclavo conectado; cada esclavo tiene sus propios flujos de entrada/salida y SQL. Leer dos comandos y ejecutarlos se divide en dos tareas independientes. La tarea de leer comandos no se ralentiza si la ejecucin es lenta. Por ejemplo, si el servidor esclavo no ha estado en ejecucin durante un periodo de tiempo, su flujo de entrada/salida puede tratar rpidamente todos los contenidos del log binario del maestro cuando arranca el esclavo, incluso si el flujo SQL se realentiza mucho. Si el esclavo para antes que el flujo SQL haya ejecutado todos los comandos tratados, el flujo de entrada/ salida ha tratado todo de forma que hay una copia de los comandos almacenada localmente en los logs retardados, preparados para ejecutarse la siguiente vez que arranque el esclavo. Esto permite que se purguen los logs binarios del maestro, ya que no necesita esperar que los esclavos traten sus contenidos. El comando SHOW PROCESSLIST proporciona informacin que le dice qu est ocurriendo en el maestro y en el esclavo teniendo en cuenta la replicacin. El siguiente ejemplo ilustra cmo los tres flujos se muestran en SHOW PROCESSLIST. En el servidor maestro, la salida de SHOW PROCESSLIST tiene este aspecto:
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
Aqu, el flujo 2 es un flujo de replicacin para un esclavo conectado. La informacin indica que todas las actualizaciones se han enviado al esclavo y que el maestro est esperando ms actualizaciones. En el servidor esclavo, la salida para SHOW PROCESSLIST tiene este aspecto:
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
Esta informacin indica que el flujo 10 es el flujo de entrada/salida que se comunica con el maestro, y el flujo 11 es el flujo SQL que procesa las actualizaciones almacenadas en los logs retardados. Cuando se ejecuta SHOW PROCESSLIST ambos flujos estaban en espera de actualizaciones nuevas.
359
Tenga en cuenta que los valores en la columna Time pueden mostrar la diferencia de tiempo en la comparacin del esclavo con el maestro. Consulte Seccin 6.9, Preguntas y respuestas sobre replicacin.
360
El flujo est tratando de reconectar con el maestro. Waiting for master to send event El flujo ha conectado con el maestro y est esperando a que lleguen los eventos del log binario. Esto puede tardar un tiempo largo si el maestro est en espera. Si la espera dura slave_read_timeout segundos, se produce un timeout. En este punto, el flujo considera la conexin rota e intenta reconectar. Queueing master event to the relay log El flujo ha ledo un evento y lo est copiando en el log retardado para que el flujo SQL pueda procesarlo. Waiting to reconnect after a failed master event read Un error ocurre durante la lectura (debido a una desconexin). El flujo duerme durante masterconnect-retry segundos antes de intentar reconectar. Reconnecting after a failed master event read El flujo trata de reconectar con el maestro. Cuando la conexin se vuelve a establecer, el estado pasa a Waiting for master to send event. Waiting for the slave SQL thread to free enough relay log space Est usando un valor relay_log_space_limit distinto a cero, y el log retardado ha crecido hasta que su tamao combinado escede este valor. El flujo de entrada/salida est en espera hasta que el flujo SQL libera suficiente espacio procesando los contenidos del log retardado de forma que pueda leer algunos ficheros de log retardado. Waiting for slave mutex on exit Estado que ocurre brevemente al parar el flujo.
361
unso en un fichero ndice. El nombre del ndice del log retardado por defecto es host_name-relaybin.index. Por defecto, estos ficheros se crean en el directorio de datos del esclavo. Por defecto los nombres de fichero pueden cambiarse con las opciones de servidor --relay-log y --relay-logindex . Consulte Seccin 6.8, Opciones de arranque de replicacin. Los logs retardados tienen el mismo formato que los logs binarios, y pueden leerse usando mysqlbinlog. Un log retardado se borra automticamente por el flujo SQL en cuanto ha ejecutado todos sus eventos y no los necesita ms. No hay mecanismo explcito para borrar logs retardados, ya que el flujo SQL se encarga de ello. Sin embargo, FLUSH LOGS rota los logs retardados, lo que influye cuando el flujo SQL los borra. Un log retardado se crea bajo las siguientes condiciones: En MySQL 5.0, se crea un nuevo log retardado cada vez que arranca el flujo de entrada/salida. Cuando los logs se vuelcan; por ejemplo, con FLUSH LOGS o mysqladmin flush-logs. Cuando el tamao del log retardado actual es demasiado grande. El significado de "muy grande" se determina as: max_relay_log_size, si max_relay_log_size > 0 max_binlog_size, si max_relay_log_size = 0 Un servidor esclavo de replicacin crea dos pequeos ficheros adicionales en el directorio de datos. Estos ficheros de estado se llaman master.info y relay-log.info por defecto. Contienen informacin como la mostrada en la salida del comando SHOW SLAVE STATUS (consulte Seccin 13.6.2, Sentencias SQL para el control de servidores esclavos para una descripcin de este comando). Como ficheros en disco, sobreviven una parada del servidor esclavo. La siguiente vez que arranca el servidor esclavo, lee estos ficheros para determinar hasta dnde ha procesado los logs binarios del maestro y sus propios logs retardados. El fichero master.info lo actualiza el flujo de entrada/salida. En MySQL 5.0, la correspondencia entre las lneas en el fichero y las columnas mostradas porSHOW SLAVE STATUS es la siguiente: Lnea 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Descripcin Nmero de lneas en el fichero Master_Log_File Read_Master_Log_Pos Master_Host Master_User Contrasea (no mostrada por 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
El fichero relay-log.info lo actualiza el flujo SQL. La correspondencia entre las lneas en el fichero y las columnas mostradas por SHOW SLAVE STATUS se muestran aqu: Lnea Descripcin
362
1 2 3 4
Cuando hace una copia de seguridad de los datos del esclavo, debe incluir tambin estos dos ficheros, junto con sus ficheros de log retardado. Son necesarios para reanudar la replicacin tras restaurar los datos del esclavo. Si pierde los logs retardados pero todava tiene el fichero relay-log.info , puede examinarlo para determinar hasta dnde ha ejecutado el flujo SQL en el log binario del maestro. Luego puede usar CHANGE MASTER TO con las opciones MASTER_LOG_FILE y MASTER_LOG_POS para decirle al esclavo que vuelva a leer los logs binarios a partir de ese punto. Por supuesto, esto requiere que los logs binarios existan en el servidor maestro. Si su esclavo est sujeto a replicacin de comandos LOAD DATA INFILE , tambin debe incluir en la copia de seguridad cualquier fichero SQL_LOAD-* que existe en el directorio que el esclavo usa para este propsito. El esclavo necesita estos ficheros para reanudar replicacin de cualquier operacin LOAD DATA INFILE interrumpida. La localizacin del directorio se especifica usando la opcin -slave-load-tmpdir . Si valor por defecto, si no se especifica, es el valor de la variable tmpdir .
363
Si quiere usar los comandos LOAD TABLE FROM MASTER o LOAD DATA FROM MASTER desde el servidor esclavo, necesita dar a esta cuenta privilegios adicionales: De a la cuenta el privilegio global SUPER y RELOAD . De el privilegio SELECT para todas las tablas que quiere cargar. Cualquier tabla maestra desde la que la cuenta no puede hacer un SELECT se ignoran por LOAD DATA FROM MASTER. 3. Si usa slo tablas MyISAM , vuelque todas las tablas y bloquee los comandos de escritura ejecutando un comando FLUSH TABLES WITH READ LOCK :
mysql> FLUSH TABLES WITH READ LOCK;
Deje el cliente en ejecucin desde el que lanza el comando FLUSH TABLES para que pueda leer los efectos del bloqueo. (Si sale del cliente, el bloqueo se libera.) Luego tome una muestra de los datos de su servidor maestro. La forma ms fcil de crear una muestra es usar un programa de archivo para crear una copia de seguidad binaria de las bases de datos en su directorio de datos del maestro. Por ejemplo. use tar en Unix, o PowerArchiver, WinRAR, WinZip, o cualquier software similar en Windos. Para usar tar para crear un archivo que incluya todas las bases de datos, cambie la localizacin en el directorio de datos del maestro, luego ejecute el comando:
shell> tar -cvf /tmp/mysql-snapshot.tar .
Si quiere que el archivo slo incluya una base de datos llamada this_db, use este comando:
shell> tar -cvf /tmp/mysql-snapshot.tar ./this_db
Luego copie el archivo en el directorio /tmp del servidor esclavo. En esa mquina, cambie la localizacin al directorio de datos del esclavo, y desempaquete el fichero usando este comando:
shell> tar -xvf /tmp/mysql-snapshot.tar
Puede no querer replicar la base de datos mysql si el servidor esclavo tiene un conjunto distinto de cuentas de usuario a la existente en el maestro. En tal caso, debe exclurla del archivo. Tampoco necesita incluir ningn fichero de log en el archivo, o los ficheros master.info o relay-log.info files. Mientras el bloqueo de FLUSH TABLES WITH READ LOCK est en efecto, lee el valor del nombre y el desplazamiento del log binario actual en el maestro:
mysql > SHOW MASTER STATUS; +---------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +---------------+----------+--------------+------------------+ | mysql-bin.003 | 73 | test | manual,mysql | +---------------+----------+--------------+------------------+
La columna File muestra el nombre del log, mientras que Position muestra el desplazamiento. En este ejemplo, el valor del log binario es mysql-bin.003 y el desplazamiento es 73. Guarde los valores. Los necesitar ms tarde cuando inicialice el servidor. Estos representan las coordenadas de la replicacin en que el esclavo debe comenzar a procesar nuevas actualizaciones del maestro. Una vez que tiene los datos y ha guardado el nombre y desplazamiento del log, puede reanudar la actividad de escritura en el maestro:
mysql> UNLOCK TABLES;
364
Si est usando tablas InnoDB , debera usar la herramienta InnoDB Hot Backup. Realiza una copia consistente sin bloquear el servidor maestro, y guarda el nombre y desplazamiento del log que se corresponden a la copia para usarlo posteriormente en el esclavo. InnoDB Hot Backup es una herramienta no libre (comercial) que no est includa en la distribucin de MySQL estndar. Consulte la pgina web de InnoDB Hot Backup en http://www.innodb.com/manual.php para informacin detallada. Sin la herramienta Hot Backup , la forma ms rpida de hacer una copia binaria de los datos de las tablas InnoDB es parar el maestro y copiar los ficheros de datos InnoDB, ficheros de log, y ficheros de definicin de tablas (ficheros .frm). Para guardar los nombres de ficheros actual y desplazamientos, debe ejecutar el siguiente comando antes de parar el servidor:
mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS;
Luego guarde el nombre del log y el desplazamiento desde la salida de SHOW MASTER STATUS como se mostr antes. Tras guardar el nombre del log y el desplazamiento, pare el servidor sin bloquear las tablas para asegurarse que el servidor para con el conjunto de datos correspondiente al fichero de log correspondiente y desplazamiento:
shell> mysqladmin -u root shutdown
Una alternativa que funciona para tablas MyISAM y InnoDB es realizar un volcado SQL del maestro en lugar de una copia binaria como se describe en la discusin precedente. Para ello, puede usar mysqldump --master-data en su maestro y cargar posteriormente el fichero de volcado SQL en el esclavo. Sin embargo, esto es ms lento que hacer una copia binaria. Si el maestro se ha ejecutado previamente sin habilitar --log-bin , el nombre del log y las posiciones mostradas por SHOW MASTER STATUS o mysqldump --master-data estn vacos. En ese caso, los valores que necesita usar posteriormente cuando especifica el fichero de log del esclavo y la posicin son una cadena vaca ('') y 4. 4. Asegrese que la seccin [mysqld] del fichero my.cnf en el maestro incluye una opcin logbin . Esta seccin debe tambin tener la opcin server-id=master_id , donde master_id debe ser un entero positivo de 1 a 2^32 - 1. Por ejemplo:
[mysqld] log-bin=mysql-bin server-id=1
Si estas opciones no estn presentes, adalas y reinicie el servidor. 5. Pare el servidor que se vaya a usar como esclavo y aada lo siguiente a su fichero my.cnf :
[mysqld] server-id=slave_id
El valor slave_id , como el valor master_id , debe ser un entero positivo de 1 a 2^32 - 1. Adems, es muy importante que el ID del esclavo sea diferente del ID del maestro. Por ejemplo:
[mysqld] server-id=2
Si est preparando varios esclavos, cada uno debe tener un valor de server-id nico que difiera del maestro y de cada uno de los otros esclavos. Piense en los valores de server-id como algo similar a las direcciones IP: estos IDs identifican unvocamente cada instancia de servidor en la comunidad de replicacin. Si no especifica un server-id, se usa 1 si no ha definido un master-host, de otro modo se usa 2. Tenga en cuenta que en caso de omisin de server-id, un maestro rechaza conexiones de todos los esclavos, y un esclavo rechaza conectar a un maestro. Por lo tanto, omitir el server-id es bueno slo para copias de seguridad con un log binario.
365
6. Si ha hecho una copia de seguridad binara de los datos del maestro, cpielo en el directorio de datos del esclavo antes de arrancar el esclavo. Asegrese que los privilegios en los ficheros y directorios son correctos. El usuario que ejecuta el servidor MySQL debe ser capaz de leer y escribir los ficheros, como en el maestro. Si hizo una copia de seguridad usando mysqldump, arranque primero el esclavo (consulte el siguiente paso). 7. Arranque el esclavo. Si ha estado replicando prviamente, arranque el esclavo con la opcin -skip-slave-start para que no intente conectar inmediatamente al maestro. Tambin puede arrancar el esclavo con la opcin --log-warnings (activada por defecto en MySQL 5.0), para obtener ms mensajes en el log de errores acerca de problemas (por ejemplo, problemas de red o conexiones). En MySQL 5.0, las conexiones abortadas no se loguean en el log de errores a no ser que el valor sea mayor que 1. 8. Si hace una copia de seguridad de los datos del maestro usando mysqldump, cargue el fichero de volcado en el esclavo:
shell> mysql -u root -p < dump_file.sql
9. Ejecute los siguientes comandos en el esclavo, reemplazando los valores de opciones con los valores relevantes para su sistema:
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_position;
La siguiente tabla muestra la longitud mxima para las opciones de cadenas de caracteres: MASTER_HOST MASTER_USER MASTER_PASSWORD MASTER_LOG_FILE 10. Arranque el flujo esclavo:
mysql> START SLAVE;
60 16 32 255
Una vez realizado este procedimiento, el esclavo debe conectar con el maestro y atapar cualquier actualizacin que haya ocurrido desde que se obtuvieron los datos. Si ha olvidado asignar un valor para server-id en el maestro, los esclavos no son capaces de conectar. Si olvida asignar un valor para server-id en el esclavo, obtiene el siguiente error en el log de errores:
Warning: You should set server-id to a non-0 value if master_host is set; we will force server id to 2, but this MySQL server will not act as a slave.
Tambin encuentra mensajes de error en el log de errores del esclavo si no es capaz de replicar por ninguna otra razn. Una vez que un esclavo est replicando, puede encontrar en su directorio de datos un fichero llamado master.info y otro llamado relay-log.info. El esclavo usa estos dos ficheros para saber hasta que punto ha procesado el log binario del maestro. No borre o edite estos ficheros, a no ser que realmente sepa lo que hace y entienda las implicaciones. Incluso en tal caso, es mejor que use el comando CHANGE MASTER TO. 366
Nota: El contenido de master.info subedita algunas de las opciones especificadas en lnea de comandos o en my.cnf. Consulte Seccin 6.8, Opciones de arranque de replicacin para ms detalles. Una vez que tiene una copia de los datos, puede usarlo para actualizar otros esclavos siguiendo las porciones del procedimiento descrito. No necesita otra muestra de los datos del maestro; puede usar la misma para todos los esclavos. Nota: para la mayor durabilidad y consistencia posible en una inicializacin de replicacin usando InnoDB con transacciones debe usar innodb_flush_logs_at_trx_commit=1, sync-binlog=1, y innodb_safe_binlog en su fichero my.cnf del maestro.
367
368
opcin --timezone=timezone_name del script mysqld_safe o asignando un valor a la variable de entorno TZ. Tanto el maestro como el esclavo deben tener la misma zona horaria para las conexiones; esto es, el parmetro --default-time-zone debe tener el mismo valor para maestro y servidor. CONVERT_TZ(...,...,@global.time_zone) no se replica apropiadamente. CONVERT_TZ(...,...,@session.time_zone) se replica apropiadamente slo si el maestro y esclavo son de la versin 5.0.4 o posterior. Las variables de sesin no se replican apropiadamente cuando se usan en comandos que actualizan tablas; por ejemplo: SET MAX_JOIN_SIZE=1000; INSERT INTO mytable VALUES(@MAX_JOIN_SIZE); no insertar los mismos datos en el maestro y el esclavo. Esto no se aplica a SET TIME_ZONE=...; INSERT INTO mytable VALUES(CONVERT_TZ(...,...,@time_zone)), que se arregla en MySQL 5.0.4. Es posible replicar tablas transaccionales en el maestro usando tablas no transaccionales en el esclavo. Por ejemplo, puede replicar una tabla maestra InnoDB como una tabla esclava MyISAM . Sin embargo, si lo hace, hay problemas si el esclavo se para en medio de un bloque BEGIN/COMMIT , ya que el esclavo reinicia al principio del bloque BEGIN . Este tema se encuentra en la lista de temas pendientes y se arreglar prximamente. Los comandos de actualizacin que se refieren a variables de usuario (esto es, variables de la forma @var_name) se replican correctamente en MySQL 5.0; sin embargo esto no es cierto para versiones prvias a 4.1. Tenga en cuenta que los nombres de las variables de usuario no son sensibles a maysculas desde MySQL 5.0; debe tener esto en cuenta cuando prepare una replicacin entre 5.0 y versiones antiguas. Los esclavos MySQL 5.0 pueden conectar a maestros 5.0 usando SSL. En MYSQL 5.0 (desde 5.0.3), hay una variable de sistema global slave_transaction_retries: Si el flujo SQL del esclavo de replicacin falla al ejecutar una transaccin debido a un deadlock InnoDB o excede el innodb_lock_wait_timeout de InnoDB o TransactionDeadlockDetectionTimeout o TransactionInactiveTimeout de NDB, automticamente reintenta slave_transaction_retries veces antes de parar con un error. El valor por defecto en MySQL 5.0 es 10. A partir de MySQL 5.0.4, el nmero total de reintentos pueden verse en la salida de SHOW STATUS; consulte Seccin 5.3.4, Variables de estado del servidor. Si DATA DIRECTORY o INDEX DIRECTORY se usa en un comando CREATE TABLE en el maestro, la clusula se usa en el esclavo. Esto puede causar problemas si no existe el directorio correspondiente en el sistema de ficheros del esclavo o existe pero no es accesible en el esclavo. MySQL 5.0 soporta una opcin sql_mode llamada NO_DIR_IN_CREATE. Si el esclavo se ejecuta con este modo SQL , ignora estas clusulas al replicar el comando CREATE TABLE . El resultado es que los datos MyISAM y ficheros ndice se crean en el directorio de la base de datos de la tabla. Es posible que los datos del maestro y el esclavo diverjan si se disea una consulta tal que la modificacin de los datos no sea determinista; esto es, si se deja a criterio del optimizador de consultas. (Esto no es generalmente una buena prctica en ningn caso, incluso fuera de la replicacin.) Para una explicacin detallada de este tema consulte Seccin A.8.4, Cuestiones abiertas en MySQL. Lo siguiente se aplica slo si el maestro o el esclavo estn ejecutando la versin 5.0.3 o anterior: Si se interrumpe un LOAD DATA INFILE en el maestro (violacin de integridad, conexin muerta, o as), el esclavo ignora el LOAD DATA INFILE totalmente. Esto significa que si este comando inserta o actualiza registros en tablas de forma permanente antes de interrumpirse, estas modificaciones no se replican en el esclavo. FLUSH LOGS, FLUSH MASTER, FLUSH SLAVE, y FLUSH TABLES WITH READ LOCK no se loguean ya que cualquiera de ellos puede causar problemas al replicarse en un esclavo.) Para un ejemplo de sintaxis, consulte Seccin 13.5.5.2, Sintaxis de FLUSH. En MySQL 5.0, FLUSH
369
TABLES, ANALYZE TABLE, OPTIMIZE TABLE, y REPAIR TABLE se escriben en el log binario y por lo tanto se replican en los esclavos. Esto no es un problema normalmente porque estos comandos no modifican los datos de las tablas. Sin embaargo, esto puede causar dificultades bajo ciertas circunstancias. Si replica las tablas de privilegios en la base de datos mysql y actualiza estas tablas directamente sin usar GRANT, debe ejecutar un comando FLUSH PRIVILEGES en los esclavos para poner los nuevos privilegios en efecto. Adems, si usa FLUSH TABLES cuando queda una tabla MyISAM que es parte de una tabla MERGE , debe ejecutar un FLUSH TABLES manualmente en los esclavos. En MySQL 5.0, estos comandos se escriben en el log binario a no ser que especifique NO_WRITE_TO_BINLOG o su alias LOCAL. MySQL slo soporta un maestro y varios esclavos. En el futuro planeamos aadir un algoritmo de voto para cambiar el maestro automticamente en caso de problemas con el maestro actual. Tambin planeamos introducir procesos agentes para ayudar a realizar balanceo de carga mandando consultas SELECT a distintos esclavos. Cuando un servidor para y reinicia, sus tablas MEMORY (HEAP) se vacan . En MySQL 5.0, el maestro replica este efecto como sigue: La primera vez que el maestro usa cada tabla MEMORY tras arrancar, lo notifica a los esclavos que la tabla necesita vacar escribiendo un comando DELETE FROM para esa tabla en el log binario. Consulte Seccin 14.3, El motor de almacenamiento MEMORY (HEAP) para ms informacin. Las tablas temporales se replican excepto en el caso donde para el esclavo (no slo los flujos esclavos) y ha replicado tablas temporales que se usan en actualizaciones que no se han ejecutado todava en el esclavo. Si para el esclavo, las tablas temporales necesitadas por estas actualizaciones no estn disponibles cuando el esclavo se reinicia. Para evitar este problema, no pare el esclavo mientras tiene tablas temporales abiertas. En lugar de eso, use el siguiente procedimiento: 1. Ejecute un comando STOP SLAVE . 2. Use SHOW STATUS para chequear el valor de la variable Slave_open_temp_tables . 3. Si el valor es 0, ejecute un comando mysqladmin shutdown para parar el esclavo. 4. Si el valor no es 0, reinicie los flujos esclavos con START SLAVE. 5. Repita el procedimiento posteriormente para comprobar si tiene mejor suerte la prxima vez. Planeamos arreglar este problema en el futuro cercano. Es correcto conectar servidores de modo circular en una relacin maestro/esclavo con la opcin --log-slave-updates. Tenga en cuenta, sin embargo, que varios comandos no funcionan correctamente en esta clase de inicializacin a no ser que su cdigo cliente est escrito para tener en cuenta que pueden ocurrir actualizaciones en distintas secuencias de diferentes servidores. Esto significa que puede crear una inicializacin como esta:
A -> B -> C -> A
Los IDs de los servidores se codifican en los logs binarios de eventos, as que el servidor A conoce cuando un evento que lee fue creado originalmente por s mismo y no ejecuta el evento ( a no ser que el servidor A se iniciara con la opcin --replicate-same-server-id, que tiene significado slo en inicializaciones raras). Por lo tanto, no hay bucles infinitos. Sin embargo, esta inicializacin circular funciona slo si no realiza actualizaciones conflictivas entre tablas. En otras palabras, si inserta datos tanto en A y C, no debe insertar un registro en A que pueda tener una clave que entre en conflicto con un registro insertado en C. Tampoco debe actualizar el mismo registro en dos servidores si el orden de las actualizaciones es significativo. Si un comando en el esclavo produce un error, el flujo esclavo SQL termina, y el esclavo escribe un mensaje en su log de errores. Luego debe conectar al esclavo manualmente, arreglar el problema (por ejemplo, una tabla no existente), y luego ejecutar START SLAVE.
370
Es correcto parar un maestro y reiniciarlo posteriormente. Si un esclavo pierde su conexin con el maestro, el esclavo trata de reconectar inmediatamente. Si falla, el esclavo reintenta peridicamente. (Por defecto reinicia cada 60 segundos. Esto puede cambiarse con la opcin -master-connect-retry .) El esclavo tambin es capaz de tratar con problemas de conectividad de red. Sin embargo, el esclavo se da cuenta del problema de red slo tras no recibir datos del maestro durante slave_net_timeout segundos. Si los problemas son cortos, puede decrementar slave_net_timeout. Consulte Seccin 5.3.3, Variables de sistema del servidor. Parar el esclavo (correctamente) es seguro, ya que toma nota de dnde lo dej. Las paradas no correctas pueden producir problemas, especialmente si la cach de disco no se volc a disco antes que parara el sistema. La tolerancia a fallos del sistema se incrementa generalmente si tiene proveedores de corriente ininterrumpidos. Las paradas no correctas del maestro pueden causar inconsistencias entre los contenidos de tablas y el log binario en el maestro; esto puede evitarse usando tablas InnoDB y la opcin --innodb-safe-binlog en el maestro. Consulte Seccin 5.10.3, El registro binario (Binary Log). Debido a la naturaleza no transaccional de las tablas MyISAM, es posible tener un comando que actualice parcialmente una tabla y retorne un cdigo de error. Esto puede ocurrir, por ejemplo, en una insercin de varios registros que tenga un registro que viole una clave, o si una actualizacin larga se mata tras actualizar algunos de los registros. Si esto ocurre en el maestro, el flujo esclavo sale y para hasta que el administrador de base de datos decida qu hacer acerca de ello a no ser que el cdigo de error se legitime y la ejecucin del comando resulte en el mismo cdigo de error. Si este comportamiento de validacin de cdigo de error no es deseable, algunos o todos los errores pueden ser ignorados con la opcin --slave-skip-errors . Si actualiza tablas transaccionales para tablas no transaccionales dentro de una secuencia BEGIN/COMMIT , las actualizaciones del log binario pueden desincronizarse si la tabla no transaccional se actualiza antes de que acabe la transaccin. Esto se debe a que la transaccin se escribe en el log binario slo cuando acaba. En situaciones donde las transacciones mezclan actualizaciones transaccionales y no transaccionales, el orden de los comandso en el log binario es correcto , y todos los comandos necesarios se escriben en el log binario incluso en caso de un ROLLBACK). Sin embargo, cuando una segunda conexin actualiza la tabla no transaccional antes que la primera transaccin se complete, los comandos pueden loguearse fuera de orden, ya que la actualizacin de la segunda conexin se escribe inmediatamente al ejectarse, sin tener en cuenta el estado de la transaccin que se ejecuta en la primera conexin.
371
--master-connect-retry --master-ssl --master-ssl-ca --master-ssl-capath --master-ssl-cert --master-ssl-cipher --master-ssl-key El fichero master.info en formato 5.0 incluye valores correspondientes a las opciones SSL. Adems, el formato del fichero incluye como primer lnea el nmero de lneas en el fichero. Si actualiza de un servidor antiguo a uno nuevo, el nuevo servidor actualiza el fichero master.info al nuevo formato automticamente cuando arranca. Sin embargo, si baja de versin un servidor nuevo a una versin antigua, debe borrar la primera lnea manualmente antes de arrancar el servidor antiguo la primera vez. Si no existe un fichero master.info cuando arranca el esclavo, usa los valores para estas opciones que se especifican en el fichero de opciones o en lnea de comandos. Esto ocurre cuando arranca el servidor como un esclavo de replicacin la primera vez, o cuando ha ejecutado RESET SLAVE y luego ha parado y rearrancado el esclavo. Si el fichero master.info existe cuando el esclavo arranca, el servidor ignora estas opciones. En su lugar, usa los valores encontrados en el fichero master.info . Si reinicia el esclavo con valores distintos de las opciones de arranque que corresponden a los valores en el fichero master.info , los valores diferentes no tienen efecto, ya que el servidor contina usando el fichero master.info . Para usar valores distintos, debe reiniciar tras borrar el fichero master.info o (preferiblemente) use el comando CHANGE MASTER TO para reiniciar los valores mientras el esclavo est corriendo. Soponga que especifica estas opciones en su fichero my.cnf :
[mysqld] master-host=some_host
La primera vez que arranca el servidor como esclavo de replicacin, lee y usa esta opcin del fichero my.cnf. El servidor guarda el valor en el fichero master.info . La siguiente vez que arranque el servidor, lee el valor de la mquina maestra slo desde el fichero master.info e ignora el valor en el fichero de opciones. Si modifica el fichero my.cnf para especificar un equipo maestro distinto a some_other_host, el cambio todava no tiene efecto. Debe usar CHANGE MASTER TO en su lugar. Debido a que el servidor da una precedencia al fichero master.info sobre las opciones de arranque descritas, puede no usar las opciones de arranque para estos valores, y en su lugar especificarlos usando el comando CHANGE MASTER TO . Consulte Seccin 13.6.2.1, Sintaxis de CHANGE MASTER TO. Este ejemplo muestra un uso ms extensivo de las opciones de arranque para configurar un esclavo:
[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 siguiente lista describe opciones de arranque para controlar la replicacin: Muchas de estas opciones pueden cambiarse con el servidor en ejecucin usando el comando CHANGE MASTER TO.
372
Otras, tales como las opciones --replicate-*, slo pueden cambiarse cuando arranca el esclavo. Planeamos arreglar esto. --log-slave-updates Normalmente, las actualizaciones recibidas por un servidor maestro por un esclavo no se loguean en el log binario. Esta opcin le dice al esclavo que loguee las actualizaciones realizadas por el flujo SQL en el log binario del esclavo. Para que esta opcin tenga efecto, el esclavo debe arrancarse con la opcin --log-bin para permitir logueo binario. --log-slave-updates se usa cuando quiere encadenar servidores de replicacin . Por ejemplo, puede hacer una inicializacin como esta:
A -> B -> C
Esto es , A sirve como maestro para el esclavo B, y B sirve como maestro para el esclavo C. Para que funcione, B debe ser tanto maestro como esclavo. Debe arrancar tanto A como B con --logbin para permitir logueo binario, y B con la opcin --log-slave-updates . --log-warnings Hace que el esclavo muestre ms mensajes en el log de errores acerca de qu est haciendo. Por ejemplo, le advierte que ha podido reconectar tras un error de red, y le informa cada vez que arrancan los flujos del esclavo. Esta opcin est activada por defecto en MySQL 5.0; para desactivarla, use --skip-log-warnings. En MySQL 5.0, las conexiones abortadas no se loguean en el log de errores a no ser que el valor sea mayor que 1. Tenga en cuenta que los efectos de esta opcin no estn limitados a replicacin. Produce advertencias a travs de un espectro de actividades de servidor. --master-connect-retry=seconds Nmero de segundos que el flujo esclavo duerme antes de reintentar conectar al maestro en caso que caiga el maestro o se pierda la conexin. El valor en el fichero master.info tiene precedencia si puede leerse. Si no est especificado, por defecto es 60. --master-host=host El nombre de equipo o nmero IP del maestro. Si no se da esta opcin, el flujo esclavo no arranca. El valor en master.info tiene precedencia si puede leerse. --master-info-file=file_name Nombre a usar para el fichero en que el esclavo guarda informacin acerca del maestro. El nombre por defecto es mysql.info en el directorio de datos. --master-password=password Contrasea de la cuenta que el flujo esclavo usa para autenticar al conectar al maestro. El valor en el fichero master.info tiene precedencia si puede leerse. Si no est asignado, se asume la contrasea vaca. --master-port=port_number El puerto TCP/IP en que est escuchando el maestro. El valor en el fichero master.info tiene precedencia si puede leerse. Si no est asignado, se usa la especificacin compilada. Si no ha cambiado las opciones de configure debera ser 3306. --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 Estas opciones se usan para preparar una conexin de replicacin segura al maestro usando SSL. Sus significados son los mismos que los de las opciones correspondientes --ssl, --ssl-ca, --
373
ssl-capath, --ssl-cert, --ssl-cipher, --ssl-key descritas en Seccin 5.7.7.5, Opciones relativas a SSL. Los valores en el fichero master.info tienen precedencia si pueden leerse. --master-user=username El nombre de usuario que el flujo esclavo usa para autenticar al conectar con el maestro. En MySQL 5.0, esta cuenta debe tener el privilegio REPLICATION SLAVE . El valor en el fichero master.info , si puede leerse, tiene precedencia. Si el usuario maestro no est inicializado, se asume el usuario test . --max-relay-log-size=# Para rotar el log retardado automticamente. Consulte Seccin 5.3.3, Variables de sistema del servidor. --read-only Esta opcin hace que el esclavo no permita ninguna actualizacin excepto de flujos esclavos o de usuarios con el privilegio SUPER . Esto puede ser til para asegurar que un servidor esclavo no acepta actualizaciones de los clientes. --relay-log=file_name El nombre para el log retardado. El nombre por defecto es host_name-relay-bin.nnnnnn, donde host_name es el nombre del esclavo y nnnnnn indica que los logs retardados se crean en secuencia enumerada. Puede especificar la opcin para crear nombres de logs retardados independientes del nombre de la mquina, o si sus logs retardados tieneden a ser grandes ( y no quiere decrementar max_relay_log_size) y necesita ponerlos en algn rea distinta del directorio de datos, o si quiere incrementar la velocidad balanceando carga entre discos. --relay-log-index=file_name Localizacin y nombre que deben usarse para el fichero ndice del log retardado. El nombre por defecto es host_name-relay-bin.index, donde host_name es el nombre del esclavo. --relay-log-info-file=file_name El nombre a usar por el fichero en que el esclavo guarda informacin acerca del log retardado. El nombre por defecto es relay-log.info en el directorio de datos. --relay-log-purge={0|1} Desactiva o activa la purga automtica del log retardado en cuanto no se necesitan ms. El valor por defecto es 1 (activado). Esta es una variable global que puede cambiarse dinmicamente con SET GLOBAL relay_log_purge. --relay-log-space-limit=# Especifica un lmite superior del tamao total de todos los logs retardados en el esclavo (un valor de 0 significa que no hay limitacin de tamao). Esto es til para un esclavo con espacio de disco limitado. Cuando se alcanza el lmite, el flujo de entrada/salida para de leer eventos del log binario del maestro hasta que el flujo SQL borra algunos logs retardados no usados. Tenga en cuenta que este lmite no es absoluto: Hay casos donde el flujo SQL necesita ms eventos antes que pueda borrar logs retardados. En tal caso, el flujo de entrada/salida excede el lmite hasta que es posible para el flujo SQL borrar algunos logs retardados. (El no hacerlo causara un deadlock.) No debe asignar --relay-log-space-limit un valor menor al doble del valor de --max-relaylog-size (o --max-binlog-size si --max-relay-log-size es 0). En tal caso, hay una oportunidad que el flujo de entrada/salida espere espacio libre debido a que se excede --relaylog-space-limit, pero el flujo SQL no tiene log retardado para purgar y es incapaz de satisfacer el flujo de entrada/salida. Esto fuerza al flujo de entrada/salida a que ignore temporalmente -relay-log-space-limit.
374
--replicate-do-db=db_name Le dice al esclavo que restrinja replicacin a comandos donde la base de datos por defecto (esto es, la seleccionada por USE) es db_name. Para especificar ms de una base de datos, use esta opcin mltiples veces, una para cada base de datos. Tenga en cuenta que esto no replica comandos entre bases de datos tales como UPDATE some_db.some_table SET foo='bar' mientras se haya seleccionado una base de datos distinta o ninguna base de datos. Si necesita actualizaciones entre bases de datos distintas use --replicate-wild-do-table=db_name.%. Por favor lea las notas que hay a continuacin de esta lista de opciones. Un ejemplo de lo que no funciona como podra esperar: Si el esclavo arranca con --replicatedo-db=sales y realiza el siguiente comando en el maestro, el comando UPDATE no se replica:
USE prices; UPDATE sales.january SET amount=amount+1000;
Si necesita que funcionen actualizaciones entre varias bases de datos, use --replicate-wilddo-table=db_name.% en su lugar. La razn principal para este comportamiento slo chequee la base de datos por defecto es que es difcil para el comando conocer si debe o no debe ser replicado (por ejemplo, si est usando comandos DELETE de mltiples tablas o comandos UPDATE de mltiples tablas que actan entre mltiples bases de datos). Tambin es ms rpido chequear slo la base de datos por defecto en lugar de todas las bases de datos si no hay necesidad. --replicate-do-table=db_name.tbl_name Le dice al flujo esclavo que restrinja replicacin a la tabla especificada. Para especificar ms de una tabla, use esta opcin mltiples veces, una para cada tabla. Esto funciona para actualizaciones entre bases de datos, en contraste con --replicate-do-db. Lea los comentarios a continuacin de esta lista de opciones. --replicate-ignore-db=db_name Le dice al esclavo que no replique ningn comando donde la base de datos por defecto (esto es, la seleccionada por USE) es db_name. Para especificar ms de una base de datos a ignorar, use esta opcin mltiples veces, una para cada base de datos. No debe usar esta opcin si est usando actualizaciones entre bases de datos y no quiere que estas acutalizaciones se repliquen. Lea las notas despus de esta lista de opciones. Une ejemplo de lo que no funciona como podra esperar: Si el esclavo arranca con --replicateignore-db=sales y ejecuta el siguiente comando en el maestro, el comando UPDATE se replica not :
USE prices; UPDATE sales.january SET amount=amount+1000;
Si necesita que funcionen actualizaciones entre bases de datos, use --replicate-wildignore-table=db_name.% en su lugar. --replicate-ignore-table=db_name.tbl_name Le dice al esclavo que no replique ningn comando que actualice la tabla especificada (incluso si otras tablas se actualizan en el mismo comando). Para especificar ms de una tabla a ignorar, use esta opcin mltiples veces, una para cada tabla. Esto funciona para actualizaciones entre bases de datos, en contraste con --replicate-ignore-db. Lea los comentarios a continuacin de esta lista de opciones. --replicate-wild-do-table=db_name.tbl_name
375
Le dice al esclavo que restrinja la replicacin a comandos donde cualquiera de las tablas actualizadas coincida con el patrn de base de datos y tabla. Los patrones pueden contener el comodn '%' and '_' , que tiene el mismo significado que para el operador LIKE . Para especificar ms de una tabla, use esta opcin mltiples veces, una para cada tabla. Esto funciona para actualizaciones entre bases de datos. Lea los comentarios a continuacin de esta lista de opciones. Ejemplo: --replicate-wild-do-table=foo%.bar% replica slo actualizaciones que usen una tabla donde el nombre de la base de datos comience con foo y el nombre de la tabla comienza con bar. Si el patrn del nombre de la tabla es %, coincide con cualquier nombre de tabla y la opcin se aplica a commandos a nivel de base de datos (CREATE DATABASE, DROP DATABASE, y ALTER DATABASE). Por ejemplo, si usa --replicate-wild-do-table=foo%.%, comandos a nivel de base de datos se replican si el nombre de la base de datos coinciden con el patrn foo%. Para incluir caracteres comodn literales en el nombre de la base de datos o de tabla, debe introducir un carcter de antibarra de escape. Por ejemplo, para replicar todas las tablas de una base de datos que se llama my_own%db, pero no replicar tablas de la base de datos my1ownAABCdb , debe escapar los caracteres '_' y '%' as: --replicate-wild-do-table=my \_own\%db. Si usa la opcin en la lnea de comandos, puede necesitar doblar las antibarras o poner el valor de la opcin entre comillas, dependiendo del intrprete de comandos. Por ejemplo, con el shell bash , tendra que escribir --replicate-wild-do-table=my\\_own\\%db. --replicate-wild-ignore-table=db_name.tbl_name Le dice al esclavo que no replique un comando donde cualquier tabla coincida con el patrn dado. Para especificar ms de una tabla a ignorar, use esta opcin mltiples veces, una para cada tabla. Esto funciona para actualizaciones entre bases de datos. Lea los comentarios a continuacin de esta lista de opciones. Ejemplo: --replicate-wild-ignore-table=foo%.bar% no replica actualizaciones que use una tabla donde el nombre de la base de datos comience con foo y el nombre de tabla comience con bar. Para informacin acerca de cmo funcionan las coincidencias, consulte la descripcin de la opcin --replicate-wild-do-table . Las reglas para incluir caracteres comodn en la opcin son las mismas que para --replicate-wild-ignore-table . --replicate-rewrite-db=from_name->to_name Le dice al esclavo que traduzca la base de datos por defecto (esto es, la seleccionada por USE) a to_name si era from_name en el maestro. Slo los comandos que tengan que ver con tablas estn afectados (no comandos tales como CREATE DATABASE, DROP DATABASE, y ALTER DATABASE), si y slo si from_name era la base de datos por defecto en el maestro. Esto no funciona para actualizaciones entre bases de datos. Tenga en cuenta que la traduccin del nombre de la base de datos se hace antes que se testeen las reglas de --replicate-*. Si usa esta opcin en la lnea de comandos y el carcter '>' es especial en su intrprete de comandos, ponga entre comillas el valor de la opcin. Por ejemplo:
shell> mysqld --replicate-rewrite-db="olddb->newdb"
--replicate-same-server-id Para usar en esclavos. Usualmente puede usar el valor por defecto de 0, para evitar bucles infinitos en replicacin circular. Si se pone a 1, este esclavo no evita eventos que tengan su propio id de servidor; normalmente esto es til slo en configuraciones raras. No puede ponerse a 1 si se usa --log-slave-updates . Tenga en cuenta que por defecto el flujo de entrada/salida del esclavo no escribe eventos en el log binario si tiene el id del esclavo (esta optimizacin ayuda a ahorrar espacio de disco). As que si quiere usar --replicate-same-server-id, asegrese de arrancar
376
el esclavo con esta opcin antes de hacer que el esclavo lea sus propios eventos que quiera que ejecute el flujo SQL del esclavo. --report-host=slave_name El nombre de mquina o nmero IP del esclavo que debe reportar al maestro durante el registro del esclavo. Este valor aparece en la salida de SHOW SLAVE HOSTS en el maestro. No ponga ningn valor si no quiere que el esclavo se registre l mismo en el maestro. Tenga en cuenta que no es suficiente para el maestro leer el nmero IP del esclavo en el socket TCP/IP una vez que el esclavo conecte. Debido a NAT y otros elementos de enrutamiento, esa IP puede no ser vlida para conectar del esclavo al maestro y otros equipos. --report-port=slave_port El nmero de puerto TCP/IP para conectar al esclavo, a ser reportado al maestro durante el registro del esclavo. Asigne un valor slo si el esclavo est escuchando en un puerto no estndar o si tiene un tnel especial desde el maestro u otros clientes al esclavo. Si no est seguro, deje esta opcin sin asignar ningn valor. --skip-slave-start Le dice a un esclavo que no arranque el flujo del esclavo cuando el servidor arranque. Para arrancar el flujo posteriormente, use START SLAVE . --slave_compressed_protocol={0|1} Si se pone esta opcin a 1, use compresin para el protocolo esclavo/maestro si ambos lo soportan. --slave-load-tmpdir=file_name Nombre del directorio en el que el esclavo crea ficheros temporales. Esta opcin por defecto es el valor de la variable de sistema tmpdir . Cuando el flujo SQL del esclavo replica un comando LOAD DATA INFILE, extrae el fichero a ser cargado del log retardado en ficheros temporales, luego los carga en la tabla .Si el fichero cargado en el maestro es muy grande, los ficheros temporales en el esclavo tambin lo son. Por lo tanto, es una buena idea usar esta opcin para decirle al esclavo que ponga los ficheros temporales en un sistema de ficheros con mucho espacio disponible. En tal caso, puede usar la opcin --relay-log en ese sistema de ficheros, debido a que los logs retardados tambin son muy grandes. --slave-load-tmpdir debe apuntar un sistema de ficheros en disco, no en memoria. El esclavo necesita los ficheros temporales usados para replicar LOAD DATA INFILE para sobrevivir a un reinicio de la mquina. El directorio no debe ser uno que limpie el sistema operativo durante el arranque. --slave-net-timeout=seconds El nmero de segundos a esperar para ms datos del maestro antes de abortar la lectura, considerando la conexin rota y tratando de reconectar. El primer reintento se hace inmediatamente tras el timeout. El intervalo entre reintentos se controla mediante la opcin --master-connectretry . --slave-skip-errors= [err_code1,err_code2,... | all] Normalmente, la replicacin para cuando ocurre un error, lo que le da la oportunidad de resolver la inconsistencia en los datos manualmente. Esta opcin le dice al flujo SQL esclavo que continue la replicacin cuando un comando retorna cualquiera de los errores listados en la opcin. No use esta opcin a no ser que entienda porqu esta obteniendo opciones. Si no hay bugs en la preparacin de la replicacin ni en los programas cliente, y no hay bugs en el propio MySQL, nunca ocurre un error que pare la replicacin. El uso indiscriminado de esta opcin provoca que el esclavo pueda quedar desincronizado con el maestro, sin que usted sepa porqu ha ocurrido.
377
Para cdigos de error, debe usar los nmeros proporcionados por el mensaje de error en su log de errores del esclavo y en la salida de SHOW SLAVE STATUS. Los cdigos de error del servidor se listan en Captulo 26, Manejo de errores en MySQL. Tambin puede (pero no debera) usar el valor no recomendable de all que ignora todos los mensajes de error y contina funcionando sin tener en cuenta qu ocurre. No hace falta decir que, si lo usa, no podemos garantizar la integridad de los datos. Por favor no proteste (ni enve reportes de bug) en este caso si los datos del esclavo no se parecen a lo que hay en el maestro. Le hemos advertido. Ejemplos:
--slave-skip-errors=1062,1053 --slave-skip-errors=all
Las reglas --replicate-* se evalan como se explica para determinar si un comando se ejecuta por el esclavo o se ignora: 1. Hay algunas reglas --replicate-do-db o --replicate-ignore-db ? S: Puede testearlas como --binlog-do-db y --binlog-ignore-db (consulte Seccin 5.10.3, El registro binario (Binary Log)). Cul es el resultado del test? Ignora el comando: Lo ignora y sale. Ejecuta el comando: No lo ejecuta inmediatamente; difiere la decisin; contina con el siguiente paso. No: Contina con el siguiente paso. 2. Estamos ejecutando ahora una funcin o procedimiento almacenado? S: Ejecuta la consulta y sale. No: Contina con el siguiente paso. 3. Hay alguna regla --replicate-*-table ? No: Contina con el siguiente paso. S: Contina con el siguiente paso. Slo las tablas que van a ser actualizadas se comparan con las reglas (INSERT INTO sales SELECT * FROM prices: slo sales se compara con las reglas). Si varias tablas van a actualizarse (comando de mltiples tablas), la primera tabla coincidente (coincidencia do o ignore) gana. Esto es, la primera tabla se compara con las reglas. A continuacin, si no se puede tomar ninguna decisin, la segunda tabla se compara con las reglas, y as. 4. Hay algunas tablas --replicate-do-table ? S: Coincide la tabla con alguna de ellas? S: Ejecuta la consulta y sale. No: Sigue con el siguiente paso. No: Sigue con el siguiente paso. 5. Hay alguna regla --replicate-ignore-table? S: Coincide la tabla con alguna de ellas? S: Ignora la consulta y sale.
378
No: Contina con el siguiente paso. No: Contina con el siguiente paso. 6. Hay alguna regla --replicate-wild-do-table? S: Coincide la tabla con alguna de ellas? S: Ejecuta la consulta y sale. No: Contina con el siguiente paso. No: Contina con el siguiente paso. 7. Hay alguna regla --replicate-wild-ignore-table? S: Coincide la tabla con alguna de ellas? S: Ignora la consulta y sale. No: Contina con el siguiente paso. No: Contina con el siguiente paso. 8. No coincide ninguna regla --replicate-*-table . Hay alguna otra tabla para comprobar con las reglas? S: Bucle. No: Hemos testeados todas las tablas a actualizar y no podemos encontrar ninguna coincidencia con ninguna regla. Hay alguna regla --replicate-do-table o --replicate-wild-dotable ? S: Ignora la consulta y sale. No: Ejecuta la consulta y sale.
3. Ejecute START SLAVE en el esclavo. Si no tiene una copia de seguridad del maestro, aqu hay un procedimiento rpido para crear uno. Todos los pasos deben realizarse en el maestro. 1. Ejecute este comando:
379
2. Con el bloqueo todava activo, ejecute este comando (o una variacin de l):
shell> tar zcf /tmp/backup.tar.gz /var/lib/mysql
4. Libere el bloqueo:
mysql> UNLOCK TABLES;
Una alternativa es hacer un volcado SQL del maestro en lugar de una copia binaria como en el procedimiento precedente. Para hacerlo, puede usar mysqldump --master-data en su maestro y cargar el volcado SQL posteriormetne en su esclavo. Sin embargo, esto es ms lento que hacer una copia binaria. No importa cul de los dos mtodos use, luego siga las instrucciones para el caso en que tenga una muestra de los datos y haya guardado el nombre del log y el desplazamiento. Puede usar la misma muestra de datos para preparar varios esclavos. Una vez que tenga la muesta de datos del maestro, puede esperar a preparar un esclavo mientras los logs binarios en el maestro queden intactos. Hay dos limitaciones prcticas en la cantidad de tiempo que puede esperar que son la cantidad de espacio disponible para guardar los logs binarios y el tiempo que tarda el esclavo en leerlos. Tambin puede usar LOAD DATA FROM MASTER. Este es un comando apropiado que transfiere una muestra de los datos al esclavo y ajusta el nombre del log y el desplazamiento a la vez. En un futuro LOAD DATA FROM MASTER ser el mtodo recomendado para preparar un esclavo. Tenga en cuenta, sin embargo, que slo funciona para tablas MyISAM y que puede mantener un bloqueo de lectura durante un largo periodo de tiempo. Todava no est implementado tan eficientemente como querramos. Si tiene tablas muy grandes, el mejor mtodo por ahora es tomar una muesta de datos binaria en el maestro tras ejecutar FLUSH TABLES WITH READ LOCK. P: Necesita el esclavo estar conectado todo el tiempo al maestro? R: No, no hace falta. El esclavo puede caer o quedar desconectado durante horas o das, luego reconectar y leer las actualizaciones. Por ejemplo, puede preparar una relacin maestro/servidor mediante un enlace telefnico que slo est disponible espordicamente y durante cortos periodos de tiempo. La implicacin de esto es, que en un momento dado, el esclavo no garantiza estar sincronizado con el maestro a no ser que tome medidas especiales. En el futuro, tendremos la opcin de bloquear el maestro hasta que al menos un esclavo est sincronizado. P: Cmo se qu retardo tiene esclavo comparado con el maestro? En otras palabras, cmo se la fecha de la ltima consulta replicada por el esclavo? R: Para un esclavo MySQL 5.0, puede leer la columna Seconds_Behind_Master en SHOW SLAVE STATUS. Consulte Seccin 6.3, Detalles de la implementacin de la replicacin. Cuando un flujo SQL esclavo ejecuta un evento ledo del maestro, modifica su propia hora a la hora del evento (esto es el porqu TIMESTAMP se replica bien). En la columna Time en la salida de SHOW PROCESSLIST, el nmero de segundos mostrados por el flujo SQL del esclavo es el nmero de segundos entre la hora del ltimo evento replicado y la hora real de la mquina esclava. Puede usar esto para determinar la fecha del ltimo evento replicado. Tenga en cuenta que si su esclavo se ha desconectado del maestro durante una hora, y luego reconecta, puede ver de forma inmediata valores Time como 3600 para el flujo SQL esclavo en SHOW PROCESSLIST. Esto ocurrira debido a que el esclavo est ejecutando comandos que tienen una hora. P: Cmo fuerzo al maestro a bloquear actualizaciones hasta que el esclavo las lee? R: Use el siguiente procedimiento:
380
Registra el nombre y desplazamiento del log de la salida del comando SHOW . Estas sn las coordinaciones de replicacin. 2. En el esclavo, ejecute el siguiente comando, donde el argumento de la funcin MASTER_POS_WAIT() son las coordenadas de replicacin obtenidos en el prvio paso:
mysql> SELECT MASTER_POS_WAIT('log_name', log_offset);
El comando SELECT bloquea hasta que el esclavo alcanza el fichero y desplazamiento de log especificado. En este punto, el esclavo est sincronizado con el maestro y el comando retorna. 3. En el maestro, ejectue el siguiente comando para permitir al maestro comenzar a ejecutar actualizaciones otra vez:
mysql> UNLOCK TABLES;
P: Qu cuestiones debo considerar al preparar una replicacin bidireccional? R: La replicacin MySQL actualmente no sopota ningn protocolo de bloqueo entre maestro y servidor para garantizar la atomicidad de una actualizacin distribuida (entre servidores). En otras palabras, es posible para el cliente A hacer una actualizacin del co-maestro 1, y mientras tanto, antes de propagar al co-maestro 2, el cliente B puede hacer una actualizacin en el co-maesto 2 que haga que la actualizacin del cliente A funcione de forma distinta que hara en el co-maestro 1. Por lo tanto, cuando la actualizacin del cliente A se hace en el co-maestro 2, produce tablas que son distintas que las que tiene en el co-maestro 1, incluso tras todas las actualizaciones del co-maestro 2 se hayan propagado. Esto significa que no debe encadenar dos servidores en una relacin de replicacin bidireccional a no ser que est seguro que sus actualizaciones pueden hacerse en cualquier orden, o a no ser que se encarge de actualizaciones desordenadas de algn modo en el cdigo del cliente. Debe tener en cuenta que replicacin bidireccional no mejora mucho el rendimiento (o nada), en lo que se refiere a actualizaciones. Ambos servidores tienen que hacer el mismo nmero de actualizaciones, lo mismo que hara un servidor. La nica diferencia es que hay un poco menos de bloqueos, ya que las actualizaciones originadas en otro servidor se serializan en un flojo esclavo. Incluso este beneficio puede verse penalizado por retardos de red. P: Cmo puedo usar replicacin para mejorar rendimiento en mi sistema? R: Debe preparar un servidor como maestro y dirigir todas las escrituras al mismo. Luego configure tantos esclavos como quiera, y distribuya las lecturas entre los esclavos y maestro. Tambin puede arrancar esclavos con las opciones --skip-innodb, --skip-bdb, --low-priority-updates, y --delay-key-write=ALL para mejorar la velocidad en el esclavo. En este caso, el esclavo usa tablas no transaccionales MyISAM en lugar de InnoDB y BDB para obtener ms velocidad. P: Qu debo hacer para preparar cdigo cliente en mis propias aplicaciones para usar replicacin que mejore el rendimiento? R: Si la parte de su cdigo que es responsable de acceso a bases de datos se ha modularizado correctamente, convertindola para correr con un entorno de replicacin debe ser algo sencillo. Cambie la implementacin de su acceso a base de datos para enviar todas las escrituras al maestro, y enviar lecturas al maestro o al esclavo. Si su cdigo no tiene este nivel de abstaccin, preparar un sistema de replicacin le da la oportunidad de limpiarlo. Debe comenzar creando una biblioteca o mdulo con las siguientes funciones: safe_writer_connect() safe_reader_connect() 381
safe_reader_statement() safe_writer_statement() safe_ en cada nombre de funcin significa que la funcin se encarga de tratar todas las condiciones de error. Puede usar distintos nombres para las funciones. Lo importante es tener una interfaz unificada para conectar para lecturas, conectar para escrituras, hacer una lectura y hacer una escritura. Luego debe convertir su cdigo de cliente para usar la biblioteca. Este es un proceso largo y complicado en principio, pero vale la pena a la larga. Todas las aplicaciones que usen la aproximacin descrita son capaces de aprovechar al configuracin maestro/esclavo, incluso uno en el que intervengan varios esclavos. El cdigo es mucho ms fcil de mantener, y aadiendo opciones para tratar problemas es trivial. Necesita modificar una o dos funciones slo; por ejemplo, para loguear cunto tarda cada comando, o qu comando provoca un error. Si ha escrito mucho cdigo, puede querer automatizar la tarea de conversin usando la utilidad replace que viene con la distribucin estndar MySQL, o escribir su propio script de conversin. Idealmente, su cdigo usa convenciones de estilo. Si no, probablemente es mejor reescribirlo, o al menos regularizarlo manualmente para usar un estilo consistente. P: Cundo y cmo puede mejorar la replicacin MySQL el rendimiento de mi sistema? R: La replicacin MySQL es ms benfica para sistemas con lecturas frecuentes y escrituras infrecuentes. En teora, usando una inicializacin un maestro/mltiples esclavos, puede escalar el sistema aadiendo ms esclavos hasta que se queda sin ancho de banda, o la carga de actualizacin crece hasta el punto que el maestro no puede tratarla. Para determinar cuntos esclavos puede tener antes que los beneficios empiecen a notarse, necesita conocer el patrn de consultas, y determinar empricamente con pruebas la relacin entre las lecturas (lecturas por segundo , o max_reads) y las escrituras (max_writes) en un tpico maestro y tpico esclavo. El ejemplo muestra un clculo simplificado de qu puede obtener con replicacin para un sistema hipottico. Digamos que la carga del sistema consiste en 10% de escrituras y 90% de lecturas, y hemos determinado con pruebas que max_reads es 1200 - 2 * max_writes. En otras palabras, el sistema puede hacer 1,200 lecturas por segundo sin escrituras, la escritura media es el doble de lenta que la lectura media, y la relacin es linear. Supongamos que el maestro y cada esclavo tienen la misma capacidad, y que tienen un maestro y N esclavos. Tenemos para cada servidor (maestro o esclavo): lecturas = 1200 - 2 * escrituras lecturas = 9 * escrituras / (N + 1) (las lecturas se dividen, pero las escrituras van a todos los servidores) 9 * escrituras / (N + 1) + 2 * escrituras = 1200 escrituras = 1200 / (2 + 9/(N+1)) La ltima ecuacin indica que el nmero mximo de escrituras para N esclavos, dado el ratio mximo de lecturas de 1,200 por minuto y un rato de nueve lecturas por escritura. Este anlisis lleva a las siguientes conclusiones: Si N = 0 (que significa que no tenemos replicacin), nuestro sistema puede tratar unas 1200/11 = 109 escrituras por segundo. Si N = 1, tenemos 184 escrituras por segundo. Si N = 8,tenemos 400 escrituras por segundo. Si N = 17, tenemos 480 escrituras por segundo.
382
Eventualmente, mientras N se aproxima al infinito ( y el presupuesto a infinito negativo ), podemos llegar carca de 600 escrituras por segundo, incrementando el rendimiento del sistema 5.5 veces. Sin embargo, con slo ocho servidores, lo incrementamos cerca de cuatro veces. Tenga en cuenta que estos clculos asumen ancho de banda infinito y no tiene en cuenta muchos otros factores que pueden ser significativos en el sistema. En muchos casos, puede no ser capaz de realizar una computacin similar al mostrado que prediga que ocurre en su sistema si aade N esclavos de replicacin. Sin embargo, responder las siguientes cuestiones deben ayudarle a decidir si y cunto la replicacin mejorar el rendimiento de su sistema: Cul es el ratio de lectura/escritura en su sistema? Canta carga de escritura puede tratar un servidor si reduce las lecturas? Para cuntos esclavos tiene ancho de banda disponible? P: Cmo puedo usar replicacin para proporcionar redundancia/alta disponibilidad? R: Con las caractersticas actuales, puede preparar un maestro y un esclavo (o varios esclavos), y escribir un scrip que monitorice el maestro para ver si est en marcha. Luego ensee a su aplicacin y a los esclavos a cambiar el maestro en caso de fallo. Algunas sugerencias: Para decir al esclavo que cambie el maestro, use el comando CHANGE MASTER TO . Una buena forma de mantener a las aplicaciones informadas de la localizacin del maestro es con una entrada de DNS dinmica para el maestro. Con bind puede usar nsupdate para actualizar dinmicamente el DNS. Debe ejecutar los esclavos con la opcin --log-bin y sin --log-slave-updates. De este modo, el esclavo est preparado para ser un maestro en cuanto ejecute STOP SLAVE; RESET MASTER, y CHANGE MASTER TO en los otros esclavos. Por ejemplo, asuma que tiene la siguiente configuracin:
WC \ WC----> / / v S1 v M | \ | \ v v S2 S3
M es el maestro, S los esclavos, WC los clientes realizando escrituras y lecturas; los clientes que ejecutan slo lecturas de bases de datos no se representan , ya que no necesitan cambiar. S1, S2, y S3 son esclavos ejecutndose con --log-bin y sin --log-slave-updates. Como las actualizaciones recibidas por un esclavo del maestro no se loguean en el log binario a no ser que se especifique --log-slave-updates, el log binario en cada esclavo est vaco. Si por alguna razn M no est disponible puede hacer que uno de los esclavos sea el nuevo maestro. Por ejemplo, si elige S1, todos los WC deben redirigirse a S1, y S2 y S3 deben replicar de S1. Asegrese que todos los esclavos han procesado cualquier comando en su log retardado. En cada esclavo, ejecute STOP SLAVE IO_THREAD, luego chequee la salida de SHOW PROCESSLIST hasta que vea Has read all relay log. Mientras que esto es cierto para todos los esclavos, pueden reconfigurarse para una nueva configuracin. En el esclavo S1 se promociona a ser el maestro, ejecute STOP SLAVE y RESET MASTER. En los otros esclavos S2 y S3, use STOP SLAVE y CHANGE MASTER TO MASTER_HOST='S1' (donde 'S1' representa el nombre de equipo de S1). Para CHANGE MASTER, aada toda la informacin acerca de cmo conectar a S1 desde S2 o S3 (user, password, port). En CHANGE MASTER, no es necesario especificar el nombre del log binario de S1 o la posicin del log desde la que hay que leer: Sabemos que es el primer log binario y la posicin 4, que son los defectos para CHANGE MASTER. Finalmente, use START SLAVE en S2 y S3.
383
Luego ensee a todos los WC a dirigir sus comandos a S1. Desde ese punto, todos los comandos de actualizacin enviados de WC a S1 se escriben en el log binario de S1, que contiene cada comando de actualizacin enviado S1 desde que M muri. El resultado es esta configuracin:
WC / | WC | M(unavailable) \ | \ | v v S1<--S2 S3 ^ | +-------+
Cuando M est activo otra vez, debe ejecutar en la misma mquina CHANGE MASTER como el ejecutado en S2 y S3, as que M llega a ser un esclavo de S1 y recoge todos las escrituras de WC que se ha perdido mientras no estaba activo. Para hacer que M sea un maestro de nuevo (debido a que es la mquina ms rpida, por ejemplo), use el anterior protocolo como si S1 no estuviera disponible y M fuera a ser el nuevo maestro. Durante este procedimiento, no olvide ejecutar RESET MASTER en M antes de hacer S1, S2, y S3 esclavos de M. De otro modo, ellos podran recober antiguas escrituras de WC desde el punto en que M dej de estar disponible. Estamos trabajando en integrar un sistema de eleccin de maestro automtico en MySQL, pero hasta que est preparado, debe crear sus propias herramientas de monitoreo.
384
1. Determine si la tabla del esclavo es distinta a la del maestro. Trate de entender cmo ha ocurrido. Luego haga que la tabla del esclavo sea idntica a la del maestro y ejecute START SLAVE. 2. Si el paso precedente no funciona o no se aplica, trate de entender si sera seguro hacer una actualizacin manual (si es necesario) y luego ignorar el siguiente comando del maestro. 3. Si decide que puede evitar el siguiente comando del maestro, ejecute los siguientes comandos:
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n; mysql> START SLAVE;
El valor de n debe ser 1 si el siguiente comando del maestro no usa AUTO_INCREMENT o LAST_INSERT_ID(). De otro modo, el valor debe ser 2. La razn para usar un valor de 2 para comandos que usen AUTO_INCREMENT or LAST_INSERT_ID() es que toman dos eventos en el log binario del maestro. 4. Si est seguro que el esclavo arranc perfectamente sincronizado con el maestro, y que nadie ha actualizado las tablas involucradas fuera del flujo esclavo, entonces presumiblemente la discrepancia es producto de un bug. Si est ejecutando la versin ms reciente, reporte el problema. Si est ejecutando una versin antigua de MySQL, trate de actualizar a la ltima versin.
385
Una vez que ha recolectado la evidencia del problema, trate de isolarlo como un caso de test separado. Luego introduzca el problema en nuestra base de datos de bugs en http://bugs.mysql.com/ que es tanta informacin como sea posible.
386
387
Este captulo intenta explicar y da algunos ejemplos de las diferentes maneras de optimizar MySQL. Sin embargo se debe recordar que siempre existen vas de hacer todava ms rpido el sistema, aunque pudieran requerir un notable incremento de esfuerzos.
388
Para ms informacion acerca de esto, ver Seccin 1.7.6, Cmo trata MySQL las restricciones (Constraints) y Seccin 13.2.4, Sintaxis de INSERT o Seccin 5.3.2, El modo SQL del servidor.
389
que se aade la posibilidad de implementar un incremento dinmico de la cache y un aumento del tiempo de expiracin, hasta que las cosas regresen a la normalidad. En este caso, la informacin de creacin de la tabla debe contener informacin del tamao inicial de la cache y de la frecuencia de refresco de la tabla. Una alternativa para implementar una aplicacin en cache es usar la cache para consultas de MySQL. Habilitando la cache para consultas, el servidor toma los detalles de las consultas determinando qu resultados pueden ser reutilizados. Esto simplifica la aplicacin. Ver Seccin 5.12, La cach de consultas de MySQL.
390
Estas pruebas de rendimiento no son multi hilo, as que miden el tiempo mnimo para las operaciones realizadas. Se planea agregar en un futuro pruebas multi hilo al paquete. Para usar el paquete, deben satisfacerse los siguientes requisitos: El paquete de pruebas de rendimiento se proporciona con el cdigo fuente de la distribucin de MySQL. Tambin puede descargar una distribucin liberada de http://dev.mysql.com/downloads/, o usar nuestro repositorio de cdigo fuente(ver Seccin 2.8.3, Instalar desde el rbol de cdigo fuente de desarrollo). Los scripts de las pruebas de rendimiento estn escritos en Perl y usan el mdulo de Perl DBI para acceder a los servidores de bases de datos, as que DBI debe estar instalado. Tambin es necesario el controlador DBI especfico para cada servidor al que se quiere realizar las pruebas. Por ejemplo, para probar MySQL, PostgreSQL, y DB2, debe tener los mdulos DBD::mysql, DBD::Pg, and DBD::DB2 instalados. Ver Seccin 2.13, Notas sobre la instalacin de Perl. Una vez obtenido el cdigo fuente de la distribucin de MySQL, el paquete de pruebas de rendimiento se encuentra en el directorio sql-bench. Para ejecutar las pruebas de rendimiento, complese MySQL, vyase al directorio sql-bench y ejectese el script run-all-tests:
shell> cd sql-bench shell> perl run-all-tests --server=nombre_servidor
nombre_servidor debe ser uno de los servidores soportados. Para obtener la lista completa de opciones y servidores soportados, invquese el comando:
shell> perl run-all-tests --help
El script crash-me tambin est situado dentro del directorio sql-bench. crash-me intenta determinar qu caractersticas soporta una base de datos y cules son sus capacidades y limitaciones. Esto lo consigue ejecutando consultas. Determina por ejemplo: Cules tipos de columnas se soportan Cuntos ndicies se soportan Qu funciones se soportan Qu tamao puede alcanzar una consulta Que tamao puede alcanzar una columna VARCHAR Para ms informacin acerca de resultados de pruebas de rendimiento, vistese http://dev.mysql.com/ tech-resources/benchmarks/.
391
Es muy comn que un problema ocurra slo cuando el sistema est bajo mucha carga. Muchos de nuestros clientes nos contactan cuando tienen un sistema (probado) en produccin y encuentran problemas de carga. En la mayora de casos, los problemas de rendimiento se deben a cuestiones relacionadas con el diseo bsico de la base de datos (por ejemplo, lecturas completas de las tablas no son buenas bajo alta carga) o problemas con el sistema operativo o las bibliotecas. En la mayora de casos, esos problemas se solucionaran mucho ms fcilmente si los sistemas no estuvieran en produccin. Para evitar este tipo de problemas, es conveniente hacer pruebas de rendimiento a las aplicaciones enteras bajo la mayor carga de trabajo posible. Para ello, puede utilizarse Super Smack, disponible en http://jeremy.zawodny.com/mysql/super-smack/. Como su nombre indica, puede poner de rodillas a un sistema, as que asegrese de usarlo slo en sistemas de desarrollo.
Este resultado se obtuvo en un sistema Pentium II 400MHz. Muestra que MySQL puede ejecutar 1,000,000 de expresiones simples de suma en 0.32 segundo sobre ese sistema. Todas las funciones de MySQL deberan estar altamente optimizadas, pero pueden existir algunas excepciones. BENCHMARK() es una excelente herramienta para determinar si alguna funcin es un problema en una consulta.
O:
EXPLAIN SELECT opciones_de_select
La sentencia EXPLAIN puede utilizarse como un sinnimo de DESCRIBE o tambin como una manera para obtener informacin acerca de cmo MySQL ejecuta una sentencia SELECT: EXPLAIN nombre_de_tabla es sinnimo de DESCRIBE nombre_de_tabla o SHOW COLUMNS FROM nombre_de_tabla. Cuando se precede una sentencia SELECT con la palabra EXPLAIN, MySQL muestra informacin del optimizador sobre el plan de ejecucin de la sentencia. Es decir, MySQL explica cmo
392
procesara el SELECT, proporcionando tambin informacin acerca de cmo y en qu orden estn unidas (join) las tablas. Esta seccin trata sobre el segundo uso de EXPLAIN. EXPLAIN es una ayuda para decidir qu ndices agregar a las tablas, con el fin de que las sentencias SELECT encuentren registros ms rpidamente. EXPLAIN puede utilizarse tambin para verificar si el optimizador une (join) las tablas en el orden ptimo. Si no fuera as, se puede forzar al optimizador a unir las tablas en el orden en el que se especifican en la sentencia SELECT empezando la sentencia con SELECT STRAIGHT_JOIN en vez de simplemente SELECT. Si un ndice no est siendo utilizado por las sentencias SELECT cuando debiera, debe ejecutarse el comando ANALYZE TABLE, a fin de actualizar las estadsticas de la tabla como la cardinalidad de sus claves, que pueden afectar a la decisiones que el optimizador toma. Ver Seccin 13.5.2.1, Sintaxis de ANALYZE TABLE. EXPLAIN muestra una lnea de informacin para cada tabla utilizada en la sentencia SELECT. Las tablas se muestran en el mismo orden en el que MySQL las leera al procesar la consulta. MySQL resuelve todas las uniones (joins) usando un mtodo de single-sweep multi-join. Esto significa que MySQL lee un registro de la primera tabla; encuentra su correspondiente en la segunda tabla, en la tercera, y as sucesivamente. Cuando todas las tablas han sido procesadas, MySQL muestra las columnas seleccionadas y recorre a la inversa la lista de tablas hasta que encuentra aqulla para la que la sentencia devuelve ms registros. Se lee entonces el siguiente registro de esta tabla y el proceso contina con la siguiente tabla. EXPLAIN retorna una tabla; cada lnea de esta tabla muestra informacin acerca de una tabla, y tiene las siguientes columnas: id The SELECT identifier. This is the sequential number of the SELECT within the query. select_type The type of SELECT, which can be any of the following: SIMPLE Simple SELECT (not using UNION or subqueries) PRIMARY Outermost SELECT UNION Second or later SELECT statement in a UNION DEPENDENT UNION Second or later SELECT statement in a UNION, dependent on outer query UNION RESULT Result of a UNION. SUBQUERY First SELECT in subquery DEPENDENT SUBQUERY First SELECT in subquery, dependent on outer query
393
DERIVED Derived table SELECT (subquery in FROM clause) table The table to which the row of output refers. type The join type. The different join types are listed here, ordered from the best type to the worst: system The table has only one row (= system table). This is a special case of the const join type.
const The table has at most one matching row, which is read at the start of the query. Because there is only one row, values from the column in this row can be regarded as constants by the rest of the optimizer. const tables are very fast because they are read only once. const is used when you compare all parts of a PRIMARY KEY or UNIQUE index with constant values. In the following queries, tbl_name can be used as a const table:
SELECT * FROM tbl_name WHERE primary_key=1; SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;
eq_ref One row is read from this table for each combination of rows from the previous tables. Other than the const types, this is the best possible join type. It is used when all parts of an index are used by the join and the index is a PRIMARY KEY or UNIQUE index. eq_ref can be used for indexed columns that are compared using the = operator. The comparison value can be a constant or an expression that uses columns from tables that are read before this table. In the following examples, MySQL can use an eq_ref join to process ref_table:
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 All rows with matching index values are read from this table for each combination of rows from the previous tables. ref is used if the join uses only a leftmost prefix of the key or if the key is not a PRIMARY KEY or UNIQUE index (in other words, if the join cannot select a single row based on the key value). If the key that is used matches only a few rows, this is a good join type. ref can be used for indexed columns that are compared using the = or <=> operator. In the following examples, MySQL can use a ref join to process ref_table:
SELECT * FROM ref_table WHERE key_column=expr;
394
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 This join type is like ref, but with the addition that MySQL does an extra search for rows that contain NULL values. This join type optimization is used most often in resolving subqueries. In the following examples, MySQL can use a ref_or_null join to process ref_table:
SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;
See Seccin 7.2.7, Cmo optimiza MySQL IS NULL. index_merge This join type indicates that the Index Merge optimization is used. In this case, the key column contains a list of indexes used, and key_len contains a list of the longest key parts for the indexes used. For more information, see Seccin 7.2.6, Index Merge Optimization. unique_subquery This type replaces ref for some IN subqueries of the following form:
value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery is just an index lookup function that replaces the subquery completely for better efficiency. index_subquery This join type is similar to unique_subquery. It replaces IN subqueries, but it works for nonunique indexes in subqueries of the following form:
value IN (SELECT key_column FROM single_table WHERE some_expr)
range Only rows that are in a given range are retrieved, using an index to select the rows. The key column indicates which index is used. The key_len contains the longest key part that was used. The ref column is NULL for this type. range can be used for when a key column is compared to a constant using any of the =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, or IN operators:
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 395
This join type is the same as ALL, except that only the index tree is scanned. This usually is faster than ALL, because the index file usually is smaller than the data file. MySQL can use this join type when the query uses only columns that are part of a single index. ALL A full table scan is done for each combination of rows from the previous tables. This is normally not good if the table is the first table not marked const, and usually very bad in all other cases. Normally, you can avoid ALL by adding indexes that allow row retrieval from the table based on constant values or column values from earlier tables. possible_keys The possible_keys column indicates which indexes MySQL could use to find the rows in this table. Note that this column is totally independent of the order of the tables as displayed in the output from EXPLAIN. That means that some of the keys in possible_keys might not be usable in practice with the generated table order. If this column is NULL, there are no relevant indexes. In this case, you may be able to improve the performance of your query by examining the WHERE clause to see whether it refers to some column or columns that would be suitable for indexing. If so, create an appropriate index and check the query with EXPLAIN again. See Seccin 13.1.2, Sintaxis de ALTER TABLE. To see what indexes a table has, use SHOW INDEX FROM tbl_name. key The key column indicates the key (index) that MySQL actually decided to use. The key is NULL if no index was chosen. To force MySQL to use or ignore an index listed in the possible_keys column, use FORCE INDEX, USE INDEX, or IGNORE INDEX in your query. See Seccin 13.2.7, Sintaxis de SELECT. For MyISAM and BDB tables, running ANALYZE TABLE helps the optimizer choose better indexes. For MyISAM tables, myisamchk --analyze does the same. See Seccin 13.5.2.1, Sintaxis de ANALYZE TABLE and Seccin 5.8.3, Mantenimiento de tablas y recuperacin de un fallo catastrfico (crash). key_len The key_len column indicates the length of the key that MySQL decided to use. The length is NULL if the key column says NULL. Note that the value of key_len allows you to determine how many parts of a multiple-part key MySQL actually uses. ref The ref column shows which columns or constants are used with the key to select rows from the table. rows The rows column indicates the number of rows MySQL believes it must examine to execute the query. Extra This column contains additional information about how MySQL resolves the query. Here is an explanation of the different text strings that can appear in this column: Distinct 396
MySQL stops searching for more rows for the current row combination after it has found the first matching row. Not exists MySQL was able to do a LEFT JOIN optimization on the query and does not examine more rows in this table for the previous row combination after it finds one row that matches the LEFT JOIN criteria. Here is an example of the type of query that can be optimized this way:
SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;
Assume that t2.id is defined as NOT NULL. In this case, MySQL scans t1 and looks up the rows in t2 using the values of t1.id. If MySQL finds a matching row in t2, it knows that t2.id can never be NULL, and does not scan through the rest of the rows in t2 that have the same id value. In other words, for each row in t1, MySQL needs to do only a single lookup in t2, regardless of how many rows actually match in t2. range checked for each record (index map: #) MySQL found no good index to use, but found that some of indexes might be used once column values from preceding tables are known. For each row combination in the preceding tables, MySQL checks whether it is possible to use a range or index_merge access method to retrieve rows. The applicability criteria are as described in Seccin 7.2.5, Optimizacin de rango and Seccin 7.2.6, Index Merge Optimization, with the exception that all column values for the preceding table are known and considered to be constants. This is not very fast, but is faster than performing a join with no index at all. Using filesort MySQL needs to do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows according to the join type and storing the sort key and pointer to the row for all rows that match the WHERE clause. The keys then are sorted and the rows are retrieved in sorted order. See Seccin 7.2.10, Cmo optimiza MySQL ORDER BY. Using index The column information is retrieved from the table using only information in the index tree without having to do an additional seek to read the actual row. This strategy can be used when the query uses only columns that are part of a single index. Using temporary To resolve the query, MySQL needs to create a temporary table to hold the result. This typically happens if the query contains GROUP BY and ORDER BY clauses that list columns differently. Using where A WHERE clause is used to restrict which rows to match against the next table or send to the client. Unless you specifically intend to fetch or examine all rows from the table, you may have something wrong in your query if the Extra value is not Using where and the table join type is ALL or index. If you want to make your queries as fast as possible, you should look out for Extra values of Using filesort and Using temporary. Using sort_union(...), Using union(...), Using intersect(...) 397
These indicate how index scans are merged for the index_merge join type. See Seccin 7.2.6, Index Merge Optimization for more information. Using index for group-by Similar to the Using index way of accessing a table, Using index for group-by indicates that MySQL found an index that can be used to retrieve all columns of a GROUP BY or DISTINCT query without any extra disk access to the actual table. Additionally, the index is used in the most efficient way so that for each group, only a few index entries are read. For details, see Seccin 7.2.11, Cmo optimiza MySQL los GROUP BY. You can get a good indication of how good a join is by taking the product of the values in the rows column of the EXPLAIN output. This should tell you roughly how many rows MySQL must examine to execute the query. If you restrict queries with the max_join_size system variable, this product also is used to determine which multiple-table SELECT statements to execute. See Seccin 7.5.2, Afinar parmetros del servidor. The following example shows how a multiple-table join can be optimized progressively based on the information provided by EXPLAIN. Suppose that you have the SELECT statement shown here and you plan to examine it using 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;
For this example, make the following assumptions: The columns being compared have been declared as follows: Table tt tt tt et do Column ActualPC AssignedPC ClientID EMPLOYID CUSTNMBR Column Type CHAR(10) CHAR(10) CHAR(10) CHAR(15) CHAR(15)
Table tt tt tt et do
Index ActualPC AssignedPC ClientID EMPLOYID (primary key) CUSTNMBR (primary key)
Initially, before any optimizations have been performed, the EXPLAIN statement produces the following information:
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)
Because type is ALL for each table, this output indicates that MySQL is generating a Cartesian product of all the tables; that is, every combination of rows. This takes quite a long time, because the product of the number of rows in each table must be examined. For the case at hand, this product is 74 * 2135 * 74 * 3872 = 45,268,558,720 rows. If the tables were bigger, you can only imagine how long it would take. One problem here is that MySQL can use indexes on columns more efficiently if they are declared as the same type and size. In this context, VARCHAR and CHAR are considered the same if they are declared as the same size. Since tt.ActualPC is declared as CHAR(10) and et.EMPLOYID is CHAR(15), there is a length mismatch. To fix this disparity between column lengths, use ALTER TABLE to lengthen ActualPC from 10 characters to 15 characters:
mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);
tt.ActualPC and et.EMPLOYID are both VARCHAR(15). Executing the EXPLAIN statement again produces this result:
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
This is not perfect, but is much better: The product of the rows values is less by a factor of 74. This version is executed in a couple of seconds. A second alteration can be made to eliminate the column length mismatches for the tt.AssignedPC = et_1.EMPLOYID and tt.ClientID = do.CUSTNMBR comparisons:
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
This is almost as good as it can get. The remaining problem is that, by default, MySQL assumes that values in the tt.ActualPC column are evenly distributed, and that is not the case for the tt table. Fortunately, it is easy to tell MySQL to analyze the key distribution:
mysql> ANALYZE TABLE tt;
399
et et_1 do
Note that the rows column in the output from EXPLAIN is an educated guess from the MySQL join optimizer. You should check whether the numbers are even close to the truth. If not, you may get better performance by using STRAIGHT_JOIN in your SELECT statement and trying to list the tables in a different order in the FROM clause.
400
Constant folding:
(a<b AND b=c) AND a=5 -> b>5 AND b=c AND a=5
Constant expressions used by indexes are evaluated only once. COUNT(*) on a single table without a WHERE is retrieved directly from the table information for MyISAM and HEAP tables. This is also done for any NOT NULL expression when used with only one table. Early detection of invalid constant expressions. MySQL quickly detects that some SELECT statements are impossible and returns no rows. HAVING is merged with WHERE if you don't use GROUP BY or group functions (COUNT(), MIN(), and so on). For each table in a join, a simpler WHERE is constructed to get a fast WHERE evaluation for the table and also to skip records as soon as possible. The best join combination for joining the tables is found by trying all possibilities. If all columns in ORDER BY and GROUP BY clauses come from the same table, that table is preferred first when joining. If there is an ORDER BY clause and a different GROUP BY clause, or if the ORDER BY or GROUP BY contains columns from tables other than the first table in the join queue, a temporary table is created. If you use SQL_SMALL_RESULT, MySQL uses an in-memory temporary table. Each table index is queried, and the best index is used unless the optimizer believes that it is more efficient to use a table scan. At one time, a scan was used based on whether the best index spanned more than 30% of the table. The optimizer is more complex and bases its estimate on additional factors such as table size, number of rows, and I/O block size, so a fixed percentage no longer determines the choice between using an index or a scan. In some cases, MySQL can read rows from the index without even consulting the data file. If all columns used from the index are numeric, only the index tree is used to resolve the query. Before each record is output, those that do not match the HAVING clause are skipped. Some examples of queries that are very fast:
SELECT COUNT(*) FROM tbl_name;
401
Optimizacin de rango
SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name; SELECT MAX(key_part2) FROM tbl_name WHERE key_part1=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;
The following queries are resolved using only the index tree, assuming that the indexed columns are numeric:
SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val; SELECT COUNT(*) FROM tbl_name WHERE key_part1=val1 AND key_part2=val2; SELECT key_part2 FROM tbl_name GROUP BY key_part1;
The following queries use indexing to retrieve the rows in sorted order without a separate sorting pass:
SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,... ; SELECT ... FROM tbl_name ORDER BY key_part1 DESC, key_part2 DESC, ... ;
402
Optimizacin de rango
SELECT * FROM t1 WHERE key_col LIKE 'ab%' OR key_col BETWEEN 'bar' AND 'foo';
Note that some non-constant values may be converted to constants during the constant propagation phase. MySQL tries to extract range conditions from the WHERE clause for each of the possible indexes. During the extraction process, conditions that can't be used for constructing the range condition are dropped, conditions that produce overlapping ranges are combined, and conditions that produce empty ranges are removed. For example, consider the following statement, where key1 is an indexed column and nonkey is not indexed:
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');
The extraction process for key key1 is as follows: 1. Start with original WHERE clause:
(key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR (key1 < 'bar' AND nonkey = 4) OR (key1 < 'uux' AND key1 > 'z')
2. Remove nonkey = 4 and key1 LIKE '%b' because they cannot be used for a range scan. The right way to remove them is to replace them with TRUE, so that we don't miss any matching records when doing the range scan. Having replaced them with TRUE, we get:
(key1 < 'abc' AND (key1 LIKE 'abcde%' OR TRUE)) OR (key1 < 'bar' AND TRUE) OR (key1 < 'uux' AND key1 > 'z')
3. Collapse conditions that are always true or false: (key1 LIKE 'abcde%' OR TRUE) is always true (key1 < 'uux' AND key1 > 'z') is always false Replacing these conditions with constants, we get:
(key1 < 'abc' AND TRUE) OR (key1 < 'bar' AND TRUE) OR (FALSE)
4. Combining overlapping intervals into one yields the final condition to be used for the range scan:
(key1 < 'bar')
In general (and as demonstrated in the example), the condition used for a range scan is less restrictive than the WHERE clause. MySQL performs an additional check to filter out rows that satisfy the range condition but not the full WHERE clause. The range condition extraction algorithm can handle nested AND/OR constructs of arbitrary depth, and its output doesn't depend on the order in which conditions appear in WHERE clause.
403
Optimizacin de rango
For example, consider a multiple-part index defined as key1(key_part1, key_part2, key_part3), and the following set of key tuples listed in key order:
key_part1 NULL NULL NULL 1 1 1 2 key_part2 1 1 2 1 1 2 1 key_part3 'abc' 'xyz' 'foo' 'abc' 'xyz' 'abc' 'aaa'
The interval covers the 4th, 5th, and 6th tuples in the preceding data set and can be used by the range access method. By contrast, the condition key_part3 = 'abc' does not define a single interval and cannot be used by the range access method. The following descriptions indicate how range conditions work for multiple-part indexes in greater detail. For HASH indexes, each interval containing identical values can be used. This means that the interval can be produced only for conditions in the following form:
key_part1 cmp const1 AND key_part2 cmp const2 AND ... AND key_partN cmp constN;
Here, const1, const2, ... are constants, cmp is one of the =, <=>, or IS NULL comparison operators, and the conditions cover all index parts. (That is, there are N conditions, one for each part of an N-part index.) See Seccin 7.2.5.1, Mtodo de acceso a rango para ndices simples for the definition of what is considered to be a constant. For example, the following is a range condition for a three-part HASH index:
key_part1 = 1 AND key_part2 IS NULL AND key_part3 = 'foo'
For a BTREE index, an interval might be usable for conditions combined with AND, where each condition compares a key part with a constant value using =, <=>, IS NULL, >, <, >=, <=, !=, <>, BETWEEN, or LIKE 'pattern' (where 'pattern' does not start with a wildcard). An interval can be used as long as it is possible to determine a single key tuple containing all records that match the condition (or two intervals if <> or != is used). For example, for this condition:
key_part1 = 'foo' AND key_part2 >= 10 AND key_part3 > 10
It is possible that the created interval contains more records than the initial condition. For example, the preceding interval includes the value ('foo', 11, 0), which does not satisfy the original condition. If conditions that cover sets of records contained within intervals are combined with OR, they form a condition that covers a set of records contained within the union of their intervals. If the conditions 404
are combined with AND, they form a condition that covers a set of records contained within the intersection of their intervals. For example, for this condition on a two-part index:
(key_part1 = 1 AND key_part2 < 2) OR (key_part1 > 5)
In this example, the interval on the first line uses one key part for the left bound and two key parts for the right bound. The interval on the second line uses only one key part. The key_len column in the EXPLAIN output indicates the maximum length of the key prefix used. In some cases, key_len may indicate that a key part was used, but that might be not what you would expect. Suppose that key_part1 and key_part2 can be NULL. Then the key_len column displays two key part lengths for the following condition:
key_part1 >= 1 AND key_part2 < 2
Seccin 7.2.5.1, Mtodo de acceso a rango para ndices simples describes how optimizations are performed to combine or eliminate intervals for range conditions on single-part index. Analogous steps are performed for range conditions on multiple-part keys.
The Index Merge method has several access algorithms (seen in the Extra field of EXPLAIN output): intersection union sort-union
405
The following sections describe these methods in greater detail. Note: The Index Merge optimization algorithm has the following known deficiencies: If a range scan is possible on some key, an Index Merge is not considered. For example, consider this query:
SELECT * FROM t1 WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;
For this query, two plans are possible: 1. An Index Merge scan using the (goodkey1 < 10 OR goodkey2 < 20) condition. 2. A range scan using the badkey < 30 condition. However, the optimizer only considers the second plan. If that is not what you want, you can make the optimizer consider index_merge by using IGNORE INDEX or FORCE INDEX. The following queries are executed using Index Merge:
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;
If your query has a complex WHERE clause with deep AND/OR nesting and MySQL doesn't choose the optimal plan, try distributing terms using the following identity laws:
(x AND y) OR z = (x OR z) AND (y OR z) (x OR y) AND z = (x AND z) OR (y AND z)
The choice between different possible variants of the index_merge access method and other access methods is based on cost estimates of various available options.
Any range condition over a primary key of an InnoDB or BDB table. Here are some examples:
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;
The Index Merge intersection algorithm performs simultaneous scans on all used indexes and produces the intersection of row sequences that it receives from the merged index scans. If all columns used in the query are covered by the used indexes, full table records are not retrieved and (EXPLAIN output contains Using index in Extra field in this case). Here is an example of such query:
SELECT COUNT(*) FROM t1 WHERE key1=1 AND key2=1;
If the used indexes don't cover all columns used in the query, full records are retrieved only when the range conditions for all used keys are satisfied. If one of the merged conditions is a condition over a primary key of an InnoDB or BDB table, it is not used for record retrieval, but is used to filter out records retrieved using other conditions.
406
Any range condition over a primary key of an InnoDB or BDB table. A condition for which the Index Merge method intersection algorithm is applicable. Here are some examples:
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;
The difference between the sort-union algorithm and the union algorithm is that the sort-union algorithm must first fetch row IDs for all records and sort them before returning any records.
If a WHERE clause includes a col_name IS NULL condition for a column that is declared as NOT NULL, that expression is optimized away. This optimization does not occur in cases when the column might produce NULL anyway; for example, if it comes from a table on the right side of a LEFT JOIN. MySQL 5.0 can also optimize the combination col_name = expr AND col_name IS NULL, a form that is common in resolved subqueries. EXPLAIN shows ref_or_null when this optimization is used. This optimization can handle one IS NULL for any key part. Some examples of queries that are optimized, assuming that there is an index on columns a and b of table t2:
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
407
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 works by first doing a read on the reference key, and then a separate search for rows with a NULL key value. Note that the optimization can handle only one IS NULL level. In the following query, MySQL uses key lookups only on the expression (t1.a=t2.a AND t2.a IS NULL) and is not able to use the key part on b:
SELECT * FROM t1, t2 WHERE (t1.a=t2.a AND t2.a IS NULL) OR (t1.b=t2.b AND t2.b IS NULL);
Due to this equivalence, the optimizations applicable to GROUP BY queries can be also applied to queries with a DISTINCT clause. Thus, for more details on the optimization possibilities for DISTINCT queries, see Seccin 7.2.11, Cmo optimiza MySQL los GROUP BY. When combining LIMIT row_count with DISTINCT, MySQL stops as soon as it finds row_count unique rows. If you don't use columns from all tables named in a query, MySQL stops scanning the not-used tables as soon as it finds the first match. In the following case, assuming that t1 is used before t2 (which you can check with EXPLAIN), MySQL stops reading from t2 (for any particular row in t1) when the first row in t2 is found:
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;
408
If there is a row in A that matches the WHERE clause, but there is no row in B that matches the ON condition, an extra B row is generated with all columns set to NULL. If you use LEFT JOIN to find rows that don't exist in some table and you have the following test: col_name IS NULL in the WHERE part, where col_name is a column that is declared as NOT NULL, MySQL stops searching for more rows (for a particular key combination) after it has found one row that matches the LEFT JOIN condition. RIGHT JOIN is implemented analogously to LEFT JOIN, with the roles of the tables reversed. The join optimizer calculates the order in which tables should be joined. The table read order forced by LEFT JOIN and STRAIGHT_JOIN helps the join optimizer do its work much more quickly, because there are fewer table permutations to check. Note that this means that if you do a query of the following type, MySQL does a full scan on B because the LEFT JOIN forces it to be read before d:
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;
The fix in this case is reverse the order in a and b are listed in the FROM clause:
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) WHERE b.key=d.key;
MySQL 5.0 performs the following LEFT JOIN optimization: If the WHERE condition is always false for the generated NULL row, the LEFT JOIN is changed to a normal join. For example, the WHERE clause would be false in the following query if t2.column1 were NULL:
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
This can be made faster because MySQL can use table t2 before table t1 if this would result in a better query plan. To force a specific table order, use STRAIGHT_JOIN.
In some cases, MySQL cannot use indexes to resolve the ORDER BY, although it still uses indexes to find the rows that match the WHERE clause. These cases include the following: You use ORDER BY on different keys:
SELECT * FROM t1 ORDER BY key1, key2;
409
The key used to fetch the rows is not the same as the one used in the ORDER BY:
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
You are joining many tables, and the columns in the ORDER BY are not all from the first non-constant table that is used to retrieve rows. (This is the first table in the EXPLAIN output that doesn't have a const join type.) You have different ORDER BY and GROUP BY expressions. The type of table index used doesn't store rows in order. For example, this is true for a HASH index in a HEAP table. With EXPLAIN SELECT ... ORDER BY, you can check whether MySQL can use indexes to resolve the query. It cannot if you see Using filesort in the Extra column. See Seccin 7.2.1, Sintaxis de EXPLAIN (Obtener informacin acerca de un SELECT). In MySQL 5.0, a filesort optimization is used that records not only the sort key value and row position, but the columns required for the query as well. This avoids reading the rows twice. The filesort algorithm works like this: 1. Read the rows that match the WHERE clause, as before. 2. For each row, record a tuple of values consisting of the sort key value and row position, and also the columns required for the query. 3. Sort the tuples by sort key value 4. Retrieve the rows in sorted order, but read the required columns directly from the sorted tuples rather than by accessing the table a second time. This algorithm represents an improvement over that used in some older versions of MySQL. To avoid a slowdown, this optimization is used only if the total size of the extra columns in the sort tuple does not exceed the value of the max_length_for_sort_data system variable. (A symptom of setting the value of this variable too high is that you see high disk activity and low CPU activity.) If you want to increase ORDER BY speed, first see whether you can get MySQL to use indexes rather than an extra sorting phase. If this is not possible, you can try the following strategies: Increase the size of the sort_buffer_size variable. Increase the size of the read_rnd_buffer_size variable. Change tmpdir to point to a dedicated filesystem with large amounts of empty space. In MySQL 5.0, this option accepts several paths that are used in round-robin fashion. Paths should be separated by colon characters (':') on Unix and semicolon characters (';') on Windows, NetWare, and OS/2. You can use this feature to spread the load across several directories. Note: The paths should be for directories in filesystems that are located on different physical disks, not different partitions on the same disk. By default, MySQL sorts all GROUP BY col1, col2, ... queries as if you specified ORDER BY col1, col2, ... in the query as well. If you include an ORDER BY clause explicitly that contains the same column list, MySQL optimizes it away without any speed penalty, although the sorting still occurs. If a query includes GROUP BY but you want to avoid the overhead of sorting the result, you can suppress sorting by specifying ORDER BY NULL. For example:
INSERT INTO foo SELECT a, COUNT(*) FROM bar GROUP BY a ORDER BY NULL;
410
The most general way to satisfy a GROUP BY clause is to scan the whole table and create a new temporary table where all rows from each group are consecutive, and then use this temporary table to discover groups and apply aggregate functions (if any). In some cases, MySQL is able to do much better than that and to avoid creation of temporary tables by using index access. The most important preconditions for using indexes for GROUP BY are that all GROUP BY columns reference attributes from the same index, and the index stores its keys in order (for example, this is a B-Tree index, and not a HASH index). Whether usage of temporary tables can be replaced by index access also depends on which parts of an index are used in a query, the conditions specified for these parts, and the selected aggregate functions. There are two ways to execute a GROUP BY query via index access, as detailed in the following sections. In the first method, the grouping operation is applied together with all range predicates (if any). The second method first performs a range scan, and then groups the resulting tuples.
The following queries cannot be executed with this quick select method, for the reasons given: There are other aggregate functions than MIN() or MAX(), for example:
SELECT c1, SUM(c2) FROM t1 GROUP BY c1;
The fields in the GROUP BY clause do not refer to the beginning of the index, as shown here:
SELECT c1,c2 FROM t1 GROUP BY c2, c3;
411
The query refers to a part of a key that comes after the GROUP BY part, and for which there is no equality with a constant, an example being:
SELECT c1,c3 FROM t1 GROUP BY c1, c2;
The GROUP BY does not begin with the first part of the key, but there is a condition that provides a constant for that part:
SELECT c1, c2, c3 FROM t1 WHERE c1 = 'a' GROUP BY c2, c3;
412
LIMIT 0 quickly returns an empty set. This can be useful for checking the validity of a query. When using one of the MySQL APIs, it can also be employed for obtaining the types of the result columns. (This trick does not work in the MySQL Monitor, which merely displays Empty set in such cases; you should instead use SHOW COLUMNS or DESCRIBE for this purpose.) When the server uses temporary tables to resolve the query, the LIMIT row_count clause is used to calculate how much space is required.
Start mysqld with the --max-seeks-for-key=1000 option or use SET max_seeks_for_key=1000 to tell the optimizer to assume that no key scan causes more than 1,000 key seeks. See Seccin 5.3.3, Variables de sistema del servidor.
413
The size of the table slows down the insertion of indexes by log N, assuming B-tree indexes. You can use the following methods to speed up inserts: If you are inserting many rows from the same client at the same time, use INSERT statements with multiple VALUES lists to insert several rows at a time. This is considerably faster (many times faster in some cases) than using separate single-row INSERT statements. If you are adding data to a nonempty table, you may tune the bulk_insert_buffer_size variable to make data insertion even faster. See Seccin 5.3.3, Variables de sistema del servidor. If you are inserting a lot of rows from different clients, you can get higher speed by using the INSERT DELAYED statement. See Seccin 13.2.4, Sintaxis de INSERT. With MyISAM tables you can insert rows at the same time that SELECT statements are running if there are no deleted rows in the tables. When loading a table from a text file, use LOAD DATA INFILE. This is usually 20 times faster than using a lot of INSERT statements. See Seccin 13.2.5, Sintaxis de LOAD DATA INFILE. With some extra work, it is possible to make LOAD DATA INFILE run even faster when the table has many indexes. Use the following procedure: 1. Optionally create the table with CREATE TABLE. 2. Execute a FLUSH TABLES statement or a mysqladmin flush-tables command. 3. Use myisamchk --keys-used=0 -rq /path/to/db/tbl_name. This removes all use of indexes for the table. 4. Insert data into the table with LOAD DATA INFILE. This does not update any indexes and therefore is very fast. 5. If you intend only to read from the table in the future, use myisampack to compress it. See Seccin 14.1.3.3, Caractersticas de las tablas comprimidas. 6. Re-create the indexes with myisamchk -r -q /path/to/db/tbl_name. This creates the index tree in memory before writing it to disk, which is much faster because it avoids lots of disk seeks. The resulting index tree is also perfectly balanced. 7. Execute a FLUSH TABLES statement or a mysqladmin flush-tables command. Note that LOAD DATA INFILE also performs the preceding optimization if you insert into an empty MyISAM table; the main difference is that you can let myisamchk allocate much more temporary memory for the index creation than you might want the server to allocate for index re-creation when it executes the LOAD DATA INFILE statement. In MySQL 5.0, you can also use ALTER TABLE tbl_name DISABLE KEYS instead of myisamchk --keys-used=0 -rq /path/to/db/tbl_name and ALTER TABLE tbl_name ENABLE KEYS instead of myisamchk -r -q /path/to/db/tbl_name. In this way, you can also skip the FLUSH TABLES steps. You can speed up INSERT operations that are done with multiple statements by locking your tables:
LOCK TABLES a WRITE; INSERT INTO a VALUES (1,23),(2,34),(4,33); INSERT INTO a VALUES (8,26),(6,29); UNLOCK TABLES;
This benefits performance because the index buffer is flushed to disk only once, after all INSERT statements have completed. Normally there would be as many index buffer flushes as there are INSERT statements. Explicit locking statements are not needed if you can insert all rows with a single statement.
414
For transactional tables, you should use BEGIN and COMMIT instead of LOCK TABLES to obtain faster insertions. Locking also lowers the total time of multiple-connection tests, although the maximum wait time for individual connections might go up because they wait for locks. For example:
Connection 1 does 1000 inserts Connections 2, 3, and 4 do 1 insert Connection 5 does 1000 inserts
If you don't use locking, connections 2, 3, and 4 finish before 1 and 5. If you use locking, connections 2, 3, and 4 probably do not finish before 1 or 5, but the total time should be about 40% faster. INSERT, UPDATE, and DELETE operations are very fast in MySQL, but you can obtain better overall performance by adding locks around everything that does more than about five inserts or updates in a row. If you do very many inserts in a row, you could do a LOCK TABLES followed by an UNLOCK TABLES once in a while (about each 1,000 rows) to allow other threads access to the table. This would still result in a nice performance gain. INSERT is still much slower for loading data than LOAD DATA INFILE, even when using the strategies just outlined. To get some more speed for MyISAM tables, for both LOAD DATA INFILE and INSERT, enlarge the key cache by increasing the key_buffer_size system variable. See Seccin 7.5.2, Afinar parmetros del servidor.
415
Try to avoid complex SELECT queries on MyISAM tables that are updated frequently, to avoid problems with table locking that occur due to contention between readers and writers. With MyISAM tables that have no deleted rows, you can insert rows at the end at the same time that another query is reading from the table. If this is important for you, you should consider using the table in ways that avoid deleting rows. Another possibility is to run OPTIMIZE TABLE after you have deleted a lot of rows. Use ALTER TABLE ... ORDER BY expr1, expr2, ... if you mostly retrieve rows in expr1, expr2, ... order. By using this option after extensive changes to the table, you may be able to get higher performance. In some cases, it may make sense to introduce a column that is hashed based on information from other columns. If this column is short and reasonably unique, it may be much faster than a big index on many columns. In MySQL, it is very easy to use this extra column:
SELECT * FROM tbl_name WHERE hash_col=MD5(CONCAT(col1,col2)) AND col1='constant' AND col2='constant';
For MyISAM tables that change a lot, you should try to avoid all variable-length columns (VARCHAR, BLOB, and TEXT). The table uses dynamic record format if it includes even a single variable-length column. See Captulo 14, Motores de almacenamiento de MySQL y tipos de tablas. It is normally not useful to split a table into different tables just because rows become large. To access a row, the biggest performance hit is the disk seek to find the first byte of the row. After finding the data, most modern disks can read the entire row quickly enough for most applications. The only case in which it is advantageous to split up a table is if the table is a MyISAM table with dynamic record format (see above) that you can change to a fixed record size, or if you very often need to scan the table but do not need most of the columns. See Captulo 14, Motores de almacenamiento de MySQL y tipos de tablas. If you often need to calculate results such as counts based on information from a lot of rows, it may be preferable to introduce a new table and update the counter in real time. An update of the following form is very fast:
UPDATE tbl_name SET count_col=count_col+1 WHERE key_col=constant;
This is important when you use a MySQL storage engine such as MyISAM that has only tablelevel locking (multiple readers / single writers). This gives better performance with most databases, because the row locking manager in this case has less to do. If you need to collect statistics from large log tables, use summary tables instead of scanning the entire log table. Maintaining the summaries should be much faster than trying to calculate statistics live. Regenerating new summary tables from the logs when things change (depending on business decisions) is faster than changing the running application. If possible, you should classify reports as live or as statistical, where data needed for statistical reports is created only from summary tables that are generated periodically from the live data. When possible, take advantage columns' default values to insert values explicitly only when the value to be inserted differs from the default. This reduces the amount parsing required of MySQL and so improves the speed of insert operations. In some cases, it is convenient to pack and store data into a BLOB column. In this case, you must provide code in your application to pack and unpack information, but this may save a lot of accesses at some stage. This is practical when you have data that does not conform well to a rows-andcolumns table structure. Normally, you should try to keep all data non-redundant (observing what is referred to in database theory as third normal form ). However, there may be situations in which it can be advantageous to duplicate information or create summary tables in order to gain more speed.
416
Stored procedures or UDFs (user-defined functions) may be a good way to gain performance for some tasks. See Captulo 19, Procedimientos almacenados y funciones and Seccin 27.2, Aadir nuevas funciones a MySQL for more information about these. You can always gain something by caching queries or answers in your application and then performing many inserts or updates together. If your database supports table locks (like MySQL and Oracle), this should help to ensure that the index cache is only flushed once after all updates. You can also take advantage of MySQL's query cache to achieve similar results; see Seccin 5.12, La cach de consultas de MySQL. Use INSERT DELAYED when you do not need to know when your data is written. This speeds things up because many records can be written with a single disk write. Use INSERT LOW_PRIORITY when you want to give SELECT statements higher priority than your inserts. Use SELECT HIGH_PRIORITY to get retrievals that jump the queue. That is, the SELECT is executed even if there is another client waiting to do a write. Use multiple-row INSERT statements to store many rows with one SQL statement (many SQL servers support this, including MySQL). Use LOAD DATA INFILE to load large amounts of data. This is faster than using INSERT statements. Use AUTO_INCREMENT columns to generate unique values. Use OPTIMIZE TABLE once in a while to avoid fragmentation with MyISAM tables when using a dynamic table format. See Seccin 14.1.3, Formatos de almacenamiento de tablas MyISAM. Use MEMORY tables when possible to get more speed. See Seccin 14.3, El motor de almacenamiento MEMORY (HEAP). With Web servers, images and other binary assets should normally be stored as files. That is, store only a reference to the file rather than the file itself in the database. Most Web servers are better at caching files than database contents, so using files is generally faster. Use in-memory tables for non-critical data that is accessed often, such as information about the last displayed banner for users who don't have cookies enabled in their Web browser. User sessions are another alternative available in many Web application environments for handling volatile state data. Columns with identical information in different tables should be declared to have identical data types. Try to keep column names simple. For example, in a table named customer, use a column name of name instead of customer_name. To make your names portable to other SQL servers, you should keep them shorter than 18 characters. If you need really high speed, you should take a look at the low-level interfaces for data storage that the different SQL servers support. For example, by accessing the MySQL MyISAM storage engine directly, you could get a speed increase of two to five times compared to using the SQL interface. To be able to do this, the data must be on the same server as the application, and usually it should only be accessed by one process (because external file locking is really slow). One could eliminate these problems by introducing low-level MyISAM commands in the MySQL server (this could be one easy way to get more performance if needed). By carefully designing the database interface, it should be quite easy to support this types of optimization. If you are using numerical data, it is faster in many cases to access information from a database (using a live connection) than to access a text file. Information in the database is likely to be stored in a more compact format than in the text file, so accessing it involves fewer disk accesses. You also save code in your application because you don't have to parse your text files to find line and column boundaries.
417
Replication can provide performance benefits for some operations. You can distribute client retrievals among replication servers to split up the load. To avoid slowing down the master while making backups, you can make backups using a slave server. See Captulo 6, Replicacin en MySQL. Declaring a MyISAM table with the DELAY_KEY_WRITE=1 table option makes index updates faster because they are not flushed to disk until the table is closed. The downside is that if something kills the server while such a table is open, you should ensure that they are okay by running the server with the --myisam-recover option, or by running myisamchk before restarting the server. (However, even in this case, you should not lose anything by using DELAY_KEY_WRITE, because the key information can always be generated from the data rows.)
You can freely mix concurrent INSERT and SELECT statements for a MyISAM table without locks if the INSERT statements are non-conflicting. That is, you can insert rows into a MyISAM table at the
418
Mtodos de bloqueo
same time other clients are reading from it. No conflict occurs if the data file contains no free blocks in the middle, because in that case, records always are inserted at the end of the data file. (Holes can result from rows having been deleted from or updated in the middle of the table.) If there are holes, concurrent inserts are re-enabled automatically when all holes have been filled with new data. If you want to do many INSERT and SELECT operations on a table when concurrent inserts are not possible, you can insert rows in a temporary table and update the real table with the records from the temporary table once in a while. This can be done with the following code:
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 uses row locks and BDB uses page locks. For these two storage engines, deadlocks are possible. This is because InnoDB automatically acquires row locks and BDB acquires page locks during the processing of SQL statements, not at the start of the transaction. Advantages of row-level locking: Fewer lock conflicts when accessing different rows in many threads. Fewer changes for rollbacks. Makes it possible to lock a single row a long time. Disadvantages of row-level locking: Takes more memory than page-level or table-level locks. Is slower than page-level or table-level locks when used on a large part of the table because you must acquire many more locks. Is definitely much worse than other locks if you often do GROUP BY operations on a large part of the data or if you often must scan the entire table. With higher-level locks, you can also more easily support locks of different types to tune the application, because the lock overhead is less than for row-level locks. Table locks are superior to page-level or row-level locks in the following cases: Most statements for the table are reads. Reads and updates on strict keys, where you update or delete a row that can be fetched with a single key read:
UPDATE tbl_name SET column=value WHERE unique_key_col=key_value; DELETE FROM tbl_name WHERE unique_key_col=key_value;
SELECT combined with concurrent INSERT statements, and very few UPDATE or DELETE statements. Many scans or GROUP BY operations on the entire table without any writers. Options other than row-level or page-level locking: Versioning (such as that used in MySQL for concurrent inserts) where it is possible to have one writer at the same time as many readers. This means that the database or table supports different views for the data depending on when access begins. Other common terms for this are time travel, copy on write, or copy on demand. Copy on demand is in many cases superior to page-level or row-level locking. However, in the worst case, it can use much more memory than using normal locks.
419
Instead of using row-level locks, you can employ application-level locks, such as GET_LOCK() and RELEASE_LOCK() in MySQL. These are advisory locks, so they work only in well-behaved applications.
420
If you have problems with INSERT combined with SELECT, you might want to consider switching MyISAM tables, which support concurrent SELECT and INSERT statements. If you mix inserts and deletes on the same table, INSERT DELAYED may be of great help. See Seccin 13.2.4.2, Sintaxis de INSERT DELAYED. If you have problems with mixed SELECT and DELETE statements, the LIMIT option to DELETE may help. See Seccin 13.2.1, Sintaxis de DELETE. Using SQL_BUFFER_RESULT with SELECT statements can help to make the duration of table locks shorter. See Seccin 13.2.7, Sintaxis de SELECT. You could change the locking code in mysys/thr_lock.c to use a single queue. In this case, write locks and read locks would have the same priority, which might help some applications. Here are some tips concerning table locks in MySQL: Concurrent users are not a problem if you don't mix updates with selects that need to examine many rows in the same table. You can use LOCK TABLES to increase speed, as many updating within a single lock is much faster than updating without locks. Splitting table contents into separate tables may also help. If you encounter speed problems with table locks in MySQL, you may be able to improve performance by converting some of your tables to InnoDB or BDB tables. See Captulo 15, El motor de almacenamiento InnoDB. See Seccin 14.4, El motor de almacenamiento BDB (BerkeleyDB).
421
ndices de columna
require less main memory while their contents are being actively processed during query execution. Indexing also is a lesser resource burden if done on smaller columns. MySQL supports a lot of different table types and row formats. For each table, you can decide which storage/index method to use. Choosing the right table format for your application may give you a big performance gain. See Captulo 14, Motores de almacenamiento de MySQL y tipos de tablas. You can get better performance on a table and minimize storage space using the techniques listed here: Use the most efficient (smallest) data types possible. MySQL has many specialized types that save disk space and memory. Use the smaller integer types if possible to get smaller tables. For example, MEDIUMINT is often a better choice than INT since a MEDIUMINT column uses 25% less space. Declare columns to be NOT NULL if possible. It makes everything faster and you save one bit per column. If you really need NULL in your application, you should definitely use it. Just avoid having it on all columns by default. For MyISAM tables, if you do not have any variable-length columns (VARCHAR, TEXT, or BLOB columns), a fixed-size record format is used. This is faster but unfortunately may waste some space. See Seccin 14.1.3, Formatos de almacenamiento de tablas MyISAM. You can hint that you want to have fixed length rows even if you have VARCHAR columns with the CREATE option ROW_FORMAT=fixed. Starting with MySQL/InnoDB 5.0.3, InnoDB tables use a more compact storage format. In earlier versions of MySQL, InnoDB records contain some redundant information, such as the number of columns and the length of each column, even for fixed-size columns. By default, tables are created in the compact format (ROW_FORMAT=COMPACT). If you wish to downgrade to older versions of MySQL/ InnoDB, you can request the old format with ROW_FORMAT=REDUNDANT. The compact InnoDB format also changes the way how CHAR columns containing UTF-8 data are stored. In the ROW_FORMAT=REDUNDANT format, a UTF-8 CHAR(n) occupies 3*n bytes, given that the maximum length of a UTF-8 encoded character is 3 bytes. Since many languages can be written mostly with single-byte UTF-8 characters, a fixed storage length often wastes space. The ROW_FORMAT=COMPACT format allocates a variable amount of n..3*n bytes for these columns by stripping trailing spaces if necessary. The minimum storage length is kept as n bytes in order to facilitate in-place updates in typical cases. The primary index of a table should be as short as possible. This makes identification of each row easy and efficient. Create only the indexes that you really need. Indexes are good for retrieval but bad when you need to store data quickly. If you access a table mostly by searching on a combination of columns, make an index on them. The first index part should be the most used column. If you always use many columns when selecting from the table, you should use the column with more duplicates first to obtain better compression of the index. If it is very likely that a column has a unique prefix on the first number of characters, it is better to index only this prefix. MySQL supports an index on the leftmost part of a character column. Shorter indexes are faster not only because they take less disk space, but also because they give you more hits in the index cache and thus fewer disk seeks. See Seccin 7.5.2, Afinar parmetros del servidor. In some circumstances, it can be beneficial to split into two a table that is scanned very often. This is especially true if it is a dynamic format table and it is possible to use a smaller static format table that can be used to find the relevant rows when scanning the table.
All MySQL column types can be indexed. Use of indexes on the relevant columns is the best way to improve the performance of SELECT operations. The maximum number of indexes per table and the maximum index length is defined per storage engine. See Captulo 14, Motores de almacenamiento de MySQL y tipos de tablas. All storage engines support at least 16 indexes per table and a total index length of at least 256 bytes. Most storage engines have higher limits. With col_name(length) syntax in an index specification, you can create an index that uses only the first length characters of a CHAR or VARCHAR column. Indexing only a prefix of column values like this can make the index file much smaller. The MyISAM and InnoDB storage engines also support indexing on BLOB and TEXT columns. When indexing a BLOB or TEXT column, you must specify a prefix length for the index. For example:
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
Im MySQL 5.0, prefixes can be up to 1000 bytes long for MyISAM and InnoDB tables. Note that prefix limits are measured in bytes, whereas the prefix length in CREATE TABLE statements is interpreted as number of characters. Be sure to take this into account when specifying a prefix length for a column that uses a multi-byte character set. You can also create FULLTEXT indexes. These are used for full-text searches. In MySQL 5.0, only the MyISAM storage engine supports FULLTEXT indexes and only for CHAR, VARCHAR, and TEXT columns. Indexing always takes place over the entire column and partial (prefix) indexing is not supported. See Seccin 12.7, Funciones de bsqueda de texto completo (Full-Text) for details. In MySQL 5.0, you can also create indexes on spatial column types. Spatial types are supported only by the MyISAM storage engine. Spatial indexes use R-trees. The MEMORY (HEAP) storage engine uses hash indexes by default, but also supports B-tree indexes in MySQL 5.0.
The name index is an index over last_name and first_name. The index can be used for queries that specify values in a known range for last_name, or for both last_name and first_name. Therefore, the name index is used in the following queries:
SELECT * FROM test WHERE last_name='Widenius'; SELECT * FROM test WHERE last_name='Widenius' AND first_name='Michael';
423
SELECT * FROM test WHERE last_name='Widenius' AND (first_name='Michael' OR first_name='Monty'); SELECT * FROM test WHERE last_name='Widenius' AND first_name >='M' AND first_name < 'N';
The manner in which MySQL uses indexes to improve query performance is discussed further in the next section.
To sort or group a table if the sorting or grouping is done on a leftmost prefix of a usable key (for example, ORDER BY key_part1, key_part2). If all key parts are followed by DESC, the key is read in reverse order. See Seccin 7.2.10, Cmo optimiza MySQL ORDER BY. In some cases, a query can be optimized to retrieve values without consulting the data rows. If a query uses only columns from a table that are numeric and that form a leftmost prefix for some key, the selected values may be retrieved from the index tree for greater speed:
SELECT key_part3 FROM tbl_name
424
WHERE key_part1=1
If a multiple-column index exists on col1 and col2, the appropriate rows can be fetched directly. If separate single-column indexes exist on col1 and col2, the optimizer tries to find the most restrictive index by deciding which index finds fewer rows and using that index to fetch the rows. If the table has a multiple-column index, any leftmost prefix of the index can be used by the optimizer to find rows. For example, if you have a three-column index on (col1, col2, col3), you have indexed search capabilities on (col1), (col1, col2), and (col1, col2, col3). MySQL cannot use a partial index if the columns do not form a leftmost prefix of the index. Suppose that you have the SELECT statements shown here:
SELECT * FROM tbl_name WHERE col1=val1; SELECT * FROM tbl_name WHERE col2=val2; SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
If an index exists on (col1, col2, col3), only the first of the preceding queries uses the index. The second and third queries do involve indexed columns, but (col2) and (col2, col3) are not leftmost prefixes of (col1, col2, col3). A B-tree index can be used for column comparisons in expressions that use the =, >, >=, <, <=, or BETWEEN operators. The index also can be used for LIKE comparisons if the argument to LIKE is a constant string that doesn't start with a wildcard character. For example, the following SELECT statements use indexes:
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
In the first statement, only rows with 'Patrick' <= key_col < 'Patricl' are considered. In the second statement, only rows with 'Pat' <= key_col < 'Pau' are considered. The following SELECT statements do not use indexes:
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE other_col;
In the first statement, the LIKE value begins with a wildcard character. In the second statement, the LIKE value is not a constant. MySQL 5.0 performs an additional LIKE optimization. If you use ... LIKE '%string%' and string is longer than three characters, MySQL uses the Turbo Boyer-Moore algorithm to initialize the pattern for the string and then employs this pattern to perform the search more quickly. A search using col_name IS NULL employs indexes if col_name is indexed. Any index that does not span all AND levels in the WHERE clause is not used to optimize the query. In other words, to be able to use an index, a prefix of the index must be used in every AND group. The following WHERE clauses use indexes:
... WHERE index_part1=1 AND index_part2=2 AND other_column=3 /* index = 1 OR index = 2 */ ... WHERE index=1 OR A=10 AND index=2 /* optimized like "index_part1='hello'" */ ... WHERE index_part1='hello' AND index_part3=5 /* Can use index on index1 but not on index2 or index3 */ ... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;
425
/* index_part1 is not used */ ... WHERE index_part2=1 AND index_part3=2 /* Index is not used in both AND parts */ ... WHERE index=1 OR A=10 /* No index spans all rows */ ... WHERE index_part1=1 OR index_part2=10
Sometimes MySQL does not use an index, even if one is available. One circumstance under which this occurs is when the optimizer estimates that using the index would require MySQL to access a very large percentage of the rows in the table. (In this case, a table scan is likely to be much faster, since it requires fewer seeks.) However, if such a query uses LIMIT to only retrieve some of the rows, MySQL uses an index anyway, because it can much more quickly find the few rows to return in the result. Hash indexes have somewhat different characteristics than those just discussed: They are used only for equality comparisons that use the = or <=> operators (but are very fast). They are not used for comparison operators such as < that find a range of values. The optimizer cannot use a hash index to speed up ORDER BY operations. (This type of index cannot be used to search for the next entry in order.) MySQL cannot determine approximately how many rows there are between two values (this is used by the range optimizer to decide which index to use). This may affect some queries if you change a MyISAM table to a hash-indexed MEMORY table. Only whole keys can be used to search for a row. (With a B-tree index, any leftmost prefix of the key can be used to find rows.)
426
All block buffers in a key cache structure are the same size. This size can be equal to, greater than, or less than the size of a table index block. Usually one these two values is a multiple of the other. When data from any table index block must be accessed, the server first checks whether it is available in some block buffer of the key cache. If it is, the server accesses data in the key cache rather than on disk. That is, it reads from the cache or writes into it rather than reading from or writing to disk. Otherwise, the server chooses a cache block buffer containing a different table index block (or blocks) and replaces the data there by a copy of required table index block. As soon as the new index block is in the cache, the index data can be accessed. If it happens that a block selected for replacement has been modified, the block is considered dirty. In this case, prior to being replaced, its contents are flushed to the table index from which it came. Usually the server follows an LRU (Least Recently Used) strategy: When choosing a block for replacement, the least recently used index block is selected. To make such a choice easier, the key cache module maintains a special queue (known as an LRU chain ) of all used blocks. When a block is accessed, it is placed at the end of the queue. When blocks need to be replaced, blocks at the beginning of the queue are the least recently used and become the first candidates for eviction.
The key cache referred to in a CACHE INDEX statement can be created by setting its size with a SET GLOBAL parameter setting statement or by using server startup options. For example:
427
Note that you cannot destroy the default key cache. An attempt to do this will be ignored:
mysql> set global key_buffer_size = 0; mysql> show variables like 'key_buffer_size'; +-----------------+---------+ | Variable_name | Value | +-----------------+---------+ | key_buffer_size | 8384512 | +-----------------+---------+
Key cache variables are structured system variables that have a name and components. For keycache1.key_buffer_size, keycache1 is the cache variable name and key_buffer_size is the cache component. See Seccin 9.4.1, Variables estructuradas de sistema for a description of the syntax used for referring to structured key cache system variables. By default, table indexes are assigned to the main (default) key cache created at the server startup. When a key cache is destroyed, all indexes assigned to it are reassigned to the default key cache. For a busy server, we recommend a strategy that uses three key caches: A hot key cache that takes up 20% of the space allocated for all key caches. Use this for tables that are heavily used for searches but that are not updated. A cold key cache that takes up 20% of the space allocated for all key caches. Use this cache for medium-sized, intensively modified tables, such as temporary tables. A warm key cache that takes up 60% of the key cache space. Employ this as the default key cache, to be used by default for all other tables. One reason the use of three key caches is beneficial is that access to one key cache structure does not block access to the others. Queries that access tables assigned to one cache do not compete with queries that access tables assigned to another cache. Performance gains occur for other reasons as well: The hot cache is used only for retrieval queries, so its contents are never modified. Consequently, whenever an index block needs to be pulled in from disk, the contents of the cache block chosen for replacement need not be flushed first. For an index assigned to the hot cache, if there are no queries requiring an index scan, there is a high probability that the index blocks corresponding to non-leaf nodes of the index B-tree remain in the cache. An update operation most frequently executed for temporary tables is performed much faster when the updated node is in the cache and need not be read in from disk first. If the size of the indexes of the temporary tables are comparable with the size of cold key cache, the probability is very high that the updated node is in the cache. CACHE INDEX sets up an association between a table and a key cache, but the association is lost each time the server restarts. If you want the association to take effect each time the server starts, one way to accomplish this is to use an option file: Include variable settings that configure your key caches, and an init-file option that names a file containing CACHE INDEX statements to be executed. For example:
key_buffer_size = 4G hot_cache.key_buffer_size = 2G cold_cache.key_buffer_size = 2G init_file=/path/to/data-directory/mysqld_init.sql
428
The statements in mysqld_init.sql are executed each time the server starts. The file should contain one SQL statement per line. The following example assigns several tables each to hot_cache and cold_cache:
CACHE INDEX a.t1, a.t2, b.t3 IN hot_cache CACHE INDEX a.t4, b.t5, b.t6 IN cold_cache
429
+---------+--------------+----------+----------+
The IGNORE LEAVES modifier causes only blocks for the non-leaf nodes of the index to be preloaded. Thus, the statement shown preloads all index blocks from t1, but only blocks for the non-leaf nodes from t2. If an index has been assigned to a key cache using a CACHE INDEX statement, preloading places index blocks into that cache. Otherwise, the index is loaded into the default key cache.
If you assign to either the key_buffer_size or key_cache_block_size key cache component a value that differs from the component's current value, the server destroys the cache's old structure and creates a new one based on the new values. If the cache contains any dirty blocks, the server saves them to disk before destroying and re-creating the cache. Restructuring does not occur if you set other key cache parameters. When restructuring a key cache, the server first flushes the contents of any dirty buffers to disk. After that, the cache contents become unavailable. However, restructuring does not block queries that need to use indexes assigned to the cache. Instead, the server directly accesses the table indexes using native filesystem caching. Filesystem caching is not as efficient as using a key cache, so although queries execute, a slowdown can be anticipated. Once the cache has been restructured, it becomes available again for caching indexes assigned to it, and the use of filesystem caching for the indexes ceases.
The Open tables value of 12 can be somewhat puzzling if you have only six tables. MySQL is multi-threaded, so there may be many clients issuing queries for a given table simultaneously. To minimize the problem with multiple client threads having different states on the same table, the table is opened independently by each concurrent thread. This uses additional memory but normally increases performance. With MyISAM tables, one extra file descriptor is required for the data file for each client that has the table open. (By contrast, the index file descriptor is shared between all threads.) You can read more about this topic in the next section, Seccin 7.4.8, Cmo abre y cierra tablas MySQL.
430
431
If the value is large, even when you have not issued a lot of FLUSH TABLES statements, you should increase the table cache size. See Seccin 5.3.3, Variables de sistema del servidor and Seccin 5.3.4, Variables de estado del servidor.
432
This command produces a list of all mysqld options and configurable system variables. The output includes the default variable values and looks something like this:
back_log binlog_cache_size bulk_insert_buffer_size connect_timeout date_format datetime_format default_week_format delayed_insert_limit delayed_insert_timeout delayed_queue_size expire_logs_days flush_time ft_max_word_len ft_min_word_len ft_query_expansion_limit ft_stopword_file group_concat_max_len innodb_additional_mem_pool_size innodb_autoextend_increment innodb_buffer_pool_awe_mem_mb innodb_buffer_pool_size innodb_concurrency_tickets innodb_file_io_threads innodb_force_recovery innodb_lock_wait_timeout innodb_log_buffer_size innodb_log_file_size innodb_log_files_in_group innodb_mirrored_log_groups innodb_open_files innodb_sync_spin_loops innodb_thread_concurrency innodb_thread_sleep_delay interactive_timeout join_buffer_size key_buffer_size key_cache_age_threshold key_cache_block_size key_cache_division_limit long_query_time lower_case_table_names max_allowed_packet max_binlog_cache_size max_binlog_size max_connect_errors max_connections max_delayed_threads max_error_count max_heap_table_size max_join_size max_length_for_sort_data max_relay_log_size max_seeks_for_key max_sort_length max_tmp_tables max_user_connections max_write_lock_count multi_range_count myisam_block_size myisam_data_pointer_size 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 50 32768 8388608 5 (No default value) (No default value) 0 100 300 1000 0 1800 84 4 20 (No default value) 1024 1048576 8 0 8388608 500 4 0 50 1048576 5242880 2 1 300 20 8 10000 28800 131072 8388600 300 1024 100 10 1 1048576 4294967295 1073741824 10 100 20 64 16777216 4294967295 1024 0 4294967295 1024 32 0 4294967295 256 1024 6 2147483648 2147483647 1 8388608 16384 30 10 60
433
open_files_limit optimizer_prune_level optimizer_search_depth preload_buffer_size query_alloc_block_size query_cache_limit query_cache_min_res_unit 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 div_precision_increment record_buffer relay_log_purge relay_log_space_limit slave_compressed_protocol slave_net_timeout slave_transaction_retries slow_launch_time sort_buffer_size sync-binlog sync-frm sync-replication sync-replication-slave-id sync-replication-timeout table_cache thread_cache_size thread_concurrency thread_stack time_format tmp_table_size transaction_alloc_block_size transaction_prealloc_size updatable_views_with_limit wait_timeout
0 1 62 32768 8192 1048576 4096 0 1 FALSE 8192 2048 131072 FALSE 262144 4 131072 TRUE 0 FALSE 3600 10 2 2097144 0 TRUE 0 0 10 64 0 10 196608 (No default value) 33554432 8192 4096 1 28800
If there is a mysqld server currently running, you can see what values it actually is using for the system variables by connecting to it and issuing this statement:
mysql> SHOW VARIABLES;
You can also see some statistical and status indicators for a running server by issuing this statement:
mysql> SHOW STATUS;
System variable and status information also can be obtained using mysqladmin:
shell> mysqladmin variables shell> mysqladmin extended-status
You can find a full description for all system and status variables in Seccin 5.3.3, Variables de sistema del servidor and Seccin 5.3.4, Variables de estado del servidor. MySQL uses algorithms that are very scalable, so you can usually run with very little memory. However, normally you get better performance by giving MySQL more memory. When tuning a MySQL server, the two most important variables to configure are key_buffer_size and table_cache. You should first feel confident that you have these set appropriately before trying to change any other variables. The following examples indicate some typical variable values for different runtime configurations. If you have at least 256MB of memory and many tables and want maximum performance with a moderate number of clients, you should use something like this:
shell> mysqld_safe --key_buffer_size=64M --table_cache=256 \
434
If you have only 128MB of memory and only a few tables, but you still do a lot of sorting, you can use something like this:
shell> mysqld_safe --key_buffer_size=16M --sort_buffer_size=1M
If there are very many simultaneous connections, swapping problems may occur unless mysqld has been configured to use very little memory for each connection. mysqld performs better if you have enough memory for all connections. With little memory and lots of connections, use something like this:
shell> mysqld_safe --key_buffer_size=512K --sort_buffer_size=100K \ --read_buffer_size=100K &
Or even this:
shell> mysqld_safe --key_buffer_size=512K --sort_buffer_size=16K \ --table_cache=32 --read_buffer_size=8K \ --net_buffer_length=1K &
If you are doing GROUP BY or ORDER BY operations on tables that are much larger than your available memory, you should increase the value of read_rnd_buffer_size to speed up the reading of rows after sorting operations. When you have installed MySQL, the support-files directory contains some different my.cnf sample files: my-huge.cnf, my-large.cnf, my-medium.cnf, and my-small.cnf. You can use these as a basis for optimizing your system. Note that if you specify an option on the command line for mysqld or mysqld_safe, it remains in effect only for that invocation of the server. To use the option every time the server runs, put it in an option file. To see the effects of a parameter change, do something like this:
shell> mysqld --key_buffer_size=32M --verbose --help
The variable values are listed near the end of the output. Make sure that the --verbose and --help options are last. Otherwise, the effect of any options listed after them on the command line are not reflected in the output. For information on tuning the InnoDB storage engine, see Seccin 15.11, Consejos de afinamiento del rendimiento de InnoDB.
435
The optimizer_prune_level variable tells the optimizer to skip certain plans based on estimates of the number of rows accessed for each table. Our experience shows that this kind of educated guess rarely misses optimal plans, and may dramatically reduce query compilation times. That is why this option is on (optimizer_prune_level=1) by default. However, if you believe that the optimizer missed a better query plan, then this option can be switched off (optimizer_prune_level=0) with the risk that query compilation may take much longer. Notice that even with the use of this heuristic, the optimizer still explores a roughly exponential number of plans. The optimizer_search_depth variable tells how far into the future of each incomplete plan the optimizer should look in order to evaluate whether it should be expanded further. Smaller values of optimizer_search_depth may result in orders of magnitude smaller query compilation times. For example, queries with 12, 13, or more tables may easily require hours and even days to compile if optimizer_search_depth is close to the number of tables in the query. At the same time, if compiled with optimizer_search_depth equal to 3 or 4, the compiler may compile in less than a minute for the same query. If you are unsure of what a reasonable value is for optimizer_search_depth, this variable can be set to 0 to tell the optimizer to determine the value automatically.
436
When running our benchmark tests using secure connections (all data encrypted with internal SSL support) performance was 55% slower than with unencrypted connections. If you compile with --with-debug=full, most queries are 20% slower. Some queries may take substantially longer; for example, the MySQL benchmarks run 35% slower. If you use --withdebug (without =full), the speed decrease is only 15%. For a version of mysqld that has been compiled with --with-debug=full, you can disable memory checking at runtime by starting it with the --skip-safemalloc option. The execution speed should then be close to that obtained when configuring with --with-debug. On a Sun UltraSPARC-IIe, a server compiled with Forte 5.0 is 4% faster than one compiled with gcc 3.2. On a Sun UltraSPARC-IIe, a server compiled with Forte 5.0 is 4% faster in 32-bit mode than in 64-bit mode. Compiling with gcc 2.95.2 for UltraSPARC with the options -mcpu=v8 -Wa,-xarch=v8plusa gives 4% better performance. On Solaris 2.5.1, MIT-pthreads is 8-12% slower than Solaris native threads on a single processor. With more load or CPUs, the difference should be larger. Compiling on Linux-x86 using gcc without frame pointers (-fomit-frame-pointer or -fomitframe-pointer -ffixed-ebp) makes mysqld 1-4% faster. Binary MySQL distributions for Linux that are provided by MySQL AB used to be compiled with pgcc. We had to go back to regular gcc due to a bug in pgcc that would generate binaries that do not run on AMD. We will continue using gcc until that bug is resolved. In the meantime, if you have a non-AMD machine, you can build a faster binary by compiling with pgcc. The standard MySQL Linux binary is linked statically to make it faster and more portable.
437
All joins are executed in a single pass, and most joins can be done without even using a temporary table. Most temporary tables are memory-based (HEAP) tables. Temporary tables with a large record length (calculated as the sum of all column lengths) or that contain BLOB columns are stored on disk. If an internal heap table exceeds the size of tmp_table_size, MySQL 5.0 handles this automatically by changing the in-memory heap table to a disk-based MyISAM table as necessary. You can also increase the temporary table size by setting the tmp_table_size option to mysqld, or by setting the SQL option SQL_BIG_TABLES in the client program. See Seccin 13.5.3, Sintaxis de SET. Most requests that perform a sort allocate a sort buffer and zero to two temporary files depending on the result set size. See Seccin A.4.4, Dnde almacena MySQL los archivos temporales. Almost all parsing and calculating is done in a local memory store. No memory overhead is needed for small items, so the normal slow memory allocation and freeing is avoided. Memory is allocated only for unexpectedly large strings; this is done with malloc() and free(). For each MyISAM table that is opened, the index file is opened once; the data file is opened once for each concurrently running thread. For each concurrent thread, a table structure, column structures for each column, and a buffer of size 3 * N are allocated (where N is the maximum row length, not counting BLOB columns). A BLOB column requires five to eight bytes plus the length of the BLOB data. The MyISAM storage engine maintains one extra row buffer for internal use. For each table having BLOB columns, a buffer is enlarged dynamically to read in larger BLOB values. If you scan a table, a buffer as large as the largest BLOB value is allocated. Handler structures for all in-use tables are saved in a cache and managed as a FIFO. By default, the cache has 64 entries. If a table has been used by two running threads at the same time, the cache contains two entries for the table. See Seccin 7.4.8, Cmo abre y cierra tablas MySQL. A FLUSH TABLES statement or mysqladmin flush-tables command closes all tables that are not in use at once and marks all in-use tables to be closed when the currently executing thread finishes. This effectively frees most in-use memory. FLUSH TABLES does not return until all tables have been closed. ps and other system status programs may report that mysqld uses a lot of memory. This may be caused by thread stacks on different memory addresses. For example, the Solaris version of ps counts the unused memory between stacks as used memory. You can verify this by checking available swap with swap -s. We test mysqld with several memory-leakage detectors (both commercial and open source), so there should be no memory leaks.
438
You can disable the hostname cache by starting the server with the --skip-host-cache option. To clear the hostname cache, issue a FLUSH HOSTS statement or execute the mysqladmin flushhosts command. If you want to disallow TCP/IP connections entirely, start mysqld with the --skip-networking option.
Striping Striping means that you have many disks and put the first block on the first disk, the second block on the second disk, and the Nth block on the (N mod number_of_disks) disk, and so on. This means if your normal data size is less than the stripe size (or perfectly aligned), you get much better performance. Striping is very dependent on the operating system and the stripe size, so benchmark your application with different stripe sizes. See Seccin 7.1.5, Usar pruebas de rendimiento (benchmarks) propios. The speed difference for striping is very dependent on the parameters. Depending on how you set the striping parameters and number of disks, you may get differences measured in orders of magnitude. You have to choose to optimize for random or sequential access. For reliability you may want to use RAID 0+1 (striping plus mirroring), but in this case, you need 2*N drives to hold N drives of data. This is probably the best option if you have the money for it. However, you may also have to invest in some volume-management software to handle it efficiently. A good option is to vary the RAID level according to how critical a type of data is. For example, store semi-important data that can be regenerated on a RAID 0 disk, but store really important data such as host information and logs on a RAID 0+1 or RAID N disk. RAID N can be a problem if you have many writes, due to the time required to update the parity bits. On Linux, you can get much more performance by using hdparm to configure your disk's interface. (Up to 100% under load is not uncommon.) The following hdparm options should be quite good for MySQL, and probably for many other applications:
hdparm -m 16 -d 1
Note that performance and reliability when using this command depend on your hardware, so we strongly suggest that you test your system thoroughly after using hdparm. Please consult the hdparm manual page for more information. If hdparm is not used wisely, filesystem corruption may result, so back up everything before experimenting! You can also set the parameters for the filesystem that the database uses:
439
If you don't need to know when files were last accessed (which is not really useful on a database server), you can mount your filesystems with the -o noatime option. That skips updates to the last access time in inodes on the filesystem, which avoids some disk seeks. On many operating systems, you can set a filesystem to be updated asynchronously by mounting it with the -o async option. If your computer is reasonably stable, this should give you more performance without sacrificing too much reliability. (This flag is on by default on Linux.)
MySQL does not support linking one directory to multiple databases. Replacing a database directory with a symbolic link works as long as you do not make a symbolic link between databases. Suppose that you have a database db1 under the MySQL data directory, and then make a symlink db2 that points to db1:
shell> cd /path/to/datadir shell> ln -s db1 db2
For any table tbl_a in db1, there also appears to be a table tbl_a in db2. If one client updates db1.tbl_a and another client updates db2.tbl_a, problems are likely to result. However, if you really need to do this, it is possible by altering the source file mysys/my_symlink.c, in which you should look for the following statement:
if (!(MyFlags & MY_RESOLVE_LINK) || (!lstat(filename,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
Note that, in MySQL 5.0, symbolic link support is enabled by default for all Windows servers.
440
In the data directory, you always have the table definition file, the data file, and the index file. The data file and index file can be moved elsewhere and replaced in the data directory by symlinks. The definition file cannot. You can symlink the data file and the index file independently to different directories. Symlinking can be accomplished manually from the command line using ln -s if mysqld is not running. Aternativly, you can instruct a running MySQL server to perform the symlinking by using the DATA DIRECTORY and INDEX DIRECTORY options to CREATE TABLE. See Seccin 13.1.5, Sintaxis de CREATE TABLE. myisamchk does not replace a symlink with the data file or index file. It works directly on the file to which the symlink points. Any temporary files are created in the directory where the data file or index file is located. Note: When you drop a table that is using symlinks, both the symlink and the file to which the symlink points are dropped. This is an extremely good reason why you should not run mysqld as the system root or allow system users to have write access to MySQL database directories. If you rename a table with ALTER TABLE ... RENAME and you do not move the table to another database, the symlinks in the database directory are renamed to the new names and the data file and index file are renamed accordingly. If you use ALTER TABLE ... RENAME to move a table to another database, the table is moved to the other database directory. The old symlinks and the files to which they pointed are deleted. In other words, the new table is not symlinked. If you are not using symlinks, you should use the --skip-symbolic-links option to mysqld to ensure that no one can use mysqld to drop or rename a file outside of the data directory. Table symlink operations that are not yet supported: ALTER TABLE ignores the DATA DIRECTORY and INDEX DIRECTORY table options. BACKUP TABLE and RESTORE TABLE don't respect symbolic links. The .frm file must never be a symbolic link (as indicated previously, only the data and index files can be symbolic links). Attempting to do this (for example, to make synonyms) produces incorrect results. Suppose that you have a database db1 under the MySQL data directory, a table tbl1 in this database, and in the db1 directory you make a symlink tbl2 that points to 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
Problems result if one thread reads db1.tbl1 and another thread updates db1.tbl2: The query cache is fooled (it has no way of knowing that tbl1 has not been updated, so it returns outdated results). ALTER statements on tbl2 also fail.
441
[mysqld] skip-symbolic-links
On Windows, you create a symbolic link to a MySQL database by creating a file in the data directory that contains the path to the destination directory. The file should be named db_name.sym, where db_name is the database name. Suppose that the MySQL data directory is C:\mysql\data and you want to have database foo located at D:\data\foo. Set up a symlink as shown here: 1. Make sure that the D:\data\foo directory exists by creating it if necessary. If you have a database directory named foo in the data directory, you should move it to D:\data. Otherwise, the symbolic link is ineffective. To avoid problems, the server should not be running when you move the database directory. 2. Create a text file C:\mysql\data\foo.sym that contains the pathname D:\data\foo\. After this, all tables created in the database foo are created in D:\data\foo. Note that the symbolic link is not used if a directory with the same name as the database exists in the MySQL data directory.
442
mysql La herramienta de lnea de comando para introducir comandos SQL interactivamente o ejecutarlos desde un fichero en modo batch. Consulte Seccin 8.3, La herramienta intrprete de comandos mysql.
mysqlaccess Script que verifica los permisos de acceso para una combinacin de mquina, usuario y base de datos.
mysqladmin Cliente que realiza tareas administrativas, tales como crear y borrar bases de datos, recargar las tablas de permisos, volcar tablas a disco y reabrir ficheros de log. mysqladmin tambin puede
443
utilizarse para consultar la versin, informacin de procesos, e informacin de estado del servidor. Consulte Seccin 8.4, Administrar un servidor MySQL con mysqladmin.
mysqlbinlog Utilidad para leer comados de un log binario. El log de comandos ejecutados contenidos en el fichero de log binario puede utilizarse para ayudar en la recuperacin de una fallida. Consulte Seccin 8.5, La utilidad mysqlbinlog para registros binarios. MySQL AB proporciona tres programas con interfcies grficas para usar con el servidor MySQL: MySQL Administrator: Esta herramienta se usa para administrar servidores MySQL, bases de datos, tablas y usuarios. MySQL Query Browser: MySQL AB proporciona esta herramienta grfica para crear, ejecutar y optimizar consultas en bases de datos MySQL. MySQL Migration Toolkit: Esta herramienta ayuda en la migracin de esquemas y datos de otros sistemas de gestin de bases de datos realcionales a MySQL.
mysqlcheck Cliente de mantenimiento de tablas que verifica, repara, analiza y optimiza tablas. Consulte Seccin 8.6, El programa mysqlcheck para mantener y reparar tablas.
mysqldump Cliente que vuelca una base de datos MySQL en un fichero como comandos SQL o como ficheros separados por tabuladores. Originalmente fue creado como freeware por Igor Romanenko. Consulte Seccin 8.7, El programa de copia de seguridad de base de datos mysqldump.
mysqlhotcopy Utilidad que realiza copias de seguridad rpidas de tablas MyISAM o ISAM mientras el servidor est en ejecucin .Consulte Seccin 8.8, El programa de copias de seguridad de base de datos mysqlhotcopy.
mysqlimport Cliente que importa ficheros de texto en sus respectivas tablas usando LOAD DATA INFILE. Consulte Seccin 8.9, El programa para importar datos mysqlimport.
mysqlshow 444
Cliente que muestra informacin de bases de datos, tablas, columnas, e ndices. Consulte Seccin 8.10, Mostrar bases de datos, tablas y columnas con mysqlshow.
perror Utilidad que muestra el significado de los errores de sistema de MySQL. Consulte Seccin 8.11, perror, explicacin de cdigos de error.
replace Programa que cambia cadenas de caracteres en ficheros o en la entrada estndar. Consulte Seccin 8.12, La utilidad replace de cambio de cadenas de caracteres. Cada programa MySQL tienen varias opciones, pero todos ellos proporcionan una opcin --help que puede utilizarse para obtener una descripcin completa de las distintas opciones del programa. Por ejemplo, mysql --help. Los clientes MySQL que comunican con el servidor usando la biblioteca mysqlclient usan las siguientes variables de entorno: MYSQL_UNIX_PORT MYSQL_TCP_PORT MYSQL_PWD MYSQL_DEBUG TMPDIR El fichero socket de Unix; se utiliza para conexiones al localhost Puerto por defecto; se utiliza para conexiones TCP/IP Contrasea por defecto Opciones de traza para depurar cdigo Directorio donde se crean las tablas y ficheros temporales
El uso de MYSQL_PWD no es seguro. Consulte Seccin 5.7.6, Guardar una contrasea de forma segura. Puede cambiar las opciones por defecto o valores especificados en las variables de entorno para todos los programas estndar, especificando las opciones en un fichero de opciones o en la lnea de comandos. Seccin 4.3, Especificar opciones de programa.
445
Tras su compresin, una tabla ser de slo lectura. Esto, normalmente, es lo deseable (como cuando se accede a tablas comprimidas en un CD). Permitir escrituras en tablas comprimidas est en nuestra lista de cosas pendientes, pero con poca prioridad. myisampack comprime columnas BLOB o TEXT . El antiguo programa pack_isam para tablas ISAM no puede. Invoque myisampack de la siguiente forma:
shell> myisampack [opciones] nombre_fichero ...
Cada nombre de fichero debe ser el nombre de un fichero ndice (.MYI) . Si no se encuentra en el directorio de la base de datos, debe especificar la ruta al fichero. Se permite omitir la extensin .MYI . myisampack soporta las siguientes opciones: --help, -? Muestra mensaje de ayuda y acaba. --backup, -b Realiza una copia de seguridad de los datos de la tabla usando el nombre nombre_tabla.OLD. --debug[=opciones_de_depuracin], -# [opciones_de_depuracin] Escribe un log de depuracin. La cadena de caracteres opciones_de_depuracin a menudo es 'd:t:o,nombre_fichero'. --force, -f Crea una tabla comprimida incluso si llega a ser mayor que la original o si el fichero temporal de una invocacin anterior de myisampack ya existe. (myisampack crea un fichero temporal llamado nombre_tabla.TMD cuando comprime la tabla. Si se mata myisampack, el fichero .TMD puede no borrarse.) Normalmente, myisampack acaba con un error si encuentra que nombre_tabla.TMD existe. Con --force, se fuerza myisampack a comprimir la tabla. --join=nombre_de_tabla_grande, -j nombre_de_tabla_grande Junta todas las tablas nombradas en la lnea de comandos en una nica tabla nombre_de_tabla_grande. Todas las tablas que hay que combinar deben tener una estructura idntica (los mismos nombres de columna y tipos, los mismos ndices, etc). --packlength=#, -p # Especifica el tamao de almacenamiento del registro, en bytes. El valor debe ser 1, 2, o 3. myisampack almacena todos los registros con punteros de 1, 2, o 3 bytes. En la mayora de casos normales, myisampack puede determinar el valor de longitud ptimo antes de empezar a comprimir el fichero, pero puede darse cuenta durante el proceso de compresin de que podra haber usado una longitud inferior. En ese caso, myisampack muestra una nota diciendo que en la siguente compresin del mismo fichero, puede usarse una longitud de fichero inferior. --silent, -s Modo silencioso. Slo muestra mensajes de error. --test, -t No comprime la tabla, slo prueba la compresin. --tmpdir=ruta, -T ruta myisampack crea en ese directorio los ficheros temporales.
446
--verbose, -v Modo explcito. Muestra informacin sobre el proceso de compresin y su resultado. --version, -V Muestra informacin de la versin y sale. --wait, -w Espera y vuelve a empezar si la tabla est en uso. Si el servidor mysqld se invoc con la opcin -skip-external-locking, no es buena idea invocar myisampack si existe la posibilidad que el servidor actualice la tabla durante el proceso de compresin. La siguiente secuencia de comandos ilustra una tpica sesin de compresin de tablas:
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 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 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 Length Type 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
Rec/key 1 1
447
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
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
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 empty-zero: 12 pre-space: 0 end-space: 12 table-lookups: 5 Original trees: 57 After join: 17 - Compressing file 87.14% Remember to run myisamchk -rq on compressed tables shell> ls -l -rw-rw-r--rw-rw-r--rw-rw-r-station.* 1 monty 1 monty 1 monty 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 Recover time: 1997-04-17 19:04:26 Data records: 1192 Deleted blocks: 0 Datafile parts: 1192 Deleted data: 0 Datafile pointer (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 Start 1 2 6 10 11 31 32 62 97 Length 1 4 4 1 20 1 30 35 35 Type constant zerofill(1) no zeros, zerofill(1)
Rec/key 1 1 Bits 0 9 9 9 0 9 9 9 9
448
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
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
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
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
not_always, no empty not_always, no empty not_always, no empty not_always, no empty not_always no empty no empty no empty
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
no no no no no
6 2 5 6 2 5 8 8 5 6 2 2 3 9 10 2 2 2 2 11 3 2 2 2 12 13 2 2 2 2 2 2 2 2 3 3 14 14 15 2 2 16 2 17 3 3 2 2
9 9 9 9 9 9 9 9 9 9 9 9 9 0 0 9 9 9 9 0 9 9 9 9 0 9 9 9 9 9 9 9 9 9 9 9 4 4 9 9 9 9 9 1 9 9 9 9
myisampack muestra la siguiente informacin: normal Nmero de columnas para el que no se necesita compresin extra. empty-space Nmero de columnas que contienen valores que son slo espacios, que ocupan un bit. empty-zero Nmero de columnas que contienen valores que son slo ceros binarios; ocupan un bit. empty-fill Nmero de columnas de tipo entero que no ocupan el rango completo de bytes de su tipo; se cambian a un tipo inferior. Por ejemplo, una columna BIGINT (ocho bytes) puede almacenarse como una columna TINYINT (un byte) si todos sus valores estn en el rango de -128 a 127. pre-space
449
Nmero de columnas decimales que se almacenan con espacios iniciales. En este caso, cada valor contiene un contador para el nmero de espacios precedentes. end-space Nmero de columnas que tienen muchos espacios al final. En este caso, cada valor contiene un contador para el nmero de espacios al final. table-lookup La columna tiene pocos valores distintos, que se convierten a ENUM antes de la compresin Huffman. zero Nmero de columnas cuyos valores son todos cero. Original trees Nmero inicial de rboles Huffman. After join Nmero de rboles Huffman distintos que quedan tras unir rboles para tener algn espacio de cabecera. Tras comprimir una tabla, myisamchk -dvv muestra informacin adicional acerca de cada columna: Type El tipo de la columna. El valor puede contener cualquiera de los siguientes descriptores: constant Todos los registros tienen el mismo valor. no endspace No guarda el espacio final. no endspace, not_always No guarda el espacio final y no realiza compresin en caso de que haya espacio final en todos los valores. no endspace, no empty No guarda el espacio final. No guarda valores vacos. table-lookup La columna se convirti a ENUM. zerofill(n) Los n bytes ms significativos en el valor son siempre 0 y no se guardan. no zeros No almacena ceros. always zero
450
Los valores cero se guardan usando un bit. Huff tree Nmero de rboles Huffman asociados con cada columna. Bits Nmero de bits usados en el rbol Huffman. Tras ejecutar myisampack, es necesario lanzar myisamchk para volver a crear algunos ndices. Al mismo tiempo, se puede ordenar los bloques de ndices y crear estadsticas, que el optimizador MySQL necesita para trabajar de forma ms eficiente:
shell> myisamchk -rq --sort-index --analyze nombre_de_tabla.MYI
Una vez instalada la tabla comprimida en el directorio de la base de datos MySQL, debe ejecutar mysqladmin flush-tables para forzar mysqld a comenzar a usar la nueva tabla. Para descomprimir una tabla comprimida, use la opcin --unpack con myisamchk o isamchk.
O:
shell> mysql --user=nombre_usuario --password=contrasea nombre_base_de_datos
Cuando introduzca un comando SQL, acbelo con ';', \g, o \G y pulse Enter. Puede ejecutar un script simplemente as:
shell> mysql nombre_base_de_datos < script.sql > output.tab
mysql soporta las siguientes opciones: --help, -? Muestra el mensaje de ayuda y sale.
--batch, -B Muestra los resultados usando tabuladores como separadores de columnas, con cada registro en una nueva lnea. Con esta opcin mysql no usa el fichero de historial.
451
--character-sets-dir=ruta Directorio donde los conjuntos de caracteres estn instalados. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin.
--compress, -C Comprime toda la informacin enviada entre el cliente y el servidor si ambos soportan compresin.
--database=nombre_base_de_datos, -D nombre_base_de_datos La base de datos a usar. Esto es til sobretodo en un fichero de opciones.
--debug[=opciones_de_depuracin], -# [opciones_de_depuracin] Escribe un log de depuracin. La cadena de caracteres opciones_de_depuracin a menudo es 'd:t:o,nombre_de_fichero'. Por defecto es 'd:t:o,/tmp/mysql.trace'.
--default-character-set=conjunto de caracteres Usa conjunto de caracteres como conjunto de caracteres por defecto. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin.
--execute=comando, -e comando Ejecuta el comando y sale. El formato de salida por defecto es como el producido con --batch. Consulte Seccin 4.3.1, Usar opciones en la lnea de comandos para algunos ejemplos.
452
--ignore-space, -i Ignora espacios tras los nombres de funciones. El efecto de esta opcin se describe en la discusin para IGNORE_SPACE en Seccin 5.3.2, El modo SQL del servidor.
--local-infile[={0|1}] Activa o desactiva la funcin LOCAL para LOAD DATA INFILE. Sin valor, la opcin activa LOCAL. Puede darse como --local-infile=0 o --local-infile=1 para desactivar explcitamente o activar LOCAL. Activar LOCAL no tiene efecto si el servidor no lo soporta.
--named-commands, -G Los comandos con nombre estn activados por defecto. Se permite comandos con formato largo as como comandos abreviados con \*. Por ejemplo, se reconoce tanto quit como \q .
--no-auto-rehash, -A No hay un reclculo del hash (rehashing) automtico. Esta opcin hace que mysql arranque ms rpido, pero debe realizar el comando rehash si quiere usar el completado automtico de tabla y columna.
--no-named-commands, -g Desactiva los comandos con nombre. Use la forma \* nicamente, o use comandos con nombre slo al comienzo de una lnea, acabando con punto y coma (';'). Desde MySQL 3.23.22, mysql arranca con esta opcin activada por defecto. De todos modos, incluso con esta opcin, los comandos con formato largo funcionan desde la primera lnea.
--no-pager No usa paginacin para mostrar la salida de una consulta. La paginacin en la salida se discute ms en Seccin 8.3.1, Comandos mysql.
--no-tee No copia la salida en un fichero. Los ficheros tee se discuten ms en Seccin 8.3.1, Comandos mysql.
--one-database, -O
453
Ignora comandos excepto aqullos para la base de datos por defecto, nombrada en la lnea de comandos. Esto es til para evitar actualizaciones de otras bases de datos en el log binario.
--pager[=comando] Este comando se utiliza para paginar la salida de una consulta. Si el comando se omite, el paginador por defecto es el valor de la variable de entorno PAGER. Paginadores vlidos son less, more, cat [> nombre_de_fichero], etctera. Esta opcin slo funciona en Unix. No funciona en modo batch. La paginacin de la salida de datos (output) se discute tambin en Seccin 8.3.1, Comandos mysql.
--password[=contrasea], -p[contrasea] La contrasea a usar al conectar al servidor. Si se usa la forma de opcin corta (-p), no se deben poner espacios entre la opcin y la contrasea. Si se omite el valor de la contrasea, a continuacin de --password o -p en la lnea de comandos, aparece un prompt pidindola. La contrasea debe omitirse en sistemas Unix basados en SysV, ya que debe mostrarse en la salida de ps.
--prompt=formato_cadena Asigna al prompt el formato especificado. Por defecto es mysql>. Las secuencias especiales que soporta el prompt se describen en Seccin 8.3.1, Comandos mysql.
--quick, -q No cachea cada resultado de consulta, muestra cada registro segn va llegando. Esto puede ralentizar el servidor si la salida se suspende. Con esta opcin, mysql no usa el fichero histrico.
--raw, -r Muestra los valores de las columnas sin conversin de escape. Se usa a menudo con la opcin -batch.
--reconnect Si se pierde la conexin con el servidor, intenta reconectar automticamente. Se intenta un nico intento de reconexin cada vez que se pierde la conexin. Para eliminar el comportamiento de la reconexin, use --skip-reconnect.
454
--safe-updates, --i-am-a-dummy, -U Slo permite aquellos comandos UPDATE y DELETE que especifica cules registros se deben modificar usando valores clave. Si tiene activada esta opcin en un fichero de opciones, puede evitarla usando --safe-updates en la lnea de comandos. Consulte Seccin 8.3.3, Sugerencias acerca de mysql para ms informacin sobre esta opcin.
--secure-auth No enva contraseas al servidor en formato antiguo (pre-4.1.1). Esto evita realizar conexiones con servidores que no usen el formato de contrasea nuevo.
--show-warnings Muestra los mensajes de advertencia tras cada comando, si es necesario. Esta opcin se aplica en modo interactivo y batch. Esta opcin se aadi en MySQL 5.0.6.
--silent, -s Modo silencioso. Produce menos salida de datos (output). Esta opcin puede utilizarse mltiples veces para producir cada vez menos salida de datos.
--skip-line-numbers, -L No escribe el nmero de lnea en los errores. Es til cuando se quiere comparar ficheros de resultados que incluyan mensajes de error.
--table, -t Muestra la salida de datos (output) en formato de tabla. ste es el modo de funcionamiento por defecto para modo interactivo, pero puede usarse para producir la salida de datos de la tabla en modo batch.
455
--tee=nombre_fichero Aade una copia de la salida de datos (output) al fichero dado. Esta opcin no funciona en modo batch. Ms informacin sobre ficheros tee en Seccin 8.3.1, Comandos mysql.
--verbose, -v Modo explcito. Produce ms salida de datos (output) acerca de lo que hace el programa. Esta opcin puede escribirse mltiples veces para producir ms y ms salida. (Por ejemplo, -v -v -v produce la salida de datos en formato de tabla incluso en modo batch.)
--vertical, -E Muestra los registros de salida de la consulta verticalmente (una lnea por cada valor). Sin esta opcin, se puede solicitar este formato de salida de datos (output) para un comando escribiendo \G al final del mismo.
--xml, -X Produce salida XML. Puede asignar las siguientes variables usando las opciones --nombre_variable=valor: connect_timeout Nmero de segundos antes que la conexin d un timeout. (El valor por defecto es 0). max_allowed_packet La mxima longitud del paquete para enviar al o recibir del servidor. (El valor por defecto es 16MB).
456
Comandos mysql
max_join_size El lmite automtico de registros en un join al usar --safe-updates. (El valor por defecto es 1.000.000). net_buffer_length El tamao de bfer para comunicaciones TPC/IP y socket. (El valor por defecto es 16KB). select_limit Lmite automtico para comandos SELECT al usar --safe-updates. (El valor por defecto es 1.000). Es posible asignar valores a las variables usando la sintaxis --setvariable=nombre_variable=valor o -O nombre_variable=valor. En MySQL 5.0, esta sintaxis est obsoleta. En Unix, el cliente mysql escribe un registro de los comandos ejecutados en un fichero histrico. Por defecto, el fichero histrico se llama .mysql_history y se crea en el directorio raz del usuario. Para especificar un fichero diferente, cmbiese el valor de la variable de entorno MYSQL_HISTFILE. Si no se quiere mantener el fichero histrico, primero hay que borrar .mysql_history si existe, y luego se utiliza alguna de las siguientes tcnicas: Se cambia el valor de la variable MYSQL_HISTFILE a /dev/null. Para que este cambio tenga efecto cada vez que se entra, se pone la asignacin de esta variable de entorno en uno de los ficheros de arranque de la shell del usuario. Se crea .mysql_history como enlace simblico a /dev/null:
shell> ln -s /dev/null $HOME/.mysql_history
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.
457
Comandos mysql
Execute a system shell command. Set outfile [to_outfile]. Append everything into given outfile. Use another database. Takes database name as argument. Show warnings after every statement. Don't show warnings after every statement.
Cada comando tiene forma corta y larga. La forma larga no es sensible a maysculas; la forma corta lo es. La forma larga puede seguirse con un terminador de punto y coma, pero la forma corta no debera. En el comando delimiter, debe evitar el uso del carcter antibarra ('\') ya que es un carcter de escape para MySQL. Los comandos edit, nopager, pager, y system slo funcionan en Unix. El comando status proporciona alguna informacin sobre la conexin y el servidor que est usando. Si est ejecutando el modo --safe-updates, status tambin muestra los valores para las variables mysql que afectan a sus consultas. Para loguear las consultas y su salida, use el comando tee. Todos los datos mostrados por pantalla se guardan en un fichero dado. Esto puede ser muy til para depurar. Puede activar esta caracterstica en la lnea de comandos con la opcin --tee, o interactivamente con el comando tee. El fichero tee puede desactivarse interactivamente con el comando notee. Ejecutando tee de nuevo, vuelve a activar el logueo. Sin parmetros, se utiliza el fichero anterior. Tenga en cuenta que tee vuelca los resultados de las consultas al fichero despus de cada comando, justo antes que mysql muestre su siguiente prompt. Navegar o buscar resultados de consultas en modo interactivo usando programas Unix, tales como less, more, o cualquier otro programa similar es posible con la opcin --pager. Si no especifica ningn valor para la opcin, mysql comprueba el valor de la variable de entorno PAGER y configura el paginador al valor de la misma. La paginacin de la salida de datos (output) puede activarse interactivamente con el comando pager y desactivar con nopager. El comando tiene un argumento opcional; si se especifica, el programa de paginacin se configura con el mismo. Sin argumento, el paginador se configura con el paginador que se especific en la lnea de comandos, o stdout si no se especifica paginador. La paginacin de la salida slo funciona en Unix ya que usa la funcin popen(), que no existe en Windows. Para Windows, la opcin tee puede usarse para guardar la salida de las consultas, aunque no es tan conveniente como pager para navegar por la salida en algunas situaciones. Algunos consejos sobre el comando pager: Puede usarlo para escribir en un fichero y que los resultados slo vayan al fichero:
mysql> pager cat > /tmp/log.txt
Puede pasar cualquier opcin al programa que quiera usar como paginador:
mysql> pager less -n -i -S
En el ejemplo precedente, tenga en cuenta la opcin -S. Puede encontrarla muy til para consultar una amplia variedad de resultados. En ocasiones un conjunto de resultados muy amplio es difcil de leer en pantalla. La opcin -S con less puede hacer el resultado mucho ms legible ya que puede desplazarlo horizontalmente usando las flechas de izquierda y derecha. Tambin puede usar -S interactivamente con less para activar y desactivar el modo de navegacin horizontal. Para ms informacin, lea la pgina del manual (man) de less:
shell> man less
Puede especificar comandos muy complejos para el paginador, para tratar la salida de las consultas:
mysql> pager cat | tee /dr1/tmp/res.txt \ | tee /dr2/tmp/res2.txt | less -n -i -S
458
Comandos mysql
En este ejemplo, el comando enviara los resultados de las consultas a dos ficheros en dos directorios distintos en dos sistemas de ficheros montados en /dr1 y /dr2,y mostrara los resultados en pantalla va less. Puede combinar las funciones tee y pager. Puede tener un fichero tee activado y tener el pager configurado con less, siendo capaz de navegar en los resultados con el programa less y al mismo tiempo tener todo en un fichero. La diferencia entre tee en Unix usado con el comando pager y el comando tee que implementa mysql es que el segundo tee funciona incluso si no tiene el tee de Unix disponible. El comando tee implementado tambin loguea todo lo que se muestra por pantalla, mientras que tee en Unix usado con pager no loguea tanto. Adicionalmente, el logueo en fichero de tee puede activarse y desactivarse interactivamente desde mysql. Esto es til cuando quiere loguear algunas consultas en un fichero, pero no otras. En MySQL 5.0, el prompt por defecto mysql> puede reconfigurarse. La cadena de caracteres para definir el prompt puede contener las siguientes secuencias especiales: Opcin \v \d \h \p \u \U \\ \n \t \ \_ \R \r \m \y \Y \D \s \w \P \o \O \c \S \' \" Descripcin Versin del servidor Base de datos actual Equipo del servidor Puerto TCP/IP usado o fichero socket Nombre de usuario Nombre de cuenta nombre_usuario@nombre_equipo completo Carcter de barra invertida '\' literal Carcter de nueva lnea Carcter de tabulador Espacio (hay un espacio a continuacin de la barra invertida) Espacio Hora actual, en formato militar de 24 horas (0-23) Hora actual, en formato estndar de 12 horas (1-12) Minutos de la hora actual Ao actual, dos dgitos Ao actual, cuatro dgitos Fecha actual completa Segundos de la hora actual Da actual de la semana en ingls, en formato de tres letras (Mon, Tue, ...) am/pm Mes actual en formato numrico Mes actual en ingls, en formato de tres letras (Jan, Feb, ...) Contador que incrementa con cada comando ejectuado Punto y coma Comilla Comilla doble
'\' seguido por cualquier otra letra es esa letra. Si especifica el comando prompt sin argumentos, mysql resetea el prompt al valor por defecto de mysql>.
459
Puede cambiar el prompt de diversas formas: Use una variable de entorno Puede cambiar la variable de entorno MYSQL_PS1 con una cadena de caracteres. Por ejemplo:
shell> export MYSQL_PS1="(\u@\h) [\d]> "
Con un fichero de opciones Puede cambiar la opcin prompt en el grupo [mysql] de cualquier fichero de opciones MySQL, tal como /etc/my.cnf o el fichero .my.cnf en el directorio raz. Por ejemplo:
[mysql] prompt=(\\u@\\h) [\\d]>\\_
En este ejemplo, tenga en cuenta que las barras invertidas son dos. Si asigna el valor del prompt usando la opcin prompt en un fichero de opciones, se recomienda poner dos barras invertidas al usar las opciones especiales de prompt. Hay algna redundancia en el conjunto de opciones de prompt disponible y el conjunto de secuencias de caracteres de escape especiales que se reconoce en el fichero de opciones. (Estas secuencias estn listadas en Seccin 4.3.2, Usar ficheros de opciones). La redundancia puede causar problemas si usa slo una barra invertidas. Por ejemplo, \s se interpreta como un espacio en lugar de los segundos actuales. El siguiente ejemplo muestra cmo definir un prompt dentro de un fichero de opciones que incluya la hora actual en formato HH:MM:SS>:
[mysql] prompt="\\r:\\m:\\s> "
Use una opcin por lnea de comandos Puede cambiar la opcin --prompt en la lnea de comandos de mysql. Por ejemplo:
shell> mysql --prompt="(\u@\h) [\d]> " (user@host) [database]>
Interactivamente Puede cambiar el prompt interactivamente usando el comando prompt (o \R) . Por ejemplo:
mysql> prompt (\u@\h) [\d]>\_ PROMPT set to '(\u@\h) [\d]>\_' (usuario@equipo) [base_de_datos]> (usuario@equipo) [base_de_datos]> prompt Returning to default PROMPT of mysql> mysql>
Sin embargo, es posible poner comandos SQL en un fichero y decirle a mysql que lea las entradas de ese fichero. Para ello, cree un fichero fichero_de_texto que contenga el comando que quiera ejecutar. Luego invoque mysql como se muestra aqu:
shell> mysql nombre_base_de_datos < fichero_de_texto
Puede comenzar su fichero de texto con un comando USE nombre_base_de_datos. En este caso, no es necesario especificar el nombre de la base de datos en la lnea de comandos:
shell> mysql < text_file
Si est ejecutando mysql, puede ejecutar un script SQL en un fichero usando el comando source o \. :
460
Si desea que el script muestre informacin de progreso al usuario, puede insertar algunas lneas como
SELECT '<informacin>' AS ' ';
que muestra <informacin>. Para ms informacin acerca del modo batch, consulte Seccin 3.5, Usar mysql en modo batch.
Consulte Seccin 13.5.3, Sintaxis de SET. El comando SET tiene el siguiente efecto: No est permitido ejecutar un comando UPDATE o DELETE a no ser que especifique una condicin clave en la clusula WHERE o proporcione una clusula LIMIT (o ambas). Por ejemplo:
UPDATE nombre_tabla SET columna_no_clave=# WHERE columna_clave=#;
461
Todos los resultados grandes de un SELECT se limitan automticamente a 1.000 registros a no ser que el comando incluya una clusula LIMIT . Se aborta comandos SELECT de mltiples tablas que probablemente necesiten examinar ms de 1,000,000 de registros. Para especificar lmites distintos a los anteriores, puede cambiar los valores por defecto con las opciones --select_limit y --max_join_size:
shell> mysql --safe-updates --select_limit=500 --max_join_size=10000
La variable de usuario @a se ha perdido con la conexin, y tras la reconexin no est definida. Si es importante que mysql termine con un error cuando se pierda la conexin, puede arrancar el cliente mysql con la opcin --skip-reconnect .
mysqladmin soporta los siguientes comandos: create nombre_base_de_datos Crea una nueva base de datos llamada nombre_base_de_datos. debug Le dice al servidor que escriba informacin de depuracin en el log de error. drop nombre_base_de_datos
462
Borra la base de datos llamada nombre_base_de_datos y todas sus tablas. extended-status Muestra las variables de estado del servidor y sus valores. flush-hosts Vuelca toda la informacin en la cach del equipo. flush-logs Vuelca todos los logs. flush-privileges Recarga las tablas de permisos (lo mismo que reload). flush-status Limpia las variables de estado. flush-tables Vuelca todas las tablas. flush-threads Vuelca la cach de threads. kill id,id,... Mata los threads del servidor. old-password nueva_contrasea Es como el comando password pero guarda la contrasea usando el formato de hash antiguo (pre-4.1). Consulte Seccin 5.6.9, Hashing de contraseas en MySQL 4.1.) password nueva_contrasea Introduce una nueva contrasea. Esto cambia la contrasea a nueva_contrasea para la cuenta que usa con mysqladmin para conectar con el servidor. Si nueva_contrasea contiene espacios u otros caracteres que son especiales para su intrprete de comandos, debe ponerla entre comillas. En Windows, asgurese de usar comillas dobles en lugar de simples; comillas simples no se eliminan de la contrasea sino que se interpretan como parte del acontrasea. Por ejemplo: shell> mysqladmin password "mi nueva contrasea" ping Comprueba si el servidor est vivo. El estado retornado por mysqladmin es 0 si el servidor est en ejecucin, 1 si no lo est. En MySQL 5.0, el estado es 0 incluso en caso de un error tal como Access denied, ya que esto significa que el servidor est en ejecucin pero no ha admitido la conexin, lo que no es lo mismo que el servidor no est en ejecucin. processlist Muestra una lista de los threads activos del servidor. Esto es como la salida del comando SHOW PROCESSLIST. Si se da la opcin --verbose, la salida es como la de SHOW FULL PROCESSLIST. (Consulte Seccin 13.5.4.16, Sintaxis de SHOW PROCESSLIST.)
463
reload Recarga las tablas de permisos. refresh Vuelca todas las tablas y cierra y abre los ficheros de logs. shutdown Detiene el servidor. start-slave Comienza la replicacin en un servidor esclavo. status Muestra un mensaje de estado corto del servidor. stop-slave Detiene la replicacin en un servidor esclavo. variables Muestra las variables de sistema del servidor y sus valores. version Muestra informacin de la versin del servidor. Todos los comandos pueden abreviarse a un prefijo nico. Por ejemplo:
shell> mysqladmin proc stat +----+------+-----------+----+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+----+---------+------+-------+------------------+ | 51 | root | localhost | | Query | 0 | | show processlist | +----+------+-----------+----+---------+------+-------+------------------+ Uptime: 1473624 Threads: 1 Questions: 39487 Slow queries: 0 Opens: 541 Flush tables: 1 Open tables: 19 Queries per second avg: 0.0268 Memory in use: 92M Max memory used: 410M
El comando mysqladmin status muestra los siguientes valores: Uptime Nmero de segundos que MySQL server ha estado en ejecucin.
Questions Nmero de preguntas (consultas) de los clientes desde el arranque del servidor.
Slow queries
464
Nmero de consultas que han tardado ms de long_query_time segundos. Consulte Seccin 5.10.4, El registro de consultas lentas (Slow Query Log).
Memory in use Cantidad de memoria reservada directamente por el cdigo de mysqld. Este valor se muestra slo cuando MySQL es ha compilado con --with-debug=full.
Maximum memory used La cantidad mxima de memoria reservada directamente por el cdigo de mysqld. Este valor se muestra slo cuando MySQL se ha compilado con --with-debug=full. Si ejecuta mysqladmin shutdown al conectar a un servidor local usando ficheros socket Unix, mysqladmin espera hasta que el fichero con el ID del proceso del servidor se haya borrado, para asegurar que el servidor se ha parado correctamente. mysqladmin soporta las siguientes opciones: --help, -? Muestra un mensaje de ayuda y sale. --character-sets-dir=ruta Directorio donde estn instalados los conjuntos de caracteres. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. --compress, -C Comprime toda la informacin enviada entre el cliente y el servidor, si ambos soportan compresin. --count=#, -c # Nmero de iteraciones a realizar en la ejecucin de comandos repetidos. Esto funciona slo con -sleep (-i). --debug[=opciones_de_depuracin], -# [opciones_de_depuracin] Escribe un log de depuracin. La cadena de caracteres opciones_de_depuracin a menudo es 'd:t:o,nombre_de_fichero'. Por defecto es 'd:t:o,/tmp/mysqladmin.trace'.
465
--default-character-set=conjunto_de_caracteres Usa conjunto_de_caracteres como el conjunto de caracteres por defecto. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. --force, -f No pide confirmacin para el comando drop database. Con comandos mltiples, contina incluso si hay un error. --host=nombre_de_equipo, -h nombre_de_equipo Conecta con el servidor MySQL en un equipo dado. --password[=contrasea], -p[contrasea] La contrasea a usar cuando conecta con el servidor. Si usa la forma corta de la opcin (-p), no puede haber un espacio entre la opcin y la contrasea. Si omite el valor contrasea siguiente a la opcin --password o -p en la lnea de comando, aparece un prompt pidindola. --port=nmero_de_puerto, -P nmero_de_puerto Puerto TCP/IP para usar en las conexiones. --protocol={TCP | SOCKET | PIPE | MEMORY} Protocolo de conexin en uso. Nuevo en MySQL 4.1. --relative, -r Muestra la diferencia entre los valores actuales y anteriores cuando se usa con -i. Actualmente, esta opcin slo funciona con el comando extended-status. --silent, -s Sale silenciosamente si no puede establecerse una conexin con el servidor. --sleep=retraso, -i retraso Ejecuta comandos una y otra vez, durmiendo durante retraso segundos entre ellos. --socket=ruta, -S ruta El fichero socket a usar en la conexin. --user=nombre_de_usuario, -u nombre_de_usuario Nombre de usuario MySQL a usar al conectar con el servidor. --verbose, -v Modo explcito. Muestra ms informacin sobre lo que hace el programa. --version, -V Muestra informacin sobre la versin y sale. --vertical, -E Muestra la salida (output) verticalmente. Es similar a --relative, pero la salida es vertical. --wait[=#], -w[#] Si la conexin no puede establecerse, espera y vuelve a intentarlo en lugar de abortar. Si se da un valor de opcin, indica el nmero de veces a reintentar. El valor por defecto es una vez.
466
Puede asignar valores a las siguientes variables usando las opciones --nombre_de_variable=valor : connect_timeout El nmero de segundos mximos antes que la conexin d un timeout. El valor por defecto es 43200 (12 horas). shutdown_timeout El nmero mximo de segundos a esperar para la parada del servidor. El valor por defecto es 3600 (1 hora). Tambin es posible asignar valores a las variables usando la sintaxis --setvariable=nombre_de_variable=valor o -O nombre_de_variable=valor. Sin embargo, esta sintaxis est obsoleta desde MySQL 4.0.
Por ejemplo, para mostrar el contenido del log binario binlog.000003, use este comando:
shell> mysqlbinlog binlog.0000003
La salida incluye todos los comandos contenidos en binlog.000003, junto con otra informacin tal como el tiempo que ha tardado cada comando, el ID del thread del cliente que lo lanz, la hora en que se ejecut, etctera. Normalmente, mysqlbinlog se utiliza para leer ficheros de log binarios directamente y aplicarlos al servidor MySQL local. Tambin es posible leer logs binarios de un servidor remoto usando la opcin --read-from-remote-server . Cuando se vaya a leer logs binarios remotos, deben darse los parmetros de conexin para indicar cmo conectar con el servidor, pero se ignoran a no ser que tambin se especifique la opcin -read-from-remote-server . Estas opciones son --host, --password, --port, --protocol, --socket y --user. Tambin puede utilizarse mysqlbinlog para leer ficheros de logs de relay escritos por un servidor esclavo en el arranque de una replicacin. Los logs de relay tienen el mismo formato que los ficheros de log binarios. El log binario se discute en Seccin 5.10.3, El registro binario (Binary Log). mysqlbinlog soporta las siguientes opciones: --help, -? Muestra un mensaje de ayuda y sale. --database=nombre_de_base_de_datos, -d nombre_de_base_de_datos Muestra las entradas slo para esta base de datos (slo log local) --force-read, -f 467
Con esta opcin, si mysqlbinlog lee de un log binario un evento que no reconoce, muestra una advertencia, ignora el comando, y contina. Sin esta opcin, mysqlbinlog se detiene si lee un evento que no reconoce. --host=nombre_de_equipo, -h nombre_de_equipo Obtiene el log binario del servidor MySQL del equipo dado. --local-load=ruta, -l ruta Prepara ficheros temporales locales para LOAD DATA INFILE en el directorio especificado. --offset=N, -o N Ignora las primeras N entradas. --password[=contrasea], -p[contrasea] La contrasea a usar cuando se conecta al servidor. Si usa la forma corta de opcin (-p), no puede tener un espacio entre la opcin y la contrasea. Si omite el valor contrasea siguiente a la opcin --password o -p en la lnea de comandos, aparece un prompt para que lo introduzca. --port=nmero_de_puerto, -P nmero_de_puerto El puerto TCP/IP a usar cuando conecta con un servidor remoto. --position=N, -j N Obsoleto, use --start-position. --protocol={TCP | SOCKET | PIPE | MEMORY} Protocolo de conexin a usar. --read-from-remote-server, -R Lee el log binario de un servidor MySQL en vez de leer el local. Cualquier opcin de parmetros de conexin se ignora a no ser que esta opcin se d tambin. Estas opciones son --host, -password, --port, --protocol, --socket, y --user. --result-file=nombre, -r nombre Salida directa al fichero dado. --short-form, -s Muestra slo los comandos contenidos en el log, sin ninguna informacin extra. --socket=ruta, -S ruta Fichero socket a usar para la conexin. --start-datetime=datetime Comienza a leer el log binario en el primer evento que tenga una fecha igual o posterior a la del argumento datetime . El valor datetime es relativo a la zona horaria local en la mquina donde se ejecuta mysqlbinlog. El valor debe estar en un formato aceptado por los tipos de datos DATETIME o TIMESTAMP . Por ejemplo:
shell> mysqlbinlog --start-datetime="2004-12-25 11:25:56" binlog.000003
468
--stop-datetime=datetime Detiene la lectura del log binario en el primer evento que tenga una fecha igual o posterior a la del argumento datetime. Consulte la descripcin de la opcin --start-datetime para informacin acerca del valor de datetime. --start-position=N Comienza a leer el log binario en el primer evento que tenga una posicin igual al argumento N. --stop-position=N Deja de leer el log binario en el primer evento que tenga una posicin igual o superior al argumento N. --to-last-log, -t No se detiene al final del log binario solicitado del servidor MySQL, sino que sigue mostrando informacin hasta el final del ltimo log binario. Si se enva la salida (output) al mismo servidor MySQL, esto puede conducir a un bucle infinito. Esta opcin requiere --read-from-remoteserver. --disable-log-bin, -D Desactiva el log binario. Esto es til para eliminar un bucle infinito si se utiliza la opcin --tolast-log y enva la salida (output) al mismo servidor MySQL. Esta opcin tambin es til cuando se restaura tras un fallo para evitar duplicacin de comandos que se han logueado. Nota: Esta opcin requiere privilegios SUPER . --user=nombre_de_usuario, -u nombre_de_usuario Nombre de usuario MySQL a usar cuando se conecta a un servidor remoto. --version, -V Muestra versin de informacin y sale. Puede cambiar las siguientes variales con las opciones --nombre_de_variable=valor: open_files_limit Especifica el nmero de descriptores de ficheros abiertos a reservar. Puede enviar la salida (output) de mysqlbinlog a un cliente mysql para que ejecute los comandos contenidos en el log binario. Esto se usa para recuperar de un fallo cuando tiene una copia de seguridad antigua (consulte Seccin 5.8.1, Copias de seguridad de bases de datos):
shell> mysqlbinlog nombre_de_equipo-bin.000001 | mysql
O:
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
Tambin puede redirigir la salida (output) de mysqlbinlog a un fichero de texto, si necesita modificar el log de comandos primero (por ejemplo, para eliminar comandos que no quiere ejecutar por alguna razn). Tras editar el fichero, ejecute los comandos que contiene usndolo como entrada del programa mysql . mysqlbinlog tiene la opcin --start-position, que muestra slo aquellos comandos con un desplazamiento en el log binario mayor o igual a una posicin dada (la posicin dada debe coincidir con el comienzo de un evento). Tambin tiene las opciones de parar o arrancar cuando ve un evento de una fecha y hora dada. Esto permite ejecutar recuperaciones a partir de un punto temporal usando la opcin --stop-datetime (que permite decir, por ejemplo, "devuelve mi base de datos al estado en que estaba hoy a las 10:30 AM").
469
Si tiene ms de un log binario para ejecutar en el servidor MySQL, el mtodo seguro es procesarlos todos usando una conexin nica con el servidor. El siguiente ejemplo muestra una forma peligrosa de hacerlo:
shell> mysqlbinlog nombre_de_equipo-bin.000001 | mysql # PELIGRO!! shell> mysqlbinlog nombre_de_equipo-bin.000002 | mysql # PELIGRO!!
Procesar logs binarios de esta manera, utilizando diferentes conexiones con el servidor provoca problemas si el primer fichero de log contiene un comando CREATE TEMPORARY TABLE y el segundo log contiene un comando que usa la tabla temporal. Cuando el primer proceso mysql termina, el servidor elimina la tabla temporal. Cuando el segundo proceso mysql trata de usar la tabla, el servidor devuelve tabla desconocida. Para evitar problemas como ste, utilice una nica conexin para ejecutar los contenidos de todos los logs binarios que quiere procesar. Sigue una forma de hacerlo:
shell> mysqlbinlog nombre_de_equipo-bin.000001 nombre_de_equipo-bin.000002 | mysql
Otra forma de hacerlo es escribir todos los logs a un nico fichero y luego procesar el fichero:
shell> mysqlbinlog nombre_de_equipo-bin.000001 > /tmp/statements.sql shell> mysqlbinlog nombre_de_equipo-bin.000002 >> /tmp/statements.sql shell> mysql -e "source /tmp/statements.sql"
En MySQL 5.0, mysqlbinlog puede producir la salida (output) que reproduce una operacin LOAD DATA INFILE sin el fichero de datos original. mysqlbinlog copia los datos en un fichero temporal y escribe un comando LOAD DATA LOCAL INFILE que se refiere a este fichero. La localizacin por defecto del directorio donde estos ficheros se escriben es especfico del sistema. Para espeficar un directorio explcitamente, use la opcin --local-load. Como mysqlbinlog convierte comandos LOAD DATA INFILE en comandos LOAD DATA LOCAL INFILE (esto es, aade LOCAL). Tanto el cliente como el servidor que se utiliza para procesar los comandos deben estar configurados para permitir LOCAL. Consulte Seccin 5.5.4, Cuestiones relacionadas con la seguridad y LOAD DATA LOCAL. Atencin: Los ficheros temporales creados por comandos LOAD DATA LOCAL no se borran automticamente ya que se necesitan hasta que los comandos se ejecutan totalmente. Debe borrar los ficheros temporales cuando no necesite el log de comandos. Los ficheros pueden encontrarse en el directorio de ficheros temporales y tienen nombres como original_file_name-#-#. En el futuro, eliminaremos este problema permitiendo que mysqlbinlog pueda conectarse directamente a un servidor mysqld. As ser posible eliminar los ficheros de log automticamente cuando los comandos LOAD DATA INFILE se hayan ejecutado.
470
Si no nombra ninguna tabla o usa las opciones --databases o --all-databases, se comprueban todas las bases de datos. mysqlcheck tiene una caracterstica especial comparado con otros clientes. El comportamiento por defecto de comprobar tablas (--check) puede cambiarse renombrando el binario. Si quiere tener una herramienta que repare las tablas por defecto, debe hacer una copia de mysqlcheck llamada mysqlrepair, o hacer un enlace simblico a mysqlcheck llamado mysqlrepair. Si invoca mysqlrepair, repara tablas. Los siguientes nombres pueden usarse para cambiar el comportamiento por defecto de mysqlcheck : mysqlrepair mysqlanalyze mysqloptimize La opcin por defecto es --repair La opcin por defecto es --analyze La opcin por defecto es --optimize
mysqlcheck soporta las siguientes opciones: --help, -? Muestra el mensaje de ayuda y sale. --all-databases, -A Comprueba todas las tablas en todas las bases de datos. Esto es lo mismo que usar la opcin -databases y llamar todas las bases de datos en la lnea de comandos. --all-in-1, -1 En lugar de realizar un comando para cada tabla, ejecuta un nico comando para cada base de datos, que nombra todas las tablas de la base de datos a procesar. --analyze, -a Analiza las tablas. --auto-repair Si una tabla comprobada est corrupta, la repara automticamente. Cualquier reparacin necesaria se hace tras el chequeo de cada tabla. --character-sets-dir=path El directorio donde los conjuntos de caracteres estn instalados. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. --check, -c Comprueba las tablas en busca de errores. --check-only-changed, -C Chequea slo tablas que han cambiado desde la ltima comprobacin o que no se han cerrado correctamente. --compress Comprime toda la informacin enviada entre el cliente y el servidor si ambos soportan compresin. --databases, -B Procesa todas las tablas en la base de datos especificada. Con esta opcin, todos los argumentos nombrados se tratan como nombres de bases de datos, no como nombres de tablas.
471
--debug[=opciones_de_depuracin], -# [opciones_de_depuracin] Escribe un log de depuracin. La cadena de caracteres opciones_de_depuracin a menudo es 'd:t:o,nombre_de_fichero'. --default-character-set=conjunto_de_caracteres Usa conjunto_de_caracteres como el conjunto de caracteres por defecto. ConsulteSeccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. --extended, -e Si usa esta opcin para comprobar tablas, se asegura que sean 100% consistentes pero tarda bastante. Si usa esta opcin para reparar tablas, ejecuta una reparacin extendida que puede no slo tardar bastante tiempo, sino que tambin puede producir un montn de registros basura! --fast, -F Comprueba slo tablas que no se han cerrado correctamente. --force, -f Contina incluso si se produce un error SQL. --host=nombre_de_equipo, -h nombre_de_equipo Conecta con el servidor MySQL en el equipo dado. --medium-check, -m Realiza un chequeo que es ms rpido que la operacin --extended. Esto encuentra slo el 99.99% de todos los errores, lo cual debera ser suficiente en la mayora de casos. --optimize, -o Optimiza las tablas. --password[=contrasea], -p[contrasea] La contrasea a usar cuando se conecta con el servidor. Si usa la opcin con su forma corta (p), no puede haber un espacio entre la opcin y la contrasea. Si omite el valor contrasea a continuacin de la opcin --password o -p en la lnea de comandos, aparece un prompt pidindola. --port=nmero_de_puerto, -P nmero_de_puerto El puerto TCP/IP para usar en la conexin. --protocol={TCP | SOCKET | PIPE | MEMORY} Protocolo de conexin a usar. --quick, -q Si usa esta opcin para comprobar tablas, evita que el chequeo escanee los registros para buscar enlaces incorrectos. Es el mtodo de chequeo ms rpido. Si se utiliza esta opcin para reparar tablas, el programa intenta reparar slo el rbol del ndice. Este es el mtodo ms rpido de reparacin. --repair, -r
472
Hace una reparacin que puede arreglar prcticamente todo excepto claves nicas que no son nicas. --silent, -s Modo silencioso. Slo muestra mensajes de error. --socket=ruta, -S ruta Fichero socket a usar en la conexin. --tables Ms prioritaria que la opcin --databases o -B. Todos los argumentos que vienen despus de la opcin se consideran nombres de tablas. --user=nombre_de_usuario, -u nombre_de_usuario El nombre de usuario MySQL a usar cuando se conecta al servidor. --verbose, -v Modo explcito. Muestra informacin acerca de varios estados de las operaciones del programa. --version, -V Muestra informacin de la versin y sale.
Si no se nombra ninguna tabla o se utiliza la opcin --databases o --all-databases, se vuelca bases de datos enteras. Para obtener una lista de las opciones que soporta su versin de mysqldump, ejecute mysqldump --help. Si ejecuta mysqldump sin las opciones --quick o --opt, mysqldump carga el resultado entero en memoria antes de volcarlo. Esto puede ser un problema si est volcando una base de datos grande. En MySQL 4.0, --opt est activado por defecto, pero puede desactivarse con --skip-opt. Si est utilizando una copia reciente del programa mysqldump para generar un volcado que tiene que ser cargado en un servidor MySQL muy viejo, no debe usar las opciones --opt ni -e . mysqldump soporta las siguientes opciones: --help, -?
473
Muestra un mensaje de ayuda y sale. --add-drop-table Aade un comando DROP TABLE antes de cada comando CREATE TABLE . --add-locks Rodea cada volcado de tabla con los comandos LOCK TABLES y UNLOCK TABLES. Esto provoca inserciones ms rpidas cuando el fichero volcado se recarga. Consulte Seccin 7.2.14, Velocidad de la sentencia INSERT. --all-databases, -A Vuelca todas las tablas en todas las bases de datos. Es como utilizar la opcin --databases y nombrar todas las bases de datos en la lnea de comando. --allow-keywords Permite la creacin de columnas con nombres que son palabras claves. Esto funciona aadiendo un prefijo a cada nombre de columna con el nombre de tabla. --comments[={0|1}] Si tiene como valor 0, suprime informacin adicional en el fichero de volcado como la versin del programa, la versin del servidor, y el equipo. --skip-comments tiene el mismo efecto que -comments=0. El valor por defecto es 1, que incluye la informacin extra. --compact Produce una salida (output) menos explcita. Esta opcin suprime comentarios y activa las opciones --skip-add-drop-table, --no-set-names, --skip-disable-keys, y --skip-add-locks . --compatible=nombre Produce una salida que es compatible con otros sistemas de bases de datos o con servidores MySQL antiguos. El valor de name puede ser ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, o no_field_options. Para usar varios valores, seprelos por comas. Estos valores tienen el mismo significado que las opciones correspondientes para asignar el modo SQL del servidor. Consulte Seccin 5.3.2, El modo SQL del servidor. --complete-insert, -c Usa comandos INSERT compuestos que incluyen nombres de columnas. --compress, -C Comprime toda la informacin enviada entre el cliente y el servidor si ambos admiten compresin. --create-options Incluye todas las opciones de tabla especficas de MySQL en el comando CREATE TABLE. --databases, -B Vuelca varias bases de datos. Normalmente, mysqldump trata el primer argumento de la lnea de comandos como un nombre de base de datos y los siguientes argumentos como nombres de tablas. Con esta opcin, trata todos los argumentos como nombres de bases de datos. Los comandos CREATE DATABASE IF NOT EXISTS nombre_de_base_de_datos y USE
474
nombre_de_base_de_datos estn includos en la salida (output) antes de cada nueva base de datos. --debug[=opciones_de_depuracin], -# [opciones_de_depuracin] Escribe un log de depuracin. La cadena de caracteres opciones_de_depuracin normalmente es 'd:t:o,nombre_de_fichero'. --default-character-set=conjunto_de_caracteres Usa conjunto_de_caracteres como el conjunto de caracteres por defecto. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. Si no se especifica, mysqldump desde MySQL 5.0 utiliza utf8. --delayed-insert Inserta registros usando comandos INSERT DELAYED. Esta opcin se elimini en MySQL 5.0.7. --delete-master-logs En servidores de replicacin maestros, borra los logs binarios tras realizar la operacin de volcado. En MySQL 5.0, esta opcin se activa automticamente --master-data. --disable-keys, -K Para cada tabla, rodea el comando INSERT con /*!40000 ALTER TABLE tbl_name DISABLE KEYS */; y /*!40000 ALTER TABLE tbl_name ENABLE KEYS */;. Esto hace que la carga del fichero volcado en MySQL 4.0 o posteriores sea ms rpida porque los ndices se crean slo tras la insercin de todos los registros. Esta opcin es efectiva slo para tablas MyISAM . --extended-insert, -e Usa la sintaxis de INSERT de mltiples registros, que incluyen una lista de varios VALUES. Esto genera un fichero de volcado de menor tamao y acelera las inserciones cuando se recarga el fichero. --fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionallyenclosed-by=..., --fields-escaped-by=..., --lines-terminated-by=... Estas opciones se usan con la opcin -T y tienen el mismo significado que las clusulas correspondientes de LOAD DATA INFILE. Consulte Seccin 13.2.5, Sintaxis de LOAD DATA INFILE. --first-slave, -x Obsoleto. Ahora es --lock-all-tables. --flush-logs, -F Vuelca los ficheros de log MySQL antes de empezar el volcado. Esta opcin necesita el permiso RELOAD. Tenga en cuenta que si utiliza esta opcin en combinacin con la opcin --alldatabases (o -A) los logs se vuelcan para cada base de datos volcada. La excepcin es cuando se usa --lock-all-tables o --master-data. En estos casos, los logs se vuelcan slo una vez, en el momento en que todas las tablas estn bloqueadas. Si quiere que el volcado de la base de datos y el del log ocurran exactamente en el mismo momento, debe usar --flush-logs junto con --lock-all-tables o --master-data. --force, -f Contina incluso si ocurre un error SQL durante un volcado de tabla. --host=nombre_de_equipo, -h nombre_de_equipo
475
Vuelca datos de un servidor MySQL en el equipo dado. Por defecto el equipo es localhost. --hex-blob Vuelca columnas de cadenas de caracteres binarios usando notacin hexadecimal (por ejemplo, 'abc' es 0x616263). Las columnas sobre las que tiene efecto en MySQL 5.0 son BINARY, VARBINARY, BLOB. --lock-all-tables, -x Bloquea todas las tablas de todas las bases de datos. Esto se consigue estableciendo un bloqueo de lectura global que dura durante todo el volcado. Esta opcin desactiva automticamente -single-transaction y --lock-tables. --lock-tables, -l Bloquea todas las tablas antes de comenzar el volcado. Las tablas se bloquean con READ LOCAL para permitir inserciones concurrentes en caso de tablas MyISAM . Para tablas transaccionales como InnoDB y BDB, --single-transaction es una opcin mucho mejor, ya que no necesita bloquear las tablas. Tenga en cuenta que al volcar mltiples bases de datos, --lock-tables bloquea tablas para cada base de datos separadamente. As, esta opcin no garantiza que las tablas en el fichero volcado sean lgicamente consistentes entre bases de datos. Tablas en bases de datos distintas pueden volcarse en estados completamente distintos. --master-data[=valor] Esta opcin causa que se escriba en la salida (output) la posicin y el nombre de fichero del log binario. Esta opcin necesita el permiso RELOAD y el log binario debe estar activado. Si el valor de la opcin es igual a 1, la posicin y nombre de fichero se escriben en la salida del volcado en forma de comando CHANGE MASTER que hace que un servidor esclavo empiece desde la posicin correcta en el log binario del maestro si usa este volcado SQL del maestro para preparar un esclavo. Si el valor de la opcin es igual a 2, el comando CHANGE MASTER se escribe como un comentario SQL. sta es la accin por defecto si se omite valor . La opcin --master-data activa --lock-all-tables, a no ser que --single-transaction tambin est especificado (en tal caso, se establece un bloqueo de lectura global slo durante un corto periodo de tiempo al principio del volcado. Consulte la descripcin de --singletransaction. En cualquier caso, cualquier accin en logs se realiza en el momento exacto del volcado. Esta opcin automticamente desactiva --lock-tables. --no-create-db, -n Esta opcin suprime el comando CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name que se incluye de otro modo en la salida si se especifica las opciones --databases o --alldatabases. --no-create-info, -t No escribe los comandos CREATE TABLE que recrean cada tabla volcada. --no-data, -d No escribe ningn registro de la tabla. Esto es muy til si slo quiere obtener un volcado de la estructura de una tabla. --opt Esta opcin es una abreviatura; es lo mismo que especificar --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick
476
--set-charset. Causa una operacin de volcado rpida y produce un fichero de volcado que puede recargarse en un servidor MySQL rpidamente. En MySQL 5.0, --opt est activado por defecto, pero puede desactivarse con --skip-opt. Para desactivar slo algunas de las opciones activadas por --opt, use la forma --skip; por ejemplo --skip-add-drop-table o -skip-quick. --password[=contrasea], -p[contrasea] La contrasea a usar al conectar con el servidor. Si usa la opcin en forma corta (-p), no puede haber un espacio entre la opcin y la contrasea. Si omite el valor de contrasea a continuacin de la opcin --password o -p en la lnea de comandos, aparece un prompt pidindola. --port=nmero_de_puerto, -P nmero_de_puerto El puerto TCP/IP a usar en la conexin. --protocol={TCP | SOCKET | PIPE | MEMORY} Protocolo de conexin a usar. --quick, -q Esta opcin es til para volcar tablas grandes. Fuerza mysqldump a recibir los registros de una tabla del servidor uno a uno en lugar de recibir el conjunto completo de registros y guardarlos en memoria antes de escribirlos. --quote-names, -Q Limita los nombres de base de datos, tablas, y columnas con caracteres '`' . Si el modo SQL del servidor incluye la opcin ANSI_QUOTES, los nombres se ponen entre caracteres '"'. En MySQL 5.0, --quote-names est activado por defecto, pero puede desactivarse con --skip-quote-names. --result-file=fichero, -r fichero Redirige la salida a un fichero dado. Esta opcin debe usarse en Windows, ya que previene que los caracteres de nueva lnea '\n' se conviertan en secuencias de retorno/nueva lnea '\r\n'. --set-charset Aade SET NAMES conjunto_de_caracteres_por_defecto a la salida (output). Esta opcin est activada por defecto. Para suprimir el comando SET NAMES, use --skip-set-charset. --single-transaction Esta opcin realiza un comando SQL BEGIN antes de volcar los datos del servidor. Es til slo con tablas transaccionales tales como las InnoDB y BDB, ya que vuelca el estado consistente de la base de datos cuando se ejecuta BEGIN sin bloquear ninguna aplicacin. Cuando use esta opcin, debe tener en cuenta que slo las tablas InnoDB se vuelcan en un estado consistente. Por ejemplo, cualquier tabla MyISAM o HEAP volcadas mientras se usa esta opcin todava pueden cambiar de estado. La opcin --single-transaction y la opcin --lock-tables son mutuamente exclusivas, ya que LOCK TABLES provoca que cualquier transaccin pendiente se confirme implcitamente. Para volcar tablas grandes, debe combinar esta opcin con --quick. --socket=ruta, -S ruta El fichero socket a usar cuando se conecta con localhost (que es el equipo por defecto). --skip-comments
477
Consulte la descripcin de la opcin --comments. --tab=ruta, -T ruta Produce ficheros con datos separados por tabuladores. Para cada tabla volcada mysqldump crea un fichero nombre_de_tabla.sql que contiene el comando CREATE TABLE que crea la tabla, y un fichero nombre_de_tabla.txt que contiene los datos. El valor de esta opcin es el directorio en el que escribir los ficheros. Por defecto, los ficheros de datos .txt se formatean usando tabuladores entre los valores de las columnas y una nueva lnea tras cada registro. El formato puede especificarse explcitamente usando las opciones --fields-xxx y --lines--xxx. Nota: Esta opcin debe usarse slo cuando mysqldump se ejecuta en la misma mquina que el servidor mysqld. Se debe tener el permiso FILE, y el servidor debe tener permisos para escribir ficheros en el directorio que se especifique. --tables Tiene mayor prioridad que --databases o -B. Todos los argumentos que vienen despus de esta opcin se tratan como nombres de tablas. --user=nombre_de_usuario, -u nombre_de_usuario Nombre de usuario MySQL a usar al conectar con el servidor. --verbose, -v Modo explcito. Muestra ms informacin sobre lo que hace el programa. --version, -V Muestra informacin de versin y sale. --where='condicin_where', -w 'condicin_where' Vuelca slo registros seleccionados por la condicin WHERE dada. Tenga en cuenta que las comillas alrededor de la condicin son obligatorias si contienen espacios o caracteres especiales para el intrprete de comandos. Ejemplos:
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
--xml, -X Escribe la salida del volcado como XML bien formado. Puede cambiar las siguientes variables usando las opciones --nombre_de_variable=valor: max_allowed_packet Tamao mximo del bfer para la comunicacin cliente/servidor. En MySQL 5.0, el valor de esta variable puede ser de hasta 1GB. net_buffer_length Tamao inicial del bfer para la comunicacin cliente/servidor. Cuando se crean comandos de insercin de mltiples registros (como con las opciones --extended-insert o --opt), mysqldump crea registros de longitud mxima net_buffer_length. Si incrementa esta variable,
478
debe asegurarse tambin de que la variable net_buffer_length en el servidor MySQL tenga como mnimo esta longitud. Tambin es posible cambiar variables usando la sintaxis --setvariable=nombre_de_variable=valor o -O nombre_de_variable=valor. Sin embargo, esta sintaxis est obsoleta. El uso ms comn de mysqldump es para hacer una copia de seguridad de toda la base de datos:
shell> mysqldump --opt nombre_de_base_de_datos > fichero_de_seguridad.sql
mysqldump es muy til para poblar bases de datos copiando los datos de un servidor MySQL a otro:
Si las tablas se guardan con el motor de almacenamiento InnoDB, mysqldump proporciona una forma de realizar una copia de seguridad de las mismas (consulte los comandos a continuacin). Esta copia de seguridad slo necesita un bloqueo local de todas las tablas (usando FLUSH TABLES WITH READ LOCK) al principio del volcado. En cuanto obtiene el bloqueo, se lee el log binario y se libera el bloqueo. Si y slo si un comando de actualizacin largo est en ejecucin cuando se ejecuta FLUSH..., el servidor MySQL puede quedar bloqueado hasta que acabe este comando largo, y luego el volcado queda sin ningn bloqueo. Si el servidor MySQL recibe slo comandos de actualizacin cortos (en el sentido de "poco tiempo de ejecucin"), incluso si son muchos, el periodo inicial de bloqueo no debe ser un problema.
shell> mysqldump --all-databases --single-transaction > todas_las_bases_de_datos.sql
Para una recuperacin en un momento dado (tambin comocido como "roll-forward", cuando necesita restaurar una copia de seguridad antigua y recrear los cambios que han ocurrido desde tal copia de seguridad), es til rotar el log binario (consulte Seccin 5.10.3, El registro binario (Binary Log)) o al menos conozca las coordinadas del log binario que se corresponden con el volcado:
shell> mysqldump --all-databases --master-data=2 > todas_las_bases_de_datos.sql or shell> mysqldump --all-databases --flush-logs --master-data=2 > todas_las_bases_de_datos.sql
El uso simultneo de --master-data y --single-transaction proporciona una forma de hacer copias de seguridad en lnea apropiadas para recuperaciones en un momento dado, si las tablas se guardan con el motor de almacenamiento InnoDB. Para ms informacin sobre copias de seguridad, consulte Seccin 5.8.1, Copias de seguridad de bases de datos.
mysqlhotcopy es un script Perl que fue escrito originalmente por Tim Bunce. Usa LOCK TABLES, FLUSH TABLES, y cp o scp para realizar una copia de seguridad rpida de la base de datos. Es la forma ms rpida de hacer una copia de seguridad de la base de datos o de tablas, pero slo puede ejecutarse en la misma mquina donde est el directorio de base de datos. mysqlhotcopy slo realiza copias de seguridad de tablas MyISAM. Funciona en Unix y NetWare.
shell> mysqlhotcopy nombre_de_base_de_datos [/ruta/al/nuevo_directorio] shell> mysqlhotcopy nombre_de_base_de_datos_1 ... nombre_de_base_de_datos_n /ruta/al/nuevo_directorio
En la base de datos sealada realiza una copia de seguridad de las tablas que verifican una expresin regular dada:
shell> mysqlhotcopy nombre_de_base_de_datos./expresin_regular/
La expresin regular para el nombre de tabla puede negarse precedindola con una tilde ('~'):
shell> mysqlhotcopy nombre_de_base_de_datos./~expresin_regular/
mysqlhotcopy soporta las siguientes opciones: --help, -? Muestra un mensaje de ayuda y sale. --allowold No aborta si el objetivo ya existe (lo renombra aadiendo un sufijo _old ). --checkpoint=nombre_de_base_de_datos.nombre_de_tabla Inserta puntos de referencia en la base de datos nombre_de_base_de_datos y en la tabla nombre_de_tabla. --debug Activa la opcin de depuracin. --dryrun, -n Reporta acciones sin ejecutarlas realmente. --flushlog Vuelca logs tras bloquear todas las tablas. --keepold No borra objetivos previos (renombrados) cuando acaba. --method=# Mtodo para copiar (cp o scp). --noindices No incluye los ndices en la copia de seguridad. Esto hace que la copia de seguridad sea ms inteligente y rpida. Los ndices pueden reconstruirse posteriormente con myisamchk -rq. --password=contrasea, -pcontrasea La contrasea a usar al conectar con el servidor. Tenga en cuenta que el valor de la contrasea no es opcional para esta opcin, no como con otros programas MySQL. --port=nmero_de_puerto, -P nmero_de_puerto
480
El puerto TCP/IP a usar cuando se conecta el servidor local. --quiet, -q Es silencioso excepto para errores. --regexp=expresin_regular Copia todas las bases de datos con nombres que cumplan la expresin regular dada. --socket=ruta, -S ruta El fichero socket Unix a usar para la conexin. --suffix=cadena El sufijo para nombres de bases de datos copiadas. --tmpdir=ruta Directorio temporal (en lugar de /tmp). --triggers Vuelca disparadores para cada tabla volcada. Esta opcin est activada por defecto; desactvela con --skip-triggers. Esta opcin se aadi en MySQL 5.0.11. Antes de esta versin, los disparadores no se vuelcan. --user=nombre_de_usuario, -u nombre_de_usuario El nombre de usuario MySQL a usar cuando se conecta al servidor. mysqlhotcopy lee los grupos de opciones [client] y [mysqlhotcopy] de los ficheros de opciones. Para ejecutar mysqlhotcopy, debe tener: acceso a los ficheros de las tablas de las que est haciendo copia de seguridad; el permiso SELECT para estas tablas; y el permiso RELOAD (para poder ejecutar FLUSH TABLES). Use perldoc para informacin adicional de mysqlhotcopy:
shell> perldoc mysqlhotcopy
Del nombre de cada fichero de texto especificado en la lnea de comandos, mysqlimport elimina cualquier extensin, y utliza el resultado para determinar el nombre de la tabla a la que importar el contenido del fichero. Por ejemplo, los ficheros con nombres patient.txt, patient.text y patient se importaran todos a la tabla llamada patient. mysqlimport soporta las siguientes opciones: --help, -? Muestra un mensaje de ayuda y sale.
481
--columns=lista_de_columnas, -c lista_de_columnas Esta opcin admite una lista de nombres de columnas separados por comas. El orden de los nombres de columna indica cmo emparejar las columnas de los ficheros de datos con las columnas de la tabla. --compress, -C Comprime toda la informacin enviada entre el cliente y el servidor, si ambos soportan compresin. --debug[=opciones_de_depuracin], -# [opciones_de_depuracin] Escribe un log de depuracin. La cadena de caracteres opciones_de_depuracin a menudo es 'd:t:o,nombre_de_fichero'. --delete, -D Vaca la tabla antes de importar el fichero de texto. --fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionallyenclosed-by=..., --fields-escaped-by=..., --lines-terminated-by=... Estas opciones tienen el mismo significado que las clusulas correspondientes de LOAD DATA INFILE. Consulte Seccin 13.2.5, Sintaxis de LOAD DATA INFILE. --force, -f Ignora errores. Por ejemplo, si una tabla para un fichero de texto no existe, sigue procesando el resto de ficheros. Sin --force, mysqlimport finaliza si la tabla no existe. --host=nombre_de_equipo, -h nombre_de_equipo Importa datos al servidor MySQL en el equipo dado. El equipo por defecto es localhost. --ignore, -i Consulte la descripcin para la opcin --replace. --ignore-lines=n Ignora las primeras n lneas del fichero de datos. --local, -L Lee los ficheros de entrada localmente del equipo cliente. --lock-tables, -l Bloquea todas las tablas para escritura antes de procesar cualquier fichero de texto. Esto asegura que todas las tablas estn sincronizadas en el servidor. --password[=contrasea], -p[contrasea] La contrasea a usar cuando se conecta al servidor. Si usa la opcin en su forma corta (-p), no puede haber un espacio entre la opcin y la contrasea. Si omite el valor de contrasea a continuacin de --password o -p en la lnea de comandos, aparece un prompt para que lo introduzca. --port=nmero_de_puerto, -P nmero_de_puerto El puerto TCP/IP para usar en la conexin. --protocol={TCP | SOCKET | PIPE | MEMORY}
482
El protocolo de conexin a usar. Nuevo en MySQL 4.1. --replace, -r Las opciones --replace y --ignore controlan el tratamiento de registros de entrada que duplican registros existentes con valores clave nicos. Si especifica --replace, los nuevos registros replazan los existentes que tengan el mismo valor clave. Si especifica --ignore, los registros nuevos que duplican un registro existente con el mismo valor clave se ignoran. Si no especifica ninguna opcin, se produce un error cuando se encuentra un valor duplicado, y el resto del fichero de texto se ignora. --silent, -s Modo silencioso. Slo muestra mensajes de error. --socket=ruta, -S ruta Fichero socket a usar al conectar con localhost (que es el equipo por defecto). --user=nombre_de_usuario, -u nombre_de_usuario El nombre de usuario MySQL a usar cuando se conecta con el servidor. --verbose, -v Modo explcito. Muestra ms informacin sobre lo que hace el programa. --version, -V Muestra informacin de versin y sale. Ejemplo de una sesin que demuestra el uso de mysqlimport:
shell> mysql -e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test shell> ed a 100 Max Sydow 101 Count Dracula . w imptest.txt 32 q shell> 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 shell> mysqlimport --local test imptest.txt test.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 shell> mysql -e 'SELECT * FROM imptest' test +------+---------------+ | id | n | +------+---------------+ | 100 | Max Sydow | | 101 | Count Dracula | +------+---------------+
0 \n
483
Si no se da una base de datos, se muestran todas las bases de datos. Si no se da una tabla, se muestran todas las tablas de la base de datos. Si no se da una columna, se muestran todas las columnas y tipos de columnas de la tabla. Si el ltimo argumento contiene caracteres de shell o comodines SQL ('*', '?', '%', o '_'), slo se muestran aqullos nombres que coinciden con el comodn. Si un nombre de base de datos contiene algn carcter de subrayado, debe ponerse una barra invertida (algunos shells Unix necesitan dos) para obtener una lista de las tablas o columnas adecuadas. Los caracteres '*' y '?' se convierten en los caracteres comodines SQL '%' y '_'. Esto puede causar confusin cuando se trate de mostrar las columnas para una tabla con '_' en el nombre, ya que en este caso mysqlshow muestra slo los nombres de tablas que cumplen con el patrn. Esto se puede arreglar fcilmente aadiendo un carcter '%' extra en la lnea de comandos como argumento separado. mysqlshow soporta las siguientes opciones: --help, -? Muestra un mensaje de ayuda y sale. --character-sets-dir=ruta El directorio donde estn instalados los conjuntos de caracteres. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. --compress, -C Comprime toda la informacin enviada entre el cliente y el servidor si ambos soportan compresin. --debug[=opciones_de_depuracin], -# [opciones_de_depuracin] Escribe un log de depuracin. La cadena de caracteres opciones_de_depuracin a menudo es 'd:t:o,nombre_de_fichero'. --default-character-set=conjunto_de_caracteres Usa conjunto_de_caracteres como el conjunto de caracteres por defecto. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. --host=nombre_de_equipo, -h nombre_de_equipo Conecta con el servidor MySQL del equipo dado. --keys, -k Muestra los ndices de la tabla. --password[=contrasea], -p[contrasea] La contrasea a usar cuando se conecta con el servidor. Si usa el formato corto de la opcin (p), no puede haber un espacio entre la opcin y la contrasea. Si omite el valor de contrasea a continuacin de la opcin --password o -p en la lnea de comandos, aparece un prompt para que lo introduzca. --port=nmero de puerto, -P nmero de puerto El puerto TCP/IP a usar para la conexin. --protocol={TCP | SOCKET | PIPE | MEMORY}
484
El protocolo de conexin a usar. --show-table-type Muestra una columna indicando el tipo de tabla, como con SHOW FULL TABLES. Nuevo en MySQL 5.0.4. --socket=ruta, -S ruta El fichero socket a usar cuando se conecta con localhost (que es el equipo por defecto). --status, -i Muestra informacin extra de cada tabla. --user=nombre_de_usuario, -u nombre_de_usuario El nombre de usuario MySQL a usar cuando se conecta al servidor. --verbose, -v Modo explcito. Muestra ms informacin sobre lo que hace el programa. Esta opcin puede usarse varias veces para incrementar la cantidad de informacin. --version, -V Muestra informacin de versin y sale.
Puede aclararse qu significa cada cdigo de error examinando la documentacin del sistema o utilizando la utilidad perror . perror muestra la descripcin de cdigos de error del sistema y del motor de almacenamiento (lo que maneja las tablas). Invoque perror as:
shell> perror [opciones] cdigo_de_error ...
Ejemplo:
shell> perror 13 64 Error code 13: Permission denied Error code 64: Machine is not on the network
Nota: Para obtener el mensaje de error para un cdigo de error de MySQL, invoque perror con la opcin --ndb :
shell> perror --ndb errorcode
Tenga en cuenta que el significado de los mensajes de error de sistema pueden ser dependientes del sistema operativo. Un cdigo de error puede significar cosas distintas en diferentes sistemas operativos.
El programa replace cambia cadenas de caracteres en ficheros o en la entrada estndar. Utiliza una mquina de estado finito para encontrar las cadenas de caracteres ms largas en primer lugar. Puede utilizarse para cambiar cadenas de caracteres. Por ejemplo, el siguiente comando intercambia a y b en los ficheros dados, fichero1 y fichero2:
shell> replace a b b a -- fichero1 fichero2 ...
Use la opcin -- para indicar dnde acaba la lista de reemplazo de cadena de caracteres y dnde empieza el nombre del fichero. Todo fichero nombrado en la lnea de comandos se modifica en su ubicacin, as que puede ser conveniente hacer una copia de seguridad del fichero original antes de modificarlo. Si no se especifica ningn fichero en la lnea de comandos replace lee la entrada estndar y escribe en la salida estndar. En este caso, no se necesita ninguna opcin -- . msql2mysql utiliza el programa replace. Consulte Seccin 24.1.1, msql2mysql . replace soporta las siguientes opciones: -?, -I Muestra un mensaje de ayuda y sale. -# opciones_de_depuracin Escribe un log de depuracin. La cadena de caracteres opciones_de_depuracin a menudo es 'd:t:o,nombre_de_fichero'. -s Modo silencioso. Muestra menos informacin sobre lo que hace el programa. -v Modo explcito. Muestra ms informacin sobre lo que hace el programa. -V Muestra informacin de versin y sale.
486
Si el modo de servidor tiene habilitado ANSI_QUOTES, las cadenas solamente pueden delimitarse con comillas simples. Una cadena delimitada por comillas dobles ser interpretada como un identificador. A partir de MySQL 4.1.1, las cadenas pueden tener una parte indicativa del conjunto de caracteres y una clusula COLLATE:
[_conjunto_caracteres]'cadena' [COLLATE tipo_ordenacin]
Ejemplos:
487
Cadenas de caracteres
Para ms informacin sobre esta sintaxis consulte Seccin 10.3.7, Conjunto de caracteres y colacin de columnas carcter. Dentro de una cadena, ciertas secuencias de caracteres tienen un significado especial. Cada una de estas secuencias comienza con una barra diagonal invertida ('\'), conocida como caracter de escape. MySQL reconoce las siguientes secuencias de escape: \0 \' \" \b \n \r \t \Z Un caracter ASCII 0 (NUL). Un caracter de comilla simple ('''). Un carcter de comilla doble ('"'). Un carcter de retroceso. Un carcter de salto de lnea. Un carcter de retorno de carro. Un carcter de tabulacin. ASCII 26 (Control-Z). Este carcter puede codificarse como '\Z' para solventar el problema de que el ASCII 26 se interpreta en Windows como fin de fichero. (El ASCII 26 causar problemas si se intenta emplear mysql nombre_bd < nombre_fichero.) Un carcter de barra invertida ('\'). Un carcter '%'. Consulte la nota a continuacin. Un carcter '_'. Consulte la nota a continuacin.
\\ \% \_
Estas secuencias son sensibles a maysculas. Por ejemplo, '\b' se interpreta como carcter de retroceso, pero '\B' se interpreta como 'B'. Las secuencias '\%' y '\_' se emplean para buscar apariciones literales de '%' y '_' en un contexto de bsqueda por patrones, donde en otro caso se debieran interpretar como caracteres comodines. Consulte Seccin 12.3.1, Funciones de comparacin de cadenas de caracteres. Hay que advertir que si se emplean '\%' o '\_' en otra situacin, devolvern las cadenas '\%' y '\_' y no '%' y '_'. En toda otra secuencia de escape, la barra invertida se ignora. Esto es, el carcter al que se aplica se interpreta como si no tuviera delante un carcter de escape. Hay varias formas de incluir comillas dentro de una cadena: Un ''' dentro de una cadena que est delimitada por ''' debe escribirse como ''''. Un '"' dentro de una cadena que est delimitada por '"' debe escribirse como '""'. Se puede preceder el carcter de comillas con un carcter de escape. ('\'). Un ''' dentro de una cadena delimitada con '"' no necesita ningn tratamiento especial, ni colocarla en forma doble ni precederla con un carcter de escape. Lo mismo se cumple para una '"' colocada en una cadena delimitada con '''. Las siguientes sentencias SELECT demuestran cmo actan las comillas y los caracteres de escape:
mysql> SELECT 'hola', '"hola"', '""hola""', 'hol''a', '\'hola'; +------+--------+----------+-------+-------+ | hola | "hola" | ""hola"" | hol'a | 'hola | +------+--------+----------+-------+-------+ mysql> SELECT "hola", "'hola'", "''hola''", "hol""a", "\"hola"; +------+--------+----------+-------+-------+ | hola | 'hola' | ''hola'' | hol"a | "hola |
488
Nmeros
+------+--------+----------+-------+-------+ mysql> SELECT 'Estas\nSon\nCuatro\nLneas'; +--------------------+ | Estas Son Cuatro Lneas | +--------------------+ mysql> SELECT 'barra\ desaparece'; +------------------+ | barra desaparece | +------------------+
Si se pretende insertar datos binarios en una columna de tipo cadena (por ejemplo un BLOB), los siguientes caracteres debern representarse con secuencias de escape: NUL \ ' " Byte NUL (ASCII 0). Este carcter se representar con '\0' (una barra invertida seguida de un carcter ASCII '0'). Barra invertida (ASCII 92). Este carcter se representar con '\\'. Comilla simple (ASCII 39). Este carcter se representar con '\''. Comilla doble (ASCII 34). Este carcter se representar con '\"'.
Al escribir programas de aplicacin, cualquier cadena que pudiese contener cualquiera de estos caracteres especiales deber ser preparada antes de utilizarse como valor en una sentencia SQL que se enviar al servidor MySQL. Esto puede hacerse de dos maneras: Procesando la cadena con una funcin que reemplace los caracteres especiales con una secuencia de escape. Por ejemplo, en un programa C, se puede emplear la funcin de la API de C mysql_real_escape_string(). Consulte Seccin 24.2.3.48, mysql_real_escape_string(). La interfaz DBI de Perl proporciona un mtodo quote para convertir caracteres especiales a las secuencias de escape equivalentes. Consulte Seccin 24.4, La API Perl de MySQL. Como alternativa al reemplazo explcito de caracteres especiales, varias APIs de MySQL proporcionan la parametrizacin de consultas, lo que permite insertar marcadores especiales en una consulta y luego asociarles valores al momento de emitirla. En este caso, la API toma a su cargo el reemplazo de caracteres especiales en los valores.
9.1.2. Nmeros
Los enteros se representan como secuencias de dgitos. Los flotantes utilizan '.' como separador decimal. Cada tipo de nmero puede estar precedido con '-' para indicar un valor negativo. Ejemplos de enteros vlidos:
1221 0 -32
Un entero puede usarse en un contexto de punto flotante; se intepretar como el nmero de punto flotante equivalente.
489
Valores hexadecimales
En MySQL 5.0, el tipo predeterminado para un valor hexadecimal es una cadena. Si se desea estar seguro de que el valor se tratar como un nmero, puede emplearse CAST(... AS UNSIGNED):
mysql> SELECT 0x41, CAST(0x41 AS UNSIGNED); -> 'A', 65
La sintaxis 0x se basa en ODBC. Las cadenas hexadecimales son utilizadas a menudo por ODBC para proveer valores para columnas BLOB. La sintaxis x'hexstring' se basa en SQL standard. Se puede convertir una cadena o un nmero en una cadena en formato hexadecimal con la funcin HEX():
mysql> SELECT HEX('cat'); -> '636174' mysql> SELECT 0x636174; -> 'cat'
490
Para operaciones de exportacin o importacin de texto utilizando LOAD DATA INFILE o SELECT ... INTO OUTFILE, NULL se representa con la secuencia \N. Consulte Seccin 13.2.5, Sintaxis de LOAD DATA INFILE.
Cualquier carcter permitido en un nombre de directorio, excepto '/', '\', o '.' Cualquier carcter permitido en un nombre de fichero, excepto '/', '\', o '.' Todos los caracteres Todos los caracteres Todos los caracteres
Adicionalmente a las restricciones detalladas en la tabla, ningn identificador puede contener un carcter ASCII 0 o un byte con un valor de 255. Los nombres de bases de datos, tablas y columnas no deberan terminar con caracteres de espacio. MySQL 5.0 permite el uso de comillas en identificadores, aunque es mejor evitarlos tanto como sea posible. En MySQL 5.0, los identificadores se almacenan empleando Unicode (UTF8). Esto se aplica a identificadores en las definiciones de tabla que se almacenan en ficheros .frm y a identificadores almacenados en las tablas de permisos en la base de datos mysql. El tamao de las columnas de tipo cadena en las tablas de permisos (y en cualquier otra tabla) de MySQL 5.0 equivale al nmero de caracteres, esto significa que (al contrario que en algunas versiones anteriores de MySQL) se pueden utilizar caracteres multibyte sin reducir el nmero de caracteres permitidos para los valores almacenados en estas columnas. Un identificador puede estar encerrado entre comillas o no. Si un identificador es una palabra reservada o contiene caracteres especiales, se debe encerrar entre comillas cada vez que se haga referencia a l. Para una lista de palabras reservadas, consulte Seccin 9.6, Tratamiento de palabras reservadas en MySQL. Los caracteres especiales son aquellos que estn fuera del grupo de caracteres alfanumricos del conjunto de caracteres en uso, de '_', y de '$'. El carcter de encomillado de identificador es el acento grave: ('`'):
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
Si el modo de servidor SQL incluye la opcin ANSI_QUOTES, tambin est permitido delimitar los identificadores con comillas dobles:
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)
Consulte Seccin 5.3.2, El modo SQL del servidor. En MySQL 5.0, los caracteres delimitadores de identificador pueden inclurse dentro del identificador si se delimita el identificador. Si el carcter que se incluir dentro del identificador es el mismo que se
491
utiliza para delimitarlo, habr que colocarlo en forma doble. Las siguientes sentencias crean una tabla llamada a`b que contiene una columna llamada c"d:
mysql> CREATE TABLE `a``b` (`c"d` INT);
Se recomienda que no se utilicen nombres con el esquema XeX, tal como 1e o 2e2, porque una expresin como 1e+1 es ambigua. Podra interpretarse como la expresin 1e + 1 o como el nmero 1e+1, dependiendo del contexto. Hay que ser cuidadoso al utilizar MD5 para producir nombres de tablas, porque puede producir nombres ilegales como los listados anteriormente.
db_name.tbl_name.col_name La columna col_name en la tabla tbl_name en la base de datos db_name. Si cualquier componente de un nombre mltiple requiere delimitarlo, hay que hacerlo individualmente en lugar de delimitar el nombre como un todo. Por ejemplo, `mi-tabla`.`mi-columna` es legal, pero `mi-tabla.mi-columna` no lo es. No es necesario especificar un prefijo de nombre_tabla o nombre_bd.nombre_tabla para referenciar una columna en una sentencia a menos que la referencia sea ambigua. Supngase el caso de las tablas t1 y t2 cada una conteniendo una columna c, donde se recupera c en una sentencia SELECT que emplea ambas tablas t1 y t2. En este caso, c es ambiguo porque no es nico entre las tablas utilizadas en la sentencia. Se lo debe calificar con un nombre de tabla como t1.c o t2.c para indicar a cul tabla se refiere la consulta. Del mismo modo, para recuperar desde una tabla t en la base de datos db1 y desde la tabla t en la base de datos db2 en la misma sentencia, hay que referirse a las columnas en aquellas tablas como db1.t.col_name y db2.t.col_name. Una palabra a continuacin de un punto en un nombre calificado debe ser un identificador, por lo que no es necesario delimitarlo, aun si es una palabra reservada. La sintaxis .tbl_name hace referencia a la tabla tbl_name en la base de datos actual. Esta sintaxis se acepta por compatibilidad con ODBC, ya que algunos programas ODBC anteceden los nombres de tabla con un carcter '.'.
492
predeterminada un sistema de ficheros (HFS+) que no es sensible a maysculas. No obstante, Mac OS X tambin soporta volmenes UFS, los cuales son sensibles a maysculas tal como cualquier Unix. Consulte Seccin 1.7.4, Extensiones MySQL al estndar SQL. Nota: Si bien los nombres de bases de datos y tablas no son sensibles a maysculas en algunas plataformas, no habra que referirse a una tabla o base de datos con diferentes combinaciones de maysculas y minsculas dentro de la misma consulta. La siguiente consulta podra fallar porque se refiere a una tabla como my_table y MY_TABLE:
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
Los nombres de columnas, ndices, procedimientos almacenados y triggers no son sensibles a maysculas en ninguna plataforma, ni tampoco lo son los alias de columnas. En forma predeterminada, los alias de tabla en MySQL 5.0 son sensibles a maysculas en Unix, pero no en Windows o Mac OS X. La siguiente consulta no funcionara en Unix, porque se refiere al alias en ambas formas a y A:
mysql> SELECT nombre_col FROM nombre_tabla AS a -> WHERE a.nombre_col = 1 OR A.nombre_col = 2;
Sin embargo, la misma consulta est permitida en Windows. Para evitar estar pendiente de tales diferencias, lo mejor es adoptar una convencin consistente, como crear y referirse a bases de datos y tablas usando siempre minsculas. Esto es lo recomendado para lograr mxima portabilidad y facilidad de uso. La forma en que los nombres de tablas y bases de datos se almacenan en el disco y se usan en MySQL se define mediante la variable de sistema lower_case_table_names, a la cual se le puede establecer un valor al iniciar mysqld. lower_case_table_names puede tomar uno de los siguientes valores: Valor 0 Significado Los nombres de tablas y bases de datos se almacenan en disco usando el esquema de maysculas y minsculas especificado en las sentencias CREATE TABLE o CREATE DATABASE. Las comparaciones de nombres son sensibles a maysculas. Esto es lo predeterminado en sistemas Unix. Ntese que si se fuerza un valor 0 con --lower-casetable-names=0 en un sistema de ficheros insensible a maysculas y se accede a tablas MyISAM empleando distintos esquemas de maysculas y minsculas para el nombre, esto puede conducir a la corrupcin de los ndices. Los nombres de tablas se almacenan en minsculas en el disco y las comparaciones de nombre no son sensibles a maysculas. MySQL convierte todos los nombres de tablas a minsculas para almacenamiento y bsquedas. En MySQL 5.0, este comportamiento tambin se aplica a nombres de bases de datos y alias de tablas. Este valor es el predeterminado en Windows y Mac OS X. Los nombres de tablas y bases de datos se almacenan en disco usando el esquema de maysculas y minsculas especificado en las sentencias CREATE TABLE o CREATE DATABASE, pero MySQL las convierte a minsculas en bsquedas. Las comparaciones de nombres no son sensibles a maysculas. Nota: Esto funciona solamente en sistemas de ficheros que no son sensibles a maysculas. Los nombres de las tablas InnoDB se almacenan en minsculas, como cuando lower_case_table_names vale 1.
En MySQL 5.0 para Windows y Mac OS X, el valor predeterminado de lower_case_table_names es 1. Si se utiliza MySQL en una sola plataforma, normalmente no habr que cambiar la variable lower_case_table_names. Sin embargo, se pueden encontrar dificultades si se desea transferir tablas entre plataformas cuyos sistemas de ficheros tengan diferente sensibilidad a maysculas. Por ejemplo, en Unix, se pueden tener dos tablas diferentes llamadas mi_tabla y MI_TABLA, pero en
493
Variables de usuario
Windows, estos dos nombres se consideran idnticos. Para evitar problemas de transferencia de datos originados en la combinacin de maysculas y minsculas de los nombres de bases de datos y tablas, se tienen dos opciones: Emplear lower_case_table_names=1 en todos los sistemas. La principal desventaja de esto es que al emplear SHOW TABLES o SHOW DATABASES no se vern los nombres en su combinacin original de minsculas y maysculas. Emplear lower_case_table_names=0 en Unix y lower_case_table_names=2 en Windows. Esto preserva la combinacin de maysculas y minsculas en los nombres de bases de datos y tablas. La desventaja es que hay que tener la precaucin de que las consultas siempre se refieran a las bases de datos y tablas en Windows respetando la combinacin correcta de maysculas y minsculas. Si se transfirieran las consultas a Unix, donde las maysculas y minsculas son significativas, no funcionarn si no se utiliza la combinacin correcta. Excepcin: Si se utilizan tablas InnoDB, se debera establecer lower_case_table_names en 1 en todas las plataformas para forzar a que los nombres sean convertidos a minsculas. Notar que antes de establecer lower_case_table_names en 1 en Unix, se debern convertir a minsculas los nombres de bases de datos y tablas existentes antes de reiniciar mysqld.
Con SET, tanto = como := pueden usarse como operadores de asignacin. La expr asignada a cada variable puede evaluarse a un valor entero, real, cadena, o NULL. Una variable de usuario tambin puede recibir valores en otras sentencias que no sean SET. En este caso, el operador de asignacin debe ser := y no = porque = se considera operador de comparacin en otras sentencias que no sean SET:
mysql> SET @t1=0, @t2=0, @t3=0; mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; +----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+
Las variables de usuario pueden emplearse en cualquier parte donde se permitan expresiones. Generalmente esto no incluye situaciones donde explcitamente se requiere un valor literal, como en la clusula LIMIT de una sentencia SELECT, o la clusula IGNORE nmero LINES de una sentencia LOAD DATA. Si se hace referencia a una variable an sin inicializar, su valor ser NULL.
494
Variables de sistema
En MySQL 5.0, si a una variable se le asigna un valor de cadena, el conjunto de caracteres y la forma de comparacin (collation) de la variable sern forzados para ser iguales a los de la cadena. Este comportamiento es implcito desde MySQL 5.0.3 y lo mismo sucede con las columnas de una tabla. Nota: en una sentencia SELECT, cada expresin se evala solamente cuando se enva al cliente. Esto significa que en una clusula HAVING, GROUP BY, u ORDER BY, no es posible hacer referencia a una expresin que comprenda variables que reciben su valor en la lista del SELECT. Por ejemplo, la siguiente sentencia no funcionar como se espera:
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tbl_name HAVING b=5;
La referencia a b en la clusula HAVING hace referencia al alias de una expresin de la lista SELECT que hace uso de la variable @aa. Esto no funciona como se esperara: @aa no contiene el valor de la fila actual, sino el valor del id de la fila anteriormente seleccionada. La regla general es que nunca se asigne un valor a una variable de usuario en una parte de una sentencia y se use la misma variable en otra parte de la misma sentencia. Se podran obtener los resultados esperados, pero esto no est garantizado. Otro problema asociado a asignar el valor de una variable y emplearla en la misma sentencia es que el tipo de dato resultante estar basado en el tipo que tena la variable al comienzo de la sentencia. El siguiente ejemplo ilustra esto:
mysql> SET @a='test'; mysql> SELECT @a,(@a:=20) FROM tbl_name;
En esta sentencia SELECT, MySQL informa al cliente que la primer columna es una cadena, y convierte todos los accesos a @a en cadenas, an cuando @a recibe un valor numrico en la segunda lnea. Luego de que la sentencia SELECT se ejecuta, @a se considera un nmero para la siguiente sentencia. Para evitar problemas con este comportamiento, no se debe inicializar y utilizar la misma variable en la misma sentencia, o, de lo contrario, hay que establecer su valor en 0, 0.0, o '' para definir su tipo antes de utilizarla. Una variable sin asignacin tiene el valor NULL con un tipo cadena.
495
Un cambio en una variable global es visible para cualquier cliente que acceda esa variable. Sin embargo, afectar solamente a las correspondientes variables de sesin de las conexiones que se realicen luego del cambio. No afectar las variables de sesin de los clientes actualmente conectados (ni siquiera las del cliente que emiti la sentencia SET GLOBAL). Los valores de las variables globales y de sesin pueden establecerse y recuperarse usando varias sintaxis diferentes. Los siguientes ejemplos estn basados en la variable sort_buffer_size. Para establecer el valor de una variable GLOBAL, debe emplearse una de las siguientes sintaxis:
mysql> SET GLOBAL sort_buffer_size=valor; mysql> SET @@global.sort_buffer_size=valor;
Para establecer el valor de una variable SESSION, debe emplearse una de las siguientes sintaxis:
mysql> SET SESSION sort_buffer_size=valor; mysql> SET @@session.sort_buffer_size=valor; mysql> SET sort_buffer_size=valor;
LOCAL es un sinnimo de SESSION. Si al establecer el valor de una variable no se utiliza GLOBAL, SESSION, o LOCAL, por defecto se asume SESSION. Consulte Seccin 13.5.3, Sintaxis de SET. Para recuperar el valor de una variable GLOBAL debe utilizarse una de las siguientes sentencias:
mysql> SELECT @@global.sort_buffer_size; mysql> SHOW GLOBAL VARIABLES like 'sort_buffer_size';
Para recuperar el valor de una variable SESSION debe utilizarse una de las siguientes sentencias:
mysql> SELECT @@sort_buffer_size; mysql> SELECT @@session.sort_buffer_size; mysql> SHOW SESSION VARIABLES like 'sort_buffer_size';
Aqu, tambin, LOCAL es un sinnimo de SESSION. Cuando se recupera una variable con SELECT @@nombre_var (o sea, no se especifica global., session., o local.), MySQL devuelve el valor de SESSION si existe y el valor GLOBAL en otro caso. En el caso de SHOW VARIABLES, si no se especifica GLOBAL, SESSION, o LOCAL, MySQL devuelve los valores de SESSION. La razn por la que la palabra clave GLOBAL se requiere para establecer el valor de variables que solamente existen como GLOBAL pero no para recuperar dicho valor, es para prevenir futuros problemas. Si se elimina una variable SESSION con el mismo nombre que una variable GLOBAL, un cliente con el privilegio SUPER podra cambiar accidentalmente la variable GLOBAL en lugar de hacerlo solamente sobre la variable SESSION de su propia conexin. Si se agrega una variable SESSION con el mismo nombre que una GLOBAL, un cliente que intentase modificar la variable GLOBAL podra encontrarse con que slo se ha modificado su propia variable SESSION. Puede encontrarse mayor informacin acerca de las opciones de inicio del sistema y de las variables de sistema en Seccin 5.3.1, Opciones del comando mysqld y Seccin 5.3.3, Variables de sistema del servidor. Una lista de las variables que pueden establecerse en tiempo de ejecucin se brinda en Seccin 5.3.3.1, Variables de sistema dinmicas.
496
Su valor es una estructura con componentes que especifican parmetros de servidor que se consideran estrechamente relacionados. Pueden existir varias instancias de un determinado tipo de variable estructurada. Cada una tiene un nombre diferente y se refiere a un recurso mantenido por el servidor. Actualmente, MySQL soporta un solo tipo de variable estructurada. ste especifica parmetros que regulan el funcionamiento de los cachs de claves (key caches). Una variable estructurada de cach de claves tiene estos componentes: key_buffer_size key_cache_block_size key_cache_division_limit key_cache_age_threshold Esta seccin describe la sintaxis para referirse a variables estructuradas. Para los ejemplos de sintaxis se emplean variables de cach de claves, pero los detalles especficos sobre cmo funcionan los cachs de claves se encuentran en Seccin 7.4.6, La cach de claves de MyISAM. Para referirse a un componente de una instancia de una variable estructurada, se emplea un nombre compuesto con el formato nombre_instancia.nombre_componente. Ejemplos:
hot_cache.key_buffer_size hot_cache.key_cache_block_size cold_cache.key_cache_block_size
Siempre hay predefinida una instancia con el nombre default para cada variable de sistema estructurada. Si se hace referencia a un componente de una variable estructurada sin mencionar el nombre de instancia, se utiliza default. Por lo tanto, default.key_buffer_size y key_buffer_size se refieren a la misma variable de sistema. Las reglas para la denominacin de instancias y componentes pertenecientes a variables estructuradas son las siguientes: Para un determinado tipo de variable estructurada, cada instancia debe tener un nombre que sea nico dentro de ese tipo de variable. Sin embargo, los nombres de instancia no necesitan ser nicos a travs de distintos tipos de variable estructurada. Por ejemplo, cada variable estructurada tiene una instancia llamada default, as que default no es nico a travs de distintos tipos de variable. Los nombres de los componentes de cada tipo de variable estructurada deben ser nicos a travs de todos los nombres de variables de sistema. Si esto no fuese as (o sea, si dos tipos diferentes de variable estructurada compartiesen nombres de miembros), no sera posible determinar la variable estructurada por defecto a emplear cuando un nombre de miembro no estuviese precedido por un nombre de instancia. Si un nombre de instancia de variable estructurada no fuese legal al usarlo como identificador sin delimitar, habr que referirse a l delimitndolo con acentos graves (ASCII 96). Por ejemplo, hotcache no es un nombre legal, pero `hot-cache` lo es. global, session, y local no son nombres legales de instancia. Esto evita conflictos con notaciones del tipo @@global.nombre_var, que se utilizan para hacer referencias a variables de sistema no estructuradas. Actualmente, las primeras dos reglas no tienen posibilidad de ser infringidas, porque el nico tipo de variable estructurada es el empleado para cachs de claves. Estas reglas cobrarn mayor significado si en el futuro se crean otros tipos de variable estructurada. Con una excepcin, se puede hacer referencia a los componentes de una variable estructurada utilizando nombres compuestos en cualquier contexto en que puedan aparecer nombres simples de
497
Sintaxis de comentarios
variable. Por ejemplo, se puede asignar un valor a una variable estructurada empleando una opcin de lnea de comandos:
shell> mysqld --hot_cache.key_buffer_size=64K
Si se inicia el servidor con esta opcin, crea un cach de claves llamado hot_cache con un tamao de 64KB adicionalmente al cach por defecto, que tiene un tamao predeterminado de 8MB. Suponiendo que se inicie el servidor de esta manera:
shell> mysqld --key_buffer_size=256K \ --extra_cache.key_buffer_size=128K \ --extra_cache.key_cache_block_size=2048
En este caso, el servidor establece el tamao del cach de claves pedeterminado a 256KB. (Tambin se podra haber escrito --default.key_buffer_size=256K.) Adicionalmente, el servidor crea un segundo cach llamado extra_cache con un tamao de 128KB, y fija un tamao de 2048 bytes para los buffers de bloque destinados al cach de bloques de ndice de tablas. El siguiente ejemplo inicia el servidor con tres diferentes cachs de claves, manteniendo sus tamaos en una proporcin de 3:1:1:
shell> mysqld --key_buffer_size=6M \ --hot_cache.key_buffer_size=2M \ --cold_cache.key_buffer_size=2M
Los valores de las variables estructuradas tambin pueden establecerse y leerse en tiempo de ejecucin. Por ejemplo, para establecer a 10MB el tamao de un cach de claves llamado hot_cache, pueden emplearse cualquiera de estas sentencias:
mysql> SET GLOBAL hot_cache.key_buffer_size = 10*1024*1024; mysql> SET @@global.hot_cache.key_buffer_size = 10*1024*1024;
Sin embargo, las siguientes sentencias no funcionarn. La variable no es interpretada como un nombre compuesto, sino como una cadena proporcionada a LIKE para buscar coincidencias con un patrn.
mysql> SHOW GLOBAL VARIABLES LIKE 'hot_cache.key_buffer_size';
Esta es la excepcin mencionada sobre la posibilidad de utilizar en cualquier sitio un nombre de variable estructurada del mismo modo que se hace con una variable simple.
498
Desde una secuencia '/*' hasta la prxima secuencia '*/'. La secuencia de cierre no necesita estar en la misma lnea, lo que permite tener comentarios que abarquen mltiples lineas. El siguiente ejemplo muestra los tres estilos de comentario:
mysql> SELECT mysql> SELECT mysql> SELECT mysql> SELECT /* Este es un comentario en */ 1; 1+1; # Este comentario llega hasta el final de la lnea 1+1; -- Este comentario llega hasta el final de la lnea 1 /* este es un comentario en lnea (in-line) */ + 1; 1+
mltiples lneas
La sintaxis de comentarios descrita se aplica a la forma en que el servidor mysqld procesa las sentencias SQL. El programa cliente mysql tambin realiza algn tipo de proceso de sentencias antes de enviarlas al servidor. (Por ejemplo, para determinar donde acaba cada sentencia en una lnea que contiene varias de ellas). En MySQL 5.0, la nica limitacin en la forma en que mysql procesa los comentarios /* ... */ es que un signo admirativo o exclamativo utilizado con este estilo de comentario marca porciones de sentencias SQL de ejecucin condicional. Esto se aplica cuando se ejecuta mysql interactivamente y cuando se colocan comandos en un fichero y se emplea mysql para procesar el fichero con mysql < nom_fich. Para ms informacin y ejemplos, consulte Seccin 1.7.4, Extensiones MySQL al estndar SQL.
Pero al omitirse el espacio luego de abs, se produce un error de sintaxis porque la sentencia pasa a invocar la funcin ABS():
mysql> CREATE TABLE abs(val INT);
Si el modo de servidor SQL incluye el valor IGNORE_SPACE, el servidor permite que las invocaciones a funciones tengan espacios en blanco entre el nombre de la funcin y el carcter '(' que le sigue. Esto convierte a los nombres de funciones en palabras reservadas. Como resultado, los identificadores que tienen similar nombre a una funcin deben ser delimitados por comillas como se describe en Seccin 9.2, Nombres de bases de datos, tablas, ndices, columnas y alias. Para controlar el modo de servidor SQL consulte Seccin 5.3.2, El modo SQL del servidor. Una palabra a continuacin de un punto en un nombre calificado (por ejemplo nom_bd.nom_tabla) debe ser un identificador, por lo que no es necesario delimitarlo, incluso si es una palabra reservada. Las palabras en la siguiente tabla estn explcitamente reservadas en MySQL. La mayora de ellas estn prohibidas por el estndar SQL para ser empleadas como nombres de columnas y/o tablas (por ejemplo, GROUP). Unas pocas son reservadas porque MySQL las necesita y (actualmente) utiliza un
499
intrprete (parser) yacc. Una palabra reservada puede emplearse como identificador si se la delimita con comillas. 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 LONGTEXT 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 LOOP 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 LOW_PRIORITY
500
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
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
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
Siguen las nuevas palabras reservadas de MySQL 5.0: ASENSITIVE CONTINUE DETERMINISTIC EXIT INSENSITIVE LOOP READS CALL CURSOR EACH FETCH ITERATE MODIFIES RELEASE CONDITION DECLARE ELSEIF INOUT LEAVE OUT REPEAT
501
MySQL permite que algunas palabras clave sean utilizadas como identificadores sin delimitar porque mucha gente las ha usado previamente. Por ejemplo: ACTION BIT DATE ENUM NO TEXT TIME TIMESTAMP
502
Este captulo trata los siguientes temas: Qu son los conjuntos de caracteres y colaciones. El sistema por defecto de mltiples niveles Sintaxis para especificar el conjunto de caracteres y colaciones. Funciones y operaciones relacionadas. Soporte Unicode El significado de cada conjunto de caracteres individual y de cada colacin Los motores de almacenamiento MyISAM, MEMORY, e InnoDB soportan el conjunto de caracteres.
503
504
| latin2 | swe7 | ascii | ujis | sjis | hebrew | tis620 | euckr | koi8u | gb2312 | greek | cp1250 | gbk | latin5 ...
| | | | | | | | | | | | | |
ISO 8859-2 Central European 7bit Swedish US ASCII EUC-JP Japanese Shift-JIS Japanese ISO 8859-8 Hebrew TIS620 Thai EUC-KR Korean KOI8-U Ukrainian GB2312 Simplified Chinese ISO 8859-7 Greek Windows Central European GBK Simplified Chinese ISO 8859-9 Turkish
| | | | | | | | | | | | | |
latin2_general_ci swe7_swedish_ci ascii_general_ci ujis_japanese_ci sjis_japanese_ci hebrew_general_ci tis620_thai_ci euckr_korean_ci koi8u_general_ci gb2312_chinese_ci greek_general_ci cp1250_general_ci gbk_chinese_ci latin5_turkish_ci
| | | | | | | | | | | | | |
1 1 1 3 2 1 1 2 1 2 1 1 2 1
| | | | | | | | | | | | | |
(Para un listado completo, consulte Seccin 10.10, Conjuntos de caracteres y colaciones que soporta MySQL.) Cualquier conjunto de caracteres tiene siempre como mnimo una colacin, aunque puede tener varias. Para listar las colaciones para un conjunto de caracteres, use el comando SHOW COLLATION . Por ejemplo, para ver las colaciones para el conjunto de caracteres latin1 (ISO-8859-1 Europa Occidental), use el siguiente comando, que muestra el nombre de las colaciones que empiezan con 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 | +---------------------+---------+----+---------+----------+---------+
Las colaciones para latin1 tienen los siguientes significados: Colacin latin1_german1_ci latin1_swedish_ci latin1_danish_ci latin1_german2_ci latin1_bin latin1_general_ci latin1_general_cs latin1_spanish_ci Significado Alemn DIN-1 Sueco/Finlands Dans/Noruego Alemn DIN-2 Binario segn codificacin latin1 Multilinge (Europa Occidental) Multilinge (ISO Europa Occidental), sensible a maysculas Espaol moderno
Las colaciones tienen las siguientes caractersticas generales: Dos conjuntos de caracteres distintos no pueden tener la misma colacin. Cada conjunto de caracteres tiene una colacin que es la colacin por defecto. Por ejemplo, la colacin por defecto para latin1 es latin1_swedish_ci. Hay una convencin para nombres de colaciones: empiezan con el nombre del conjunto de caracteres al que estn asociados, normalmente incluyen el nombre del idioma, y acaban con _ci
505
(no distingue entre maysculas y minsculas), _cs (distingue entre maysculas y minsculas), o _bin (binario).
Una forma de cambiar la especificacin es recompilando. Para cambiar el conjunto de caracteres por defecto y la colacin al compilar las fuentes, debe utilizarse: --with-charset y --withcollation como argumentos para configure. Por ejemplo:
shell> ./configure --with-charset=latin1
O:
shell> ./configure --with-charset=latin1 \ --with-collation=latin1_german1_ci
Tanto mysqld como configure verifican que la combinacin del conjunto de caracteres y la colacin es vlida. Si no lo es, cada programa muestra un mensaje de error y acaba. El conjunto de caracteres y la colacin actuales estn disponibles como los valores de las variables character_set_server y collation_server . Estas variables pueden cambiarse en tiempo de ejecucin.
506
ALTER DATABASE nombre_de_base_de_datos [[DEFAULT] CHARACTER SET nombre_de_conjunto_de_caracteres] [[DEFAULT] COLLATE nombre_de_colacin]
Ejemplo:
CREATE DATABASE nombre_de_base_de_datos DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
MySQL elige el conjunto de caracteres y colacin de la base de datos as: Si tanto CHARACTER SET X como COLLATE Y se especifican, entonces el conjunto de caracteres es X y la colacin Y. Si CHARACTER SET X se especifica sin COLLATE, entonces el conjunto de caracteres es X y la colacin es la de defecto. En el resto de casos, es el conjunto de caracteres y la colacin del servidor. La sintaxis de MySQL CREATE DATABASE ... DEFAULT CHARACTER SET ... es anloga a la sintaxis estndar SQL CREATE SCHEMA ... CHARACTER SET .... Por ello, es posible crear bases de datos con distintos conjuntos de caracteres y colaciones en el mismo servidor MySQL. El conjunto de caracteres de la base de datos y la colacin se usan como valores por defecto para una tabla si no se especifica el conjunto de caracteres y colacin en el comando CREATE TABLE. No tienen otro propsito. El conjunto de caracteres y colacin para la base de datos por defecto estn disponibles como los valores de las variables character_set_database y collation_database . El servidor obtiene estas variables siempre que la base de datos por defecto cambia. Si no hay base de datos por defecto, las variables tienen el mismo valor que las variables correspondiente del lado del servidor, character_set_server y collation_server.
Ejemplo:
CREATE TABLE t1 ( ... ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
MySQL elije el conjunto de caracteres y colacin de la siguiente forma: Si se especifican CHARACTER SET X y COLLATE Y , entonces el conjunto de caracteres es X y la colacin Y. Si se especifica CHARACTER SET X sin COLLATE, el conjunto de caracteres es X y la colacin es la de defecto. En cualquier otro caso, el conjunto de caracteres y colacin son las del servidor. El conjunto de caracteres y colacin de la tabla se usan como valores por defecto si el conjunto de caracteres y la colacin no se especifican en la definicin de las columnas. El conjunto de caracteres de la tabla y la colacin son extensiones MySQL; no hay mucho al respecto en el estndar SQL.
507
Ejemplo:
CREATE TABLE Table1 ( column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci );
MySQL elige el conjunto de caracteres y la colacin de la columna de la siguiente forma: Si se especifican CHARACTER SET X y COLLATE Y , entonces el conjunto de caracteres es X y la colacin Y. Si se especifica CHARACTER SET X sin COLLATE, el conjunto de caracteres es X y la colacin es la de defecto. En cualquier otro caso, se usan el conjunto de caracteres y la colacin de la tabla. Las clusulas CHARACTER SET y COLLATE son de SQL estndar.
Aqu tenemos una columna con un conjunto de caracteres latin1 y una colacin latin1_german1_ci . La definicin es explcita, as que es sencillo. Debe tenerse en cuenta que no hay problema al almacenar una columna latin1 en una tabla latin2. Ejemplo 2: Definicin de tabla y columna
CREATE TABLE t1 ( c1 CHAR(10) CHARACTER SET latin1 ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
Ahora tenemos una columna con un conjunto de caracteres latin1 y la colacin por defecto. Aunque puede parecer normal, la colacin por defecto no es la del nivel de tabla. En lugar de ello, ya que la colacin para latin1 siempre es latin1_swedish_ci, la columna c1 tiene una colacin de latin1_swedish_ci (no latin1_danish_ci). Ejemplo 3: Definicin de tabla y columna
CREATE TABLE t1 ( c1 CHAR(10) ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
Tenemos una columna con un conjunto de caracteres y colacin por defecto. Bajo esta circunstancia, MySQL busca a nivel de tabla para determinar el conjunto de caracteres y colacin para la columna. As, el conjunto de caracteres para la columna c1 es latin1 y su colacin es latin1_danish_ci.
508
Creamos una columna sin especificar su conjunto de caracteres y colacin. Tampoco especificamos un conjunto de caracteres y colacin a nivel de tabla. En este caso, MySQL busca a nivel de base de datos para inspirarse. (La configuracin de la base de datos pasa a ser la configuracin de la tabla, y posteriormente la configuracin de columna). As, el conjunto de caracteres para la columna c1 es latin2 y su colacin es latin2_czech_ci.
509
SET NAMES indica qu hay en el comando SQL que enva el cliente. Por lo tanto, SET NAMES 'cp1251' le dice al servidor los prximos mensajes entrantes de este cliente estn en el conjunto de caracteres cp1251. Tambin especifica el conjunto de caracteres para los resultados que el servidor devuelve al cliente. (Por ejemplo, indica los conjuntos de caracteres de la columna si usa el comando SELECT .) Un comando SET NAMES 'x' es equivalente a estos tres comandos:
mysql> SET character_set_client = x; mysql> SET character_set_results = x; mysql> SET character_set_connection = x;
Cambiar character_set_connection a x tambin cambia collation_connection de la colacin por defecto a x. SET CHARACTER SET es similar pero cambia el conjunto de caracteres y la colacin para la conexin para ser las de la base de datos por defecto. Un comando SET CHARACTER SET x es equivalente a estos tres comandos:
mysql> SET character_set_client = x; mysql> SET character_set_results = x; mysql> SET collation_connection = @@collation_database;
Cuando un cliente se conecta, enva al servidor el nombre del conjunto de caracteres que quiere usar. El servidor cambia las variables character_set_client, character_set_results, y character_set_connection para ese conjunto de caracteres. (De hecho, el servidor efecta una operacin SET NAMES usando el conjunto de caracteres). No es necesario ejecutar SET NAMES cada vez que se arranca el cliente mysql, aunque se quiera utilizar un conjunto de caracteres diferente del que hay por defecto. Puede aadirse la opcin -default-character-set en la lnea de comandos de mysql, o en el fichero de opciones. Por ejemplo, el siguiente fichero de opciones cambia las variables del conjunto de caracteres a koi8r cada vez que se ejecuta mysql:
[mysql] default-character-set=koi8r
Ejemplo: Supongamos que column1 se define como CHAR(5) CHARACTER SET latin2. Si no se especifica SET NAMES o SET CHARACTER SET, entonces para SELECT column1 FROM t, el servidor devuelve todos los valores para column1 usando el conjunto de caracteres que el cliente especific al conectar. Por otro lado, si se especifica SET NAMES 'latin1' o SET CHARACTER SET latin1, entonces justo antes de devolver los resultados, el servidor convierte el valor latin2 a latin1. La conversin puede perder informacin si hay caracteres que no estn en ambos conjuntos de caracteres. Si no se quiere que el servidor haga ninguna conversin, debe cambiarse character_set_results a NULL:
mysql> SET character_set_results = NULL;
Ejemplos:
510
Para el comando simple SELECT 'cadena_de_texto', la cadena de caracteres tiene el conjunto de caracteres y colacin definida por las variables de sistema character_set_connection y collation_connection. La expresin _nombre_de_conjunto_de_caracteres se llama formalmente introductor. Le dice al parser: la siguiente cadena de caracteres utiliza el conjunto de caracteres X. Esto ha sido fuente de confusin en el pasado. Enfaticemos pues que un introductor no causa ninguna conversin, sino que es estrictamente una seal que no cambia el valor de la cadena de caracteres. Un introductor tambin es legal antes de la notacin para literales hexadecimales y literales numricos hexadecimales (x'literal' y 0xnnnn), y antes de ? (parmetros de sustitucin al usar comandos preparados dentro de la interfcie de un lenguaje de programacin). Ejemplos:
SELECT _latin1 x'AABBCC'; SELECT _latin1 0xAABBCC; SELECT _latin1 ?;
MySQL determina el conjunto de caracteres y colacin para un literal as: Si se especifican _X y COLLATE Y , entonces el conjunto de caracteres es X y se usa la colacin Y. Si se especifica _X pero no se especifica COLLATE , entonces el conjunto de caracteres es X y el conjunto de caracteres es el de defecto. En cualquier otro caso, se utilizan el conjunto de caracteres y la colacin que hay en las variables de sistema character_set_connection y collation_connection . Ejemplos: Una cadena de caracteres con conjunto de caracteres latin1 y colacin latin1_german1_ci :
SELECT _latin1'Mller' COLLATE latin1_german1_ci;
Una cadena de caracteres con conjunto de caracteres latin1 y su colacin por defecto (esto es, latin1_swedish_ci):
SELECT _latin1'Mller';
Una cadena de caracteres con conjunto de caracteres y colacin por defecto de la conexin:
SELECT 'Mller';
Los introductores de conjunto de caracteres y la clusula COLLATE se implementan segn las especificaciones del estndar SQL.
Con AS:
SELECT k COLLATE latin1_german2_ci AS k1 FROM t1
511
ORDER BY k1;
Con DISTINCT:
SELECT DISTINCT k COLLATE latin1_german2_ci FROM t1;
Con WHERE:
SELECT * FROM t1 WHERE _latin1 'Mller' COLLATE latin1_german2_ci = k;
Con HAVING:
SELECT k FROM t1 GROUP BY k HAVING k = _latin1 'Mller' COLLATE latin1_german2_ci;
Sin embargo, cuando estn implicados varios operandos, puede haber ambigedad. Por ejemplo:
512
Esta consulta debe usar la colacin de la columna x, o de la columna de caracteres literal 'Y'? SQL estndar resuelve tales cuestiones usando lo que se sola llamar reglas coercitivas. Es decir: Como x e 'Y' tienen colaciones, cul tiene precedencia? Puede ser difcil de resolver, pero las siguientes reglas resuelven la mayora de situaciones: Una clusula COLLATE explcita tiene una coercibilidad de 0. (No es coercible en absoluto.) La concatenacin de dos cadenas de caracteres con diferentes colaciones tiene una coercibilidad de 1. La colacin de una columna tiene una coercibilidad de 2. Una constante de sistema (la cadena de caracteres retornada por funciones como USER() o VERSION()) tiene una coercibilidad de 3. Una colacin de un literal tiene una coercibilidad de 4. NULL o una expresin derivada de NULL tiene una coercibilidad de 5. Los valores de coercibilidad precedentes son los de MySQL 5.0.3. Consltese la nota posterior en esta seccin para ms informacin relacionada con versiones. Estas reglas resuelven ambigedades como: Uso de la colacin con el valor ms bajo de coercibilidad. Si ambos operadodres tienen la misma coercibilidad, entonces hay un error si las colaciones son distintas. Ejemplos: columna1 = 'A' columna1 = 'A' COLLATE x columna1 COLLATE x = 'A' COLLATE y Usa colacin de columna1 Usa colacin de 'A' Error
La funcin COERCIBILITY() puede usarse para determinar la coercibilidad de una expresin de cadena de caracteres:
mysql> SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci); -> 0 mysql> SELECT COERCIBILITY(VERSION()); -> 3 mysql> SELECT COERCIBILITY('A'); -> 4
Consulte Seccin 12.9.3, Funciones de informacin. En MySQL 5.0 antes de la versin 5.0.3, no hay constantes de sistema o coercibilidad ignorables. Funciones como USER() tienen una coercibilidad de 2 en lugar de 3, y los literales tienen una coercibilidad de 3 en lugar de 4.
513
Y supongamos que los valores de la columna se retornan usando los siguientes comandos:
SELECT X FROM T ORDER BY X COLLATE nombre_de_colacin;
El orden resultante de los valores para diferentes colaciones se muestra en esta tabla: latin1_swedish_ci Muffler MX Systems Mller MySQL latin1_german1_ci Muffler Mller MX Systems MySQL latin1_german2_ci Mller Muffler MX Systems MySQL
La tabla es un ejemplo que muestra el efecto de la utilizacin de diferentes colaciones en una clusula ORDER BY. El carcter que causa el orden de ordenacin diferente en este ejemplo es la U con dos puntos encima (), que los alemanes llaman "U-umlaut". La primera columna muestra el resultado de SELECT usando la regla de colacin Sueca/Finlandesa, que dice que U-umlaut se ordena con Y. La segunda columna muestra el resultado de SELECT usando la regla alemana DIN-1, que dice que U-umlaut se ordena con U. La tercera columna muestra el resultado de SELECT usando la regla alemana DIN-2, que dice que U-umlaut se ordena con UE.
514
CONVERT()
En cualquier otro caso, el resultado no tiene colacin. Por ejemplo, con CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END, la colacin resultante es X. Lo mismo se aplica para CASE, UNION, ||, CONCAT(), ELT(), GREATEST(), IF(), y LEAST(). Para operaciones que conviertan datos de tipo carcter, el conjunto de caracteres y colacin de las cadenas de caracteres resultantes de las operaciones se definen por las variables de sistema character_set_connection y collation_connection . Esto se aplica en CAST(), CHAR(), CONV(), FORMAT(), HEX(), y SPACE().
10.4.2. CONVERT()
CONVERT() proporciona un modo de convertir datos entre distintos conjuntos de caracteres. La sintaxis es:
CONVERT(expr USING transcoding_name)
En MySQL, "transcoding names" es lo mismo que los conjuntos de caracteres correspondientes. Ejemplos:
SELECT CONVERT(_latin1'Mller' USING utf8); INSERT INTO utf8table (utf8column) SELECT CONVERT(latin1field USING utf8) FROM latin1table;
CONVERT(... USING ...) se implementa segn la especificacin de SQL estndar. En modo SQL TRADITIONAL, si convierte una cadena de caracteres de fecha zero en una fecha, CONVERT() retorna NULL. MySQL 5.0.4 y versiones posteriores tambin muestran un mensaje de advertencia.
10.4.3. CAST()
Puede usar CAST() para convertir una cadena de caracteres a un conjunto de caracteres distinto. La sintaxis es:
CAST(cadena_de_caracteres AS tipo_de_datos CHARACTER SET nombre_de_conjunto_de_caracteres)
Ejemplo:
SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8);
Si usa CAST() sin especificar CHARACTER SET, el conjunto de caracteres y colacin resultantes se definen por las variables de sistema character_set_connection y collation_connection . Si usa CAST() con CHARACTER SET X, el conjunto de caracteres y colacin resultantes son X y la colacin por defecto de X. Puede no usar una clusula COLLATE dentro de CAST(), pero puede hacerlo fuera. Esto es, CAST(... COLLATE ...) es ilegal, pero CAST(...) COLLATE ... es legal. Ejemplo:
SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;
En modo SQL TRADITIONAL, si convierte una cadena de caracteres de fecha zero a una fecha, CAST() retorna NULL. MySQL 5.0.4 y versiones posteriores muestran un mensaje de advertencia.
515
Sentencias SHOW
El comando SHOW CHARACTER SET muestra todos los conjuntos de caracteres disponibles. Tiene una clusula opcional LIKE que indica con qu nombres de conjunto de caracteres comparar. Por ejemplo:
mysql> SHOW CHARACTER SET LIKE 'latin%'; +---------+-----------------------------+-------------------+--------+ | 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 | +---------+-----------------------------+-------------------+--------+
Consulte Seccin 13.5.4.1, Sintaxis de SHOW CHARACTER SET. La salida de SHOW COLLATION incluye todos los conjuntos de caracteres. Tiene una clusula opcional LIKE que indica con qu nombres de conjunto de caracteres comparar. Por ejemplo:
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 | +-------------------+---------+----+---------+----------+---------+
Consulte Seccin 13.5.4.2, Sintaxis de SHOW COLLATION. SHOW CREATE DATABASE muestra el comando CREATE DATABASE que crea una base de datos dada. El resultado incluye todas las opciones de la base de datos DEFAULT CHARACTER SET y COLLATE estn soportadas. Todas las opciones de las bases de datos se guardan en un fichero de datos llamado db.opt que se encuentra en el directorio de la base de datos.
mysql> SHOW CREATE DATABASE test; +----------+-----------------------------------------------------------------+ | Database | Create Database | +----------+-----------------------------------------------------------------+ | test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ | +----------+-----------------------------------------------------------------+
Consulte Seccin 13.5.4.4, Sintaxis de SHOW CREATE DATABASE. SHOW CREATE TABLE es similar, pero muestra el comando CREATE TABLE para crear una tabla dada. Las definiciones de columnas indican cualquier especificacin del conjunto de caracteres, y las opciones de tabla incluyen informacin del conjunto de caracteres. Consulte Seccin 13.5.4.5, Sintaxis de SHOW CREATE TABLE. El comando SHOW COLUMNS muestra la colacin de las columnas de una tabla cuando se invoca como SHOW FULL COLUMNS. Columnas con tipos de datos CHAR, VARCHAR, o TEXT tienen colaciones no-NULL . Tipos numricos y otros tipos no-carcter tiene colaciones NULL. Por ejemplo:
mysql> SHOW FULL COLUMNS FROM person\G *************************** 1. row *************************** Field: id Type: smallint(5) unsigned Collation: NULL Null: NO Key: PRI Default: NULL Extra: auto_increment Privileges: select,insert,update,references
516
Soporte Unicode
Comment: *************************** 2. row *************************** Field: name Type: char(60) Collation: latin1_swedish_ci Null: NO Key: Default: Extra: Privileges: select,insert,update,references Comment:
El conjunto de caracteres no es parte de lo que se muestra. (El nombre del conjunto de caracteres est implcito en el nombre de la colacin.) Consulte Seccin 13.5.4.3, Sintaxis de SHOW COLUMNS.
517
La representacin de los metadatos debe satisfacer estos requerimientos: Todos los metadatos deben ser del mismo conjunto de caracteres. De otro modo SHOW no funcionara correctamente ya que distintos registros en la misma columna tendran distintos conjuntos de caracteres. Los metadatos deben incluir todos los caracteres en todos los idiomas. De otro modo, los usuarios no seran capaces de nombrar tablas y columnas en su propio idioma. Para satisfacer ambos requerimientos, MySQL guarda los metadatos en un conjunto de caracteres Unicode, llamado UTF8. Esto no causa ningn problema si no se utilizan nunca caracteres acentuados o no-latinos. Si se utilizan, debe tenerse en cuenta que los metadatos estn en UTF8. Esto significa que las funciones USER(), CURRENT_USER(), DATABASE(), y VERSION() tienen el conjunto de caracteres UTF8 por defecto, al igual que sinnimos como SESSION_USER() y SYSTEM_USER(). El servidor activa la variable de sistema character_set_system con el nombre del conjunto de caracteres de los metadatos:
mysql> SHOW VARIABLES LIKE 'character_set_system'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | character_set_system | utf8 | +----------------------+-------+
El almacenamiento de metadatos usando Unicode no significa que las cabeceras de columnas y los resultados de la funcin DESCRIBE estn en el conjunto de caracteres character_set_system por defecto. Cuando introduce SELECT column1 FROM t, el nombre column1 mismo vuelve del servidor al cliente con el conjunto de caracteres determinado por el comando SET NAMES . Ms especficamente, el conjunto de caracteres usado se determina por el valor de la variable de sistema character_set_results . Si esta variable se pone a NULL, no se realiza ninguna conversin y el servidor devuelve metadatos usando su conjunto de caracteres original (el conjunto indicado por character_set_system). Para que el servidor pase los resultados de metadatos con un conjunto de caracteres no-UTF8, utilcese SET NAMES para forzar al servidor a hacer una conversin del conjunto de caracteres (consulte Seccin 10.3.6, Conjunto de caracteres y colacin de la conexin), o hacer que el cliente haga la conversin. Es ms eficiente que el cliente haga la conversin, pero esta opcin no est disponible para todos los clientes. Si utiliza (por ejemplo) la funcin USER() para comparacin o asignacin dentro de un comando, no se preocupe. MySQL realiza algunas conversiones automticas.
SELECT * FROM Table1 WHERE USER() = latin1_column;
Esta sentencia funciona porque los contenidos de latin1_column se convierten automticamente a UTF8 antes de la comparacin.
INSERT INTO Table1 (latin1_column) SELECT USER();
Esta sentencia funciona porque los contenidos de USER() se convierten automticamente a latin1 antes de la asignacin. La conversin automtica no est completamente implementada an, pero debera funcionar correctamente en versiones posteriores. Aunque la conversin automtica no est en el estndar SQL, el documento estndar SQL dice que cada conjunto de caracteres es (en trminos de caracteres soportados) un subconjunto de Unicode. Puesto que es un principio bien conocido que lo que se aplica a un superconjunto se puede aplicar a un subconjunto, creemos que una colacin para Unicode se puede aplicar para comparaciones con cadenas de caracteres no-Unicode.
518
Puede usar N'literal' para crear una cadena de caracteres en el conjunto de caracteres nacional. Estos dos comandos son equivalentes:
SELECT N'some text'; SELECT _utf8'some text';
519
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 | | armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 | | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | | ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 | | cp866 | DOS Russian | cp866_general_ci | 1 | | keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 | | macce | Mac Central European | macce_general_ci | 1 | | macroman | Mac West European | macroman_general_ci | 1 | | cp852 | DOS Central European | cp852_general_ci | 1 | | latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 | | cp1251 | Windows Cyrillic | cp1251_general_ci | 1 | | cp1256 | Windows Arabic | cp1256_general_ci | 1 | | cp1257 | Windows Baltic | cp1257_general_ci | 1 | | binary | Binary pseudo charset | binary | 1 | | geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 | | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 | +----------+-----------------------------+---------------------+--------+
520
| utf8_danish_ci | utf8 | 203 | | Yes | 8 | | utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 | | utf8_slovak_ci | utf8 | 205 | | Yes | 8 | | utf8_spanish2_ci | utf8 | 206 | | Yes | 8 | | utf8_roman_ci | utf8 | 207 | | Yes | 8 | | utf8_persian_ci | utf8 | 208 | | Yes | 8 | +--------------------+---------+-----+---------+----------+---------+
La colacin utf8_unicode_ci est implementada segn el Algoritmo de Colacin Unicode (UCA, Unicode Collation Algorithm ) descrito en http://www.unicode.org/reports/tr10/. La colacin usa la versin-4.0.0 UCA para el peso de las claves: http://www.unicode.org/Public/UCA/4.0.0/ allkeys-4.0.0.txt. (La siguiente exposicin se basa en utf8_unicode_ci, pero tambin es cierta para ucs2_unicode_ci.) Actualmente, la colacin utf8_unicode_ci tiene soporta slo parcialmente el Algoritmo de colacin Unicode. Algunos caracteres no estn todava soportados. Adems, la combinacion de marcas no est soportada completamente. Esto afecta al vietnamita y a algunos idiomas minoritarios en Rusia como el Udmurt, Tatar, Bashkir, y Mari. La caractarstica ms significativa en utf8_unicode_ci es que soporta expansiones, esto es, cuando un carcter resulta igual a una combinacin de otros caracteres. Por ejemplo, en alemn y otros idiomas '' es igual a 'ss'. utf8_general_ci es una colacin heredada que no soporta expansiones. Slo puede hacer comparaciones entre caracteres uno a uno. Esto significa que las comparaciones para colaciones utf8_general_ci son ms rpidas, pero ligeramente menos correctas, que las comparaciones en utf8_unicode_ci). Por ejemplo, las siguientes ecuaciones funcionan tanto en utf8_general_ci como en utf8_unicode_ci:
= A = O = U
Colaciones especficas de idiomas para el conjunto de caracteres utf8 estn implementadas slo si la ordenacin con utf8_unicode_ci no funciona bien para un idioma. Por ejemplo, utf8_unicode_ci funciona bien para alemn y francs, as que no es necesario crear colaciones utf8 especiales para estos dos idiomas. utf8_general_ci tambin es satisfactorio para alemn y francs, excepto que '' es igual a 's', y no a 'ss'. Si esto es aceptable para su aplicacin, debe usar utf8_general_ci porque es ms rpido. En caso contraro , use utf8_unicode_ci porque es ms preciso. utf8_swedish_ci, como otras colaciones utf8 especficas de un idioma, deriva de utf8_unicode_ci con reglas adicionales de idioma. Por ejemplo, en sueco, la siguiente comparacin es cierta, lo que no esperara un alemn o un francs:
= Y <
Las colaciones utf8_spanish_ci y utf8_spanish2_ci se corresponden con espaol moderno y espaol tradicional respectivamente. En ambas colaciones , '' es una letra independiente, entre 'n' y 'o'. Adems, para espaol tradicional 'ch' es una letra, ordenada entre 'c' y d, y 'll' es una letra que se coloca entre 'l' y 'm'
521
522
En la colacin latin1_spanish_ci, '' es una letra independiente, entre 'n' y 'o'. macroman (Mac Europa Occidental) colaciones: macroman_bin macroman_general_ci (por defecto) swe7 (7bit Sueca) colacin: swe7_bin swe7_swedish_ci (por defecto)
523
524
525
gb2312 (GB2312 chino simplificado) colaciones: gb2312_bin gb2312_chinese_ci (por defecto) gbk (GBK chino simplificado) colaciones: gbk_bin gbk_chinese_ci (por defecto) sjis (Shift-JIS japons) colaciones: sjis_bin sjis_japanese_ci (por defecto) tis620 (TIS620 Thai) colaciones: tis620_bin tis620_thai_ci (por defecto) ujis (EUC-JP japons) colaciones: ujis_bin ujis_japanese_ci (por defecto)
526
MySQL soporta un nmero de tipos de columnas divididos en varias categoras: tipos nmericos, tipos de fecha y hora, y tipos de cadenas de caracteres. Este captulo primero hace un repaso de estos tipos de columnas, y luego proporciona una descripcin detallada de las propiedades de los tipos de cada categora, y un resumen de sus requerimientos de almacenamiento. El repaso es intencionalmente breve. Las descripciones ms detalladas deben consultarse para obtener ms informacin acerca de los tipos de datos particulares, como los formatos permitidos para especificar los tipos. MySQL 5.0 soporta extensiones para tratar datos espaciales. Informacin al respecto se proporciona en Captulo 18, Extensiones espaciales de MySQL. Varias descripciones de los tipos de columnas usan estas convenciones: M Indica la mxima anchura al mostrar los datos. El mximo ancho de muestra es 255.
D Se aplica a tipos de coma flotante y de coma fija e indica el nmero de dgitos a continuacin del punto decimal. El valor mximo posible es 30, pero no debe ser mayor que M-2. Los corchetes ('[' y ']') indican partes de especificadores de tipos que son opcionales.
527
TINYINT[(M)] [UNSIGNED] [ZEROFILL] Un entero muy pequeo. El rango con signo es de -128 a 127. El rango sin signo es de 0 a 255.
BOOL, BOOLEAN Son sinnimos para TINYINT(1). Un valor de cero se considera falso. Valores distintos a cero se consideran ciertos. En el futuro, se introducir tratamiento completo de tipos booleanos segn el estndar SQL.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL] Un entero pequeo. El rango con signo es de -32768 a 32767. El rango sin signo es de 0 a 65535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] Entero de tamao medio. El rango con signo es de -8388608 a 8388607. El rango sin singo es de 0 a 16777215.
528
INT[(M)] [UNSIGNED] [ZEROFILL] Un entero de tamao normal. El rango con signo es de -2147483648 a 2147483647. El rango sin signo es de 0 a 4294967295.
BIGINT[(M)] [UNSIGNED] [ZEROFILL] Un entero grande. El rango con signo es de -9223372036854775808 a 9223372036854775807. El rango sin signo es de 0 a 18446744073709551615. Algunos aspectos a considerar con respecto a las columnas BIGINT : Toda la aritmtica se hace usando valores BIGINT o DOUBLE, as que no debe usar enteros sin signos mayores que 9223372036854775807 (63 bits) except con funciones bit! Si lo hace, algunos de los ltimos dgitos en el resultado pueden ser errneos por culpa de errores de redondeo al convertir valores BIGINT a DOUBLE. MySQL 5.0 puede tratar BIGINT en los siguientes casos: Cuando usa enteros para almacenar valores grandes sin signo en una columna BIGINT . En MIN(col_name) o MAX(col_name), donde col_name se refiere a una columna BIGINT . Al usar operadores (+, -, *, y as) donde ambos operadores son enteros. Siempre puede guardar un valor entero exacto en un columna BIGINT almacenndolo usando una cadena de caracteres. En este caso, MySQL realiza una conversin cadena de caracteresnmero que no implica representacin de doble precisin intermedia. Los operadores -, +, y * usan BIGINT en operaciones aritmticas cuando ambos operandos son valores enteros. Esto significa que si multiplica dos enteros grandes (o resultados de funciones que devuelven enteros), puede obtener resultados inesperados cuando el resultado es mayor que 9223372036854775807.
FLOAT(p) [UNSIGNED] [ZEROFILL] Nmero con coma flotante. p representa la precisin. Puede ir de 0 a 24 para nmeros de coma flotante de precisin sencilla y de 25 a 53 para nmeros de coma flotante con doble precisin. Estos tipos son como los tipos FLOAT y DOUBLE descritos a continuacin. FLOAT(p) tiene le mismo rango que los tipos correspondientes FLOAT y DOUBLE, pero la anchura de muestra y el nmero de decimales no estn definidos. En MySQL 5.0, este es un valor de coma flotante autntico. Esta sintaxis se proprociona para compatibilidad con ODBC. 529
Usar FLOAT puede darle algunos problemas inesperados ya que todos los clculos se en MySQL se hacen con doble precisin. Consulte Seccin A.5.7, Resolver problemas con registros que no salen.
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] Un nmero de coma flotante pequeo (de precisin simple). Los valores permitidos son de -3.402823466E+38 a -1.175494351E-38, 0, y de 1.175494351E-38 a 3.402823466E+38. Si se especifica UNSIGNED, los valores negativos no se permiten. M es la anchura de muestra y D es el nmero de dgitos significativos. FLOAT sin argumentos o FLOAT(p) (donde p est en el rango de 0 a 24) es un nmero de coma flotante con precisin simple.
DOUBLE[(M,B)] [UNSIGNED] [ZEROFILL] Nmero de coma flotante de tamao normal (precisin doble). Los valores permitidos son de -1.7976931348623157E+308 a -2.2250738585072014E-308, 0, y de 2.2250738585072014E-308 a 1.7976931348623157E+308. Si se especifica UNSIGNED, no se permiten valores negativos. M es la anchura de muestra y B es el nmero de bits de precisin. DOUBLE sin parmetros o FLOAT(p) (donde p est en el rango de 25 a 53) es un nmero de coma flotante con doble precisin. Un nmero de coma flotante con precision sencilla tiene una precisin de 7 decimales aproximadamente; un nmero con coma flotante de doble precisin tiene una precisin aproximada de 15 decimales.
DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL] Son sinnimos de DOUBLE. Excepcin: Si el modo del servidor SQL incluye la opcin REAL_AS_FLOAT, REAL es un sinnimo para FLOAT en lugar de DOUBLE.
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL] A partir de MySQL 5.0.3: Nmero de punto fijo exacto y empaquetado. M es el nmero total de dgitos y D es el nmero de decimales. El punto decimal y (para nmeros negativos) el signo '-' no se tiene en cuenta en M. Si D es 0, los valores no tienen punto decimal o parte fraccional. El mximo nmero de dgitos (M) para DECIMAL es 64. El mximo nmero de decimales soportados (D) es 30. Si UNSIGNED se especifica, no se permiten valores negativos. Si se omite D, el valor por defecto es 0. Si se omite M, el valor por defecto es 10. Todos los clculos bsicos (+, -, *, /) con columnas DECIMAL se hacen con precisin de 64 dgitos decimales. Antes de MySQL 5.0.3: Nmero de punto decimal fijo sin empaquetar. Se comporta como una columna CHAR ; "sin empaquetar" significa que el nmero se alacena como una cadena de caracteres, usando un carcter para cada dgito del valor. M es el nmero total de dgitos y D es el nmero de decimales. El punto decimal y (para nmeros negativos) el signo '-' no se cuenta en M, aunque se reserva espacio
530
para l. Si D es 0, los valores no tienen punto decimal ni parte fraccional. El mximo rango de los valores DECIMAL es el mismo que para DOUBLE, pero el rango real para una columna DECIMAL dada puede estar restringido por la eleccin de M y D. Si se especifica UNSIGNED no se permiten nmeros negativos. Si se omite D, el valor por defecto es 0. Si se omite M, el valor por defecto es 10.
DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], FIXED[(M[,D])] [UNSIGNED] [ZEROFILL] Son sinnimos para DECIMAL. El sinnimo FIXED est disponible por compatibilidad con otros servidores.
DATETIME Combinacin de fecha y hora. El rango soportado es de '1000-01-01 00:00:00' a '9999-12-31 23:59:59'. MySQL muestra valores DATETIME en formato 'YYYY-MM-DD HH:MM:SS', pero permite asignar valores a las columnas DATETIME usando cadenas de caracteres o nmeros.
TIMESTAMP[(M)] Una marca temporal. El rango es de '1970-01-01 00:00:00' hasta el ao 2037. Una columna TIMESTAMP es til para registrar la fecha y hora de una operacin INSERT o UPDATE . La primera columna TIMESTAMP en una tabla se rellena automticamente con la fecha y hora de la operacin ms reciente si no le asigna un valor. Puede asignar a cualquier columna TIMESTAMP la fecha y hora actual asignndole un valor NULL . En MySQL 5.0, TIMESTAMP se retorna como una cadena de caracteres en el formato 'YYYY-MMDD HH:MM:SS' cuya anchura de muestra son 19 caracteres. Si quiere obtener el valor como un nmero, debe aadir +0 a la columa timestamp .
TIME Una hora. El rango es de '-838:59:59' a '838:59:59'. MySQL muestra los valores TIME en formato 'HH:MM:SS', pero permite asingar valores a columnas TIME usando nmeros o cadenas de caracteres.
531
YEAR[(2|4)] Un ao en formato de dos o cuatro dgitos. El valor por defecto est en formato de cuatro dgitos. En formato de cuatro dgitos, los valores permitidos son de 1901 a 2155, y 0000. En formato de dos dgitos, los valores permitidos son de 70 a 69, representando los aos de 1970 a 2069. MySQL muestra los valores YEAR en formato YYYY pero permite asignar valores a columnas YEAR usando cadenas de caracteres o nmeros.
Esta definicin de tabla crea una columna llamada c1 que tiene un conjunto de caracteres utf8 con la colacin por defecto para ese conjunto de caracteres, y una columna llamada c2 que tiene el conjunto de caracteres latin1 y la colacin binaria para el conjunto de caracteres. La colacin binaria no es sensible a maysculas. MySQL 5.0 interpreta las especificaciones de longitud en las definiciones de las columnas en unidades de caracteres . (En algunas versiones anteriores de MySQL la longitud se interpreta en bytes.) Para los tipos CHAR, VARCHAR, y the TEXT, el atributo BINARY hace que se asigne a la columna la colacin binaria del conjunto de caracteres. Las ordenaciones y comparaciones de las columnas de tipo carcter se basan en el conjunto de caracteres asignado a la columna. Para versiones anteriores, la comparacin y ordenacin se basan en la colacin del conjunto de caracteres del servidor. Para columnas CHAR y VARCHAR, puede declarar que la columna con el atributo BINARY realice la ordenacin y la comparacin usando los cdigos de los valores subyacentes en lugar del orden lxico. Para ms informacin acerca del soporte de conjuntos de caracteres en MySQL 5.0, consulte Captulo 10, Soporte de conjuntos de caracteres. [NATIONAL] CHAR(M) [BINARY | ASCII | UNICODE] Una cadena de caracteres de longitud fija que siempre tiene el nmero necesario de espacios a la derecha para ajustarla a la longitud especificada al almacenarla. M representa la longitud de la columna. El rango de M en MySQL 5.0 es de 0 a 255 caracteres.
532
Nota: Los espacios a la derecha se borran cuando se obtiene los valores CHAR . Antes de MySQL 5.0.3, una columna CHAR con una longitud especificada mayor que 255 se convierte al tipo TEXT ms pequeo que pueda tener los valores de la longitud dada. Por ejemplo, CHAR(500) se convierte a TEXT, y CHAR(200000) se convierte en MEDIUMTEXT. Esta es una caracterstica de compatibilidad. Sin embargo, esta conversin causa que la columna tenga longitud variable, y tambin afecta a la eliminacin de espacios. CHAR es una abreviatura para CHARACTER. NATIONAL CHAR (o su forma equivalente de, NCHAR) es la forma estndar de SQL de definir que una columna CHAR debe usar el conjunto de caracteres por defecto. Este es el comportamiento por defecto en MySQL. El atributo BINARY es una abreviatura para especificar la colacin binaria del conjunto de caracteres de la columna. La ordenacin y comparacin se basa en los valores numricos de los caracteres. El tipo de columna CHAR BYTE es un alias para CHAR BINARY. Esta es una caracterstica de compatibilidad. El atributo ASCII puede especificarse para CHAR. Asigna el conjunto de caracteres latin1. El atributo UNICODE puede especificarse en MySQL 5.0 para CHAR. Asigna el conjunto de caracteres ucs2 . MySQL le permite crear un tipo de columna CHAR(0). Esto es til cuando tiene que cumplir con las especificaciones de alguna aplicacin vieja que dependa de la existencia de una columna pero que no usa realmente el valor. Esto es tambin til cuando necesita una columna que slo pueda tener dos valores: Una columna CHAR(0) que no est definido como NOT NULL ocupa slo un bit y slo puede tener dos valores NULL y '' (la cadena de caracteres vaca). CHAR Es un sinnimo de CHAR(1).
[NATIONAL] VARCHAR(M) [BINARY] Cadena de caracteres de longitud variable. M representa la longitud de columna mxima. En MySQL 5.0, el rango de M es de 0 a 255 antes de MySQL 5.0.3, y de 0 a 65,535 en MySQL 5.0.3 y posterior. (La longitud mxima real de un VARCHAR en MySQL 5.0 se determina por el tamao de registro mximo y el conjunto de caracteres que use. La longitud mxima efectiva desde MySQL 5.0.3 es de 65,532 bytes.) Nota: Antes de 5.0.3, los espacios finales se eliminaban cuando se almacenaban los valores VARCHAR, lo que difiere de le especificacin estndar de SQL. Previo a MySQL 5.0.3, una columna VARCHAR con una longitud especificada mayor a 255 se converta al valor de tipo TEXT ms pequeo que poda soportar el valor de la longitu dada. Por ejemplo, VARCHAR(500) se converta a TEXT, y VARCHAR(200000) se converta a MEDIUMTEXT. Esto era una cuestin de compatibilidad. Sin embargo, esta conversin afectaba la eliminacin de espacios finales. VARCHAR es la abreviacin de CHARACTER VARYING. En MySQL 5.0, el atributo BINARY es abreviatura para especificar la colacin binaria del conjunto de caracteres de la columna. La ordenacin y la comparacin se basa en los valores numricos de los caracteres.
533
Desde MySQL 5.0.3, VARCHAR se guarda con un prefijo de longitud de uno o dos bytes + datos. La longitud del prefijo es de dos bytes si la columna VARCHAR se declara con una longitud mayor a 255.
BINARY(M) El tipo BINARY es similar al tipo CHAR, pero almacena cadenas de datos binarios en lugar de cadenas de caracteres no binarias.
VARBINARY(M) El tipo VARBINARY es similar al tipo VARCHAR, pero almacena cadenas de caracteres binarias en lugar de cadenas de caracteres no binarias.
TINYBLOB Una columna BLOB con una longitud mxima de 255 (2^8 - 1) bytes.
TINYTEXT Una columna TEXT con longitud mxima de 255 (2^8 - 1) caracteres.
BLOB[(M)] Una columna BLOB con longitud mxima de 65,535 (2^16 - 1) bytes. Una longitud opcional M puede darse para este tipo en MySQL 5.0. Si se hace, MySQL crear las columnas como el tipo BLOB de tamao mnimo para tratar los valores de M bytes.
TEXT[(M)] Una columna TEXT con longitud mxima de 65,535 (2^16 - 1) caracteres. En MySQL 5.0, se puede dar una longitud opcional M . En ese caso MySQL crear las columnas con el tipo TEXT de longitud mnima para almacenar los valors de longitud M .
534
Tipos numricos
MEDIUMTEXT Una columna TEXT con longitud mxima de 16,777,215 (2^24 - 1) caracteres.
LONGBLOB Una columna BLOB con longitud mxima de 4,294,967,295 o 4GB (2^32 - 1) bytes. La longitud mxima efectiva (permitida) de las columnas LONGBLOB depende del tamao mximo configurado para los paquetes en el protocolo cliente/servidor y la memoria disponible.
LONGTEXT Una columna TEXT con longitud mxima de 4,294,967,295 or 4GB (2^32 - 1) caracteres. La longitud mxima efectiva (permitida) de columnas LONGTEXT depende del tamao mximo de paquete configurado en el protocolo cliente/servidor y la memoria disponible.
ENUM('value1','value2',...) Una enumeracin. Un objeto de cadena de caracteres que slo puede tener un valor, elegido de una lista de valores 'value1', 'value2', ..., NULL o el valor de error especial '' . Una columna ENUM puede tener un mximo de 65,535 valores distintos. Los valores ENUM se representan internamente como enteros.
SET('value1','value2',...) Un conjunto. Un objeto de cadena de caracteres que puede tener cero o ms valores que deben pertencer a la lista de valores 'value1', 'value2', ... Una columna SET puede tener un mximo de 64 miembros. Los valores SET se representan internamente como enteros.
535
Tipos numricos
SMALLINT
2 3 4 8
-32768 0
MEDIUMINT
-8388608 0
INT
-2147483648 0
BIGINT
-9223372036854775808 0
MySQL soporta otra extensin para especificar de forma ptima el ancho a mostrar de un tipo entero en parntesis despus de la palabra clave para el tipo (por ejemplo, INT(4)). Esta especificacin opcional del ancho de muestra se usa para alinear a la izquierda la muestra de los valores con ancho menor que el ancho especificado para la columna. El ancho de muestra no restringe el rango de valores que pueden almacenarse en la columna, no el nmero de dgitos que se muestran para valores con ancho que exceda el especificado para la columna. Cuando se usa en conjuncin con el atributo de extensin opcional ZEROFILL, el relleno por defecto de espacios se replaza por ceros. Por ejmplo, para una columna declarada como INT(5) ZEROFILL, un valor de 4 se muestra como 00004. Tenga en cuenta que si almacena valores mayores que el ancho de muestra en una columna entera, puede tener problemas cuando MySQL genera tablas temporales para algunos joins complicados, ya que en estos casos MySQL cree que los datos encajan en el ancho original de la columna. Todos los tipos enteros pueden tener un atributo opcional (no estndar) UNSIGNED. Los valores sin signo pueden usarse cuando quiere permitir slo nmeros no negativos en una columna y necesita un rango numrico mayor para la columna. Tipos de coma flotante y de coma fija pueden ser UNSIGNED. Como con los tipos enteros, este atributo evita que los valores negativos se almacenen en la columna. Sin embargo, a diferencia de los tipos enteros, el rango superior de los valores de la columna sigue siendo el mismo. Si especifica ZEROFILL para una columna numrica, MySQL aade automticamente el atributo UNSIGNED a la columna. Para columnas de tipo coma flotante, MySQL usa cuatro bytes para valores de precisin simple y ocho bytes para valores de doble precisin. El tipo FLOAT se usa para representar tipos numricos aproximados. El estndar SQL permite una especificacin opcional de la precisin (pero no del rango del exponente) en bits a continacin de la palabra clave FLOAT entre parntesis. La implementacin de MySQL soporta esta especificacin opcional de precisin, pero el valor de precisin se usa slo para determinar el tamao de almacenamiento. Una precisin de 0 a 23 resulta en una columna de precisin simple de cuatro bytes de tamao FLOAT . Una precisin de 24 a 53 resulta en una columna de doble precisin de ocho bytes de tamao DOUBLE . Cuando se especifica la palaba clave FLOAT para tipos de columnas sin especificar la precisin, MySQSL usa cuatro bytes para almacenar los valors.MySQL tambin soporta una sintaxis alternativa con dos nmeros entre parntesis a continacin de la palabra clave FLOAT . El primer nmero representa el ancho a mostrar y el segundo nmero especifica el nmero de dgitos a almacenar a continuacin del punto decimal ( como con DECIMAL y NUMERIC). Cuando se pide a MySQL que almacene un nmero para tales columnas con ms dgitos decimales a continuacin del punto decimal del especificado para la columna, el valor se redondea para elminar los dgitos extras cuando se almacena el valor. En SQL estndar, los tipos REAL y DOUBLE PRECISION no aceptan especificaciones de precisin. MySQL soporta una sintaxis alternativa con dos nmeros dados entre parntesis a continuacin del
536
Tipos numricos
nombre del tipo. El primer nmero representa el ancho a mostrar y el segundo nmero especifica el nmero de dgitos a almacenar y mostrar a continuacin del punto decimal. Como una extensin al estndar SQL, MySQL reconoce DOUBLE como sinnimo del tipo DOUBLE PRECISION . En contraste con el requerimiento estndar que la precisin para REAL sea menor que la usada para DOUBLE PRECISION, MySQL implementa ambas como valores de punto flotante de doble precisin con tamao de ocho bytes (a no ser que el modo SQL del servidor incluya la opcin REAL_AS_FLOAT ). Para portabilidad mxima, el cdigo que requiera almacenamiento de datos numricos aproximados debe usar FLOAT o DOUBLE PRECISION sin especificar la precisin ni el nmero de dgitos decimales. Los tipos DECIMAL y NUMERIC se implementan como el mismo tipo en MySQL. Se usan para guardar valores para los que es importante preservar una precisin exacta, por ejemplo con datos monetarios. Cuando se declara una columna de alguno de estos tipos, la precisin y la escala puede especificarse (y usualmente se hace), por ejemplo:
salary DECIMAL(5,2)
En este ejemplo, 5 es la precisin y 2 es la escala. La precisin representa el nmero de dgitos decimales significativos que se almacenan para los valores, y la escala representa el nmero de dgitos que pueden almacenarse a continuacin del punto decimal. Desde MySQL 5.0.3, los valores DECIMAL y NUMERIC se almacenan en formato binario. Antes de 5.0.3, MySQL almacena los valores DECIMAL y NUMERIC como cadenas de caracteres, en lugar de binario. .Un carcter se usa para cada dgito del valor, el punto decimal (si la escala es mayor que 0), y el signo '-' (para nmeros negativos). Si la escala es 0, los valores DECIMAL y NUMERIC no contienen punto decimal o parte fraccional. SQL estndar requiere que la columna salary sea capaz de almacenar cualquier valor con cinco dgitos y dos decimales. En este caso, por lo tanto, el rango de valores que puede almacenarse en la columna salary es desde -999.99 a 999.99. MySQL fuerza este lmite desde MySQL 5.0.3. Antes de 5.0.3, MySQL 5.0 variaba este lmite de forma que, en el lmite positivo del rango, la columna poda almacenar nmeros hasta 9999.99. (Para nmeros positivos, MySQL 5.0.2 y anteriores usaba el byte reservado para el signo para extender el lmite superior del rango.) En SQL estndar, la sintaxis DECIMAL(M) es equivalente a DECIMAL(M,0). Similarmente, la sintaxis DECIMAL es equivalente a DECIMAL(M,0), donde la implementacin se permite para decidir el valor de M. Ambas formas de los tipos DECIMAL y NUMERIC se soportan en MySQL 5.0. El valor por defecto de M es 10. El mximo rango de los valores DECIMAL y NUMERIC es el mismo para DOUBLE, pero el rango real para un valor dado en una columna DECIMAL o NUMERIC puede restringirse con la precisin o escala para una columna dada. Cuando en tal columna se asigna un valor con ms dgitos siguiendo el punto decimal de los permitidos por la escala especfica, el valor se convierte a tal escala. (El comportamiento preciso depende del sistema operativo, pero generalmente el efecto es que se trunca al nmero de dgitos permitidos.) Desde MySQL 5.0.3, el tipo de datos BIT puede usarse para guardar valores de un bit. Un tipo BIT(M) permite el almacenamiento de valores de M-bit . M tiene un rango de 1 a 64. Para especificar valores bit, puede usar la notacin b'value' . value es un valor binario escrito usando ceros y unos. Por ejemplo, b'111' y b'100000000' representan 7 y 128, respectivamente. Consulte Seccin 9.1.5, Valores de bits. Si asigna un valor a una columna BIT(M) con menos de M bits , el valor se alinea a la izquierda con ceros. Por ejemplo, asignar un valor b'101' a una columna BIT(6) es, en efecto, lo mismo que asignar b'000101'. Cuando se intenta almacenar un valor en una columna numrica que est fuera del rango permitido por la columna, MySQL corta el valor en el final del rango permitido y guarda el valor resultante.
537
Por ejemplo, el ranto de una coluna INT es de -2147483648 a 2147483647. Si intenta insertar -9999999999 en una columna INT, MySQL reemplaza el valor con el mnimo valor del rango y almacena -2147483648 en su lugar. De forma similar, si trata de insertar 9999999999, MySQL reemplaza el valor con el valor mximo del rango y almacena 2147483647 en su lugar. Si la columna INT es UNSIGNED, el tamao del rango de la columna es el mismo, pero los lmites cambian a 0 y 4294967295. Si intenta almacenar -9999999999 y 9999999999, los valores almacenados en la columna son 0 y 4294967296. Cuando se asigna un valor fuera de rango especificado (o por defecto) a una columna de coma flotante o fija, MySQL almacena el valor representado por el valor correspondiente al lmite de rango correspondiente. Las conversiones debidas a valores fuera de rango se reportan como advertencias para los comandos ALTER TABLE, LOAD DATA INFILE, UPDATE, y INSERT de mltiples registros.
538
Aunque MySQL trata de interpretar los valores con varios formatos, las fechas siempre deben darse en el orden ao-mes-da (por ejemplo, '98-09-04'), en lugar del formato mes-da-ao o da-mesao usados comunmente (por ejemplo, '09-04-98', '04-09-98'). MySQL convierte automticamente una fecha u hora a un nmero si el valor se usa en un contexto numrico y viceversa. Cuando MySQL encuentra un valor para fecha u hora que est fuera de rango o es ilegal para el tipo (como se describe al inicio de la seccin), lo convierte al valor cero para ese tipo. La excepcin es que los valores fuera de rango del tipo TIME se reemplazan por el valor lmite de rango apropiado para el tipo TIME . La siguiente tabla muestra el formato del valor cero para cada tipo. Tenga en cuenta que el uso de estos valores produce mensajes de advertencia si el modo SQL NO_ZERO_DATE est activado. Tipo de Columna DATETIME DATE TIMESTAMP TIME YEAR Cero Valor '0000-00-00 00:00:00' '0000-00-00' 00000000000000 '00:00:00' 0000
Los valores cero son especiales, pero puede almacenarlos o referirse a ellos explcitamente usando los valores mostrados en la tabla. Tambin puede hacerlo usando los valores '0' o 0, que son ms sencillos de escribir. Los valores de fecha u hora cero usados a travs de MyODBC se convierten automticamente a NULL en MyODBC 2.50.12 y posterior, ya que ODBC no puede tratar estos valores.
Como cadena de caracteres sin delimitadores en formato 'YYYYMMDDHHMMSS' o 'YYMMDDHHMMSS', mientras que la cadena de caracteres tenga sentido como fecha. Por ejemmplo, '19970523091528' y '970523091528' se interpretan como '1997-05-23 09:15:28', pero '971122129015' es ilegal (tiene una parte de minutos sin sentido) y se convierte en '0000-00-00 00:00:00'. Como cadena de caracteres sin delimitadores en formato 'YYYYMMDD' o 'YYMMDD' , mientras que el cadena de caracteres tenga sentido como fecha. Por ejemplo, '19970523' y '970523' se interpretan como '1997-05-23', pero '971332' es ilegal (tiene una parte de mes y da sin sentido) y se convierte en '0000-00-00'. Como nmero en formato YYYYMMDDHHMMSS o YYMMDDHHMMSS, mientras que el nmero tenga sentido como fecha. Por ejemplo, 19830905132800 y 830905132800 se interpretan como '1983-09-05 13:28:00'. Como nmero en formato YYYYMMDD o YYMMDD, mientras que el nmero tenga sentido como fecha. Por ejemplo, 19830905 y 830905 se interpretan como '1983-09-05'. Como resultado de una funcin que retorne un valor acceptable en un contexto DATETIME, DATE, o TIMESTAMP , como NOW() o CURRENT_DATE. Los valores ilegales de DATETIME, DATE, o TIMESTAMP se convierten al valor cero del tipo apropiado ('0000-00-00 00:00:00', '0000-00-00', o 00000000000000). Para valores especificados como cadenas de caracteres que incluyan partes de fecha delimitadas, no es necesario especificar dos dgitos para valores de mes o da menores que 10. '1979-6-9' es lo mismo que '1979-06-09'. Similarmente, para valores especificados como cadenas de caracteres que incluyan delimitadores para la parte de hora, no es necesario especificar dos dgitos para horas, minutos o segundos menores que 10. '1979-10-30 1:2:3' es lo mismo que '1979-10-30 01:02:03'. Los valores especificados como nmeros deben tener una longitud de 6, 8, 12, o 14 dgitos. Si un nmero tiene una longitud de 8 o 14 dgitos, se asume que est en formato YYYYMMDD o YYYYMMDDHHMMSS y que el ao lo dan los primeros 4 dgitos. Si el nmero tiene 6 o 12 dgitos de longitud, se asume que est en formato YYMMDD o YYMMDDHHMMSS y que el ao lo dan los primeros 2 dgitos. A los nmeros que no tengan estas longitudes se les aaden ceros a la izquierda hasta la longitud ms cercana permitida. Los valores especificados como cadenas de caracteres no delimitadas se interpretan usando su longitud. Si la cadena de caracteres tiene longitud 8 o 14, el ao se asume como dado por los primeros 4 caracteres. En el resto de caso, se supone que el ao lo dan los primeros 2 caracteres. La cadena de caracteres se interpreta de izquierda a derecha para encontrar el ao, mes, da, hora, minuto y segundo, para tantas partes como representa la cadena de caracteres. Esto significa que no debe usar cadenas de caracteres con menos de 6 caracteres. Por ejemplo, si especifica '9903', pensando que representa Marzo, 1999, MySQL inserta un valor cero en la tabla. Esto es porque el valor de ao y mes son 99 y 03, pero la parte de da no se encuentra, as que el valor no es una fecha legal. Sin embargo, puede especificar explcitamente un valor de cero para representar partes de da y mes. Por ejemplo, puede usar '990300' para insertar el valor '1999-03-00'. Puede asignar valores de un tipo a un objeto de un tipo diferente hasta un lmite. Sin embargo, hay algunas alteraciones del valor o prdidas de informacin: Si asigna un valor DATE a un objeto DATETIME o TIMESTAMP, la parte de hora del valor resultante se cambia a '00:00:00' ya que el valor DATE no contiene informacin temporal. Si asigna un valor DATETIME o TIMESTAMP a un objeto DATE, la parte temporal del valor resultante se borra porque el tipo DATE no tiene informacin temporal. Tenga en cuenta que aunque DATETIME, DATE, y TIMESTAMP pueden especificarse usando el mismo conjunto de formatos, los tipos no tienen el mismo rango de valores. Por ejemplo,
540
TIMESTAMP no pueden ser anteriores a 1970 o posteriores a 2037. Esto significa que una fecha como '1968-01-01', que sera legal como DATETIME o DATE no es un valor vlido TIMESTAMP y se convierte a 0 si se asigna a un objeto de este tipo. Tenga en cuenta ciertas cosas al especificar valores temporales: El formato relajado para valores especificados como cadenas de caracteres puede ser problemtico. Por ejemplo, un valor como '10:11:12' puede parecer una hora por el delimitador ':' , pero si se usa en un contexto de fecha se interpreta como '2010-11-12'. El valor '10:45:15' se convierte a '0000-00-00' ya que '45' no es un mes legal. El servidor MySQL realiza slo chequeo bsico de la validez de las fechas: Los rangos para ao, mes y da son de 1000 a 9999, 00 a 12, y 00 a 31, respectivamente. Cualquier fecha que contenga partes fuera de estos rangos est sujeta a conversin a '0000-00-00'. Tenga en cuenta que esto permite almacenar fechas invlidas como '2002-04-31'. Para asegurar que una fecha es vlida, haga una comprobacin en su aplicacin. Fechas con valores de ao de dos dgitos son ambguas porque no se conoce el siglo. MySQL interpreta los aos de dos dgitos usando las siguientes reglas: Los valores de aos en el rango 00-69 se convierten a 2000-2069. Los valores de aos en el rango 70-99 se convierten a 1970-1999.
Un cliente puede hacer que el servidor se ejecute en modo MAXDB para sus propias conexiones como se muestra:
mysql> SET SESSION sql_mode=MAXDB;
Desde MySQL 5.0.2, MySQL no acepta valores timestamp que incluyan cero en la columna de da u hora o valores que no sean fechas vlidas. La nica excepcin es el valor especial '0000-00-00 00:00:00'. En MYSQL 5.0, tiene considerable flexibilidad para determinar cuando se actualiza e inicializa automticamente TIMESTAMP y qu columna debe tener ese comportamiento: Puede asignar la fecha y hora actual como el valor por defecto y el valor de actualizacin automtico, como se haca anteriormente. Pero es posible tener slo uno u otro comportamiento automtico, o ninguno de ellos. (No es posible tener un comportamiento para una columna y el otro para la otra columna.)
541
Puede especificar qu columna TIMESTAMP inicializar o actualizar con la fecha y hora actuales. Ya no hace falta que sea la primera columna TIMESTAMP . Tenga en cuenta que la informacin en la siguiente discusin se aplica a columnas TIMESTAMP slo para tablas no creadas con el modo MAXDB activado. (Como se menciona anteriormente, el modo MAXDB hace que las columnas se creen como columnas DATETIME .) Las reglas que gobiernan la inicializacin y actualizacin de columnas TIMESTAMP en MySQL 5.0 son las siguientes: Si un valor DEFAULT se especifica para la primera columna TIMESTAMP en una tabla, no se ignora. El valor por defecto puede ser CURRENT_TIMESTAMP o una fecha y hora constante. DEFAULT NULL es lo mismo que DEFAULT CURRENT_TIMESTAMP para la primera columna TIMESTAMP. Para cualquier otra columna TIMESTAMP, DEFAULT NULL se trata como DEFAULT 0. Cualquier columna TIMESTAMP individual en una tabla puede actualizarse e inicializarse con la fecha y hora actual automticamente. En un comando CREATE TABLE, la primera columna TIMESTAMP puede declararse de cualquiera de las siguientes formas: Con las clusulas DEFAULT CURRENT_TIMESTAMP y ON UPDATE CURRENT_TIMESTAMP, la columna tiene la fecha y hora actual como su valor por defecto, y se actualiza automticamente. Sin las clusulas DEFAULT ni ON UPDATE, es lo mismo que DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP. Con la clusula DEFAULT CURRENT_TIMESTAMP y sin ON UPDATE, la columna tiene la fecha y hora actual como valor por defecto pero no se actualiza automticamente. Sin clusula DEFAULT y con clusula ON UPDATE CURRENT_TIMESTAMP, la columna tiene por defecto 0 y se actualiza automticamente. Con un valor constante DEFAULT, la columna tiene el valor dado por defecto. Si la columna tiene una clusula ON UPDATE CURRENT_TIMESTAMP se actualiza automticamente, de otro modo no lo hace. En otras palabras, puede usar la fecha y hora actuales para el valor inicial y el valor de actualizacin automtica, o uno de ellos o ninguno. (Por ejemplo, puede especificar ON UPDATE para activar actualizacin automtica sin tener la columna inicializada .) Cualquiera de CURRENT_TIMESTAMP, CURRENT_TIMESTAMP(), o NOW() puede usarse en las clusulas DEFAULT y ON UPDATE . Todas tienen el mismo efecto. El orden de los dos atributos no importa. Si se especifican DEFAULT y ON UPDATE para una columna TIMESTAMP, cualquiera puede preceder al otro. Ejemplo. Estos comandos son equivalentes:
CREATE TABLE t (ts TIMESTAMP); CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t (ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Para especificar el valor por defecto o actualizacin automtica para una columna TIMESTAMP distinta a la primera, debe suprimir la actualizacin e inicializacin automtica de la primera columna TIMESTAMP asignndole explcitamente una valor constante DEFAULT (por ejemplo, DEFAULT 0 o DEFAULT '2003-01-01 00:00:00'). Luego, para la otra columna TIMESTAMP, las reglas son las mismas que para la misma columna TIMESTAMP, excepto que no puede omitir ambas clusulas DEFAULT y ON UPDATE . Si lo hace, no habr inicializacin ni actualizacin automtica. Ejemplo, estos comandos son equivalentes:
542
El tipo TIME
CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
En MySQL 5.0, puede asignar la zona horaria actual para cada conexin, como se describe en Seccin 5.9.8, Soporte de zonas horarias en el servidor MySQL. Los valores TIMESTAMP se almacenan en UTC, convirtindose desde la zona horaria actual para almacenamiento, y volvindose a convertir a la zona horaria actual al mostrarse. Mientras la zona horaria permanezca constante, puede obtener el mismo valor que hay almacenado. Si almacena un valor TIMESTAMP, cambia la zona horaria y luego rescata el valor, es diferente que el valor almacenado. Esto ocurre porque no se usa la misma zona horaria para la conversin en ambas direcciones. La zona horaria actual est disponible en la variable de sistema time_zone. Puede incluir el atributo NULL en la definicin de una columna TIMESTAMP para permitir que la columna contenga valores NULL . Por ejemplo:
CREATE TABLE t ( ts1 TIMESTAMP NULL DEFAULT NULL, ts2 TIMESTAMP NULL DEFAULT 0, ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP );
Si el atributo NULL no se especifica, asignar el valor NULL a la columna resulta en que se almacena la hora y fecha actuales. Tenga en cuenta que una columna TIMESTAMP que permita valores NULL no no almacenar la fecha y hora actual a no ser que su valor por defecto se defina como CURRENT_TIMESTAMP, o NOW() o CURRENT_TIMESTAMP se inserte en la columna. En otras palabras, una columna TIMESTAMP definida como NULL se actualizar automticamente slo si se crea usando una definicin como las siguientes:
CREATE TABLE t (ts NULL DEFAULT CURRENT_TIMESTAMP);
De otro modo - esto es, si la columna TIMESTAMP se define usando NULL pero no usando DEFAULT TIMESTAMP, como se muestra aqu...
CREATE TABLE t1 (ts NULL DEFAULT NULL); CREATE TABLE t2 (ts NULL DEFAULT '0000-00-00 00:00:00');
...entonces debe insertar el valor explcitamente correspondiente a la fecha y hora actuales. Por ejemplo:
INSERT INTO t1 VALUES (NOW()); INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);
543
Como cadena de caracteres sin delimitadores en formato 'HHMMSS', mientras que tenga sentido como hora. Por ejemplo, '101112' se entiende como '10:11:12', pero '109712' es ilegal (no tiene una parte de minutos correcta) y pasa a ser '00:00:00'. Como nmero en formato HHMMSS, mientras tenga sentido como hora. Por ejemplo, 101112 se entiende como '10:11:12'. Los siguientes formatos alternativos tambin se entienden: SS, MMSS, HHMMSS, HHMMSS.fraccin. Tenga en cuenta que MySQL no almacena la fraccin (todava). Como resultado de una funcin que retorna un valor que es aceptable en un contexto TIME, tal como CURRENT_TIME. Para valores TIME especificados como cadenas de caracteres que incluyan un delimitador de las partes de hora, no es necesario especificar dos dgitos para horas, minutos o segundos que tengan un valor inferior a 10. '8:3:2' es lo mismo que '08:03:02'. Tenga cuidado con asignar valores abreviados a una columna TIME . Sin comas, MySQL interpreta los valores asumiendo que los dos dgitos ms a la derecha representan segundos. (MySQL interpreta valores TIME como tiempo transcurrido en lugar de horas del da.) Por ejemplo puede pensar que '1112' y 1112 significan '11:12:00' (12 minutos tras las 11 en punto), pero MySQL los interpreta como '00:11:12' (11 minutos, 12 segundos). Similarmente, '12' y 12 se interpretan como '00:00:12'. Los valores TIME con comas, por contrario, se tratan siempre como hora del da. Esto es, '11:12' significa '11:12:00', no '00:11:12'. Los valores fuera del rango de TIME pero que son legales se cambian por el valor lmite de rango ms cercano. Por ejemplo '-850:00:00' y '850:00:00' se convierten en '-838:59:59' y '838:59:59'. Valores TIME ilegales se convierten a '00:00:00'. Tenga en cuenta que como '00:00:00' es un valor TIME legal, no hay forma de decir si un valor '00:00:00' almacenado en una tabla, se insert como '00:00:00' o como valor ilegal.
MySQL no tiene problemas con el ao 2000 (Y2K) (consulte Seccin 1.4.5, Conformidad con el efecto 2000), pero los valores de entrada presentados a MySQL pueden tenerlos. Cualquier entrada con valores de aos de dos dgitos es ambigua, ya que no se conoce el siglo. Tales valores deben interpretarse en forma de cuatro dgitos, ya que MySQL los almacena internamente usando cuatro dgitos. Para tipos DATETIME, DATE, TIMESTAMP, y YEAR, MySQL interpreta las fechas con valores de ao ambguos usando las siguientes reglas: Aos en el rango 00-69 se convierten a 2000-2069. Aos en el rango 70-99 se convierten a 1970-1999. Recuerde que estas reglas proporcionan slo suposiciones razonables sobre lo que significan los valores. Si el heurstico usado por MySQL no produce los valores correctos, debe proporcionar entrada no ambgua con aos de cuatro dgitos. ORDER BY ordena valores TIMESTAMP o YEAR correctamente que tengan aos de dos digitos. Algunas funciones como MIN() y MAX() convierten un TIMESTAMP o YEAR a nmero. Esto significa que un valor con un ao de dos dgitos no funciona correctamente con estas funciones. En este caso la solucin es convertir TIMESTAMP o YEAR a formato de cuatro dgitos o usar algo como MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS)).
545
Si asigna un valor a una columna CHAR o VARCHAR que exceda la longitud mxima de la columna, el valor se trunca. Si los caracteres truncados no son espacios, se genera una advertencia. Puede hacer que aparezca un error en lugar de una advertencia usando modo SQL estricto. Consulte Seccin 5.3.2, El modo SQL del servidor. Antes de MySQL 5.0.3, si necesita un tipo de datos para el que no se borren los espacios finales, considere usar un tipo BLOB o TEXT . Tambin, si quiere almacenar valores binarios como resultados de cifrado o compresin que puedan contener valores byte arbitrarios, use una columna BLOB en lugar de CHAR o VARCHAR, para evitar problemas potenciales con eliminacin de espacios finales que puedan cambiar los valores de los datos. La siguiente tabla ilustra las diferencias entre los dos tipos de columnas mostrando el resultado de almacenar varios valores de cadenas de caracteres en columnas CHAR(4) y VARCHAR(4) : Valor '' 'ab' 'abcd' 'abcdefgh' CHAR(4) ' 'ab ' ' Almacenamiento necesario 4 bytes 4 bytes 4 bytes 4 bytes VARCHAR(4) '' 'ab' 'abcd' 'abcd' Almacenamiento necesario 1 byte 3 bytes 5 bytes 5 bytes
'abcd' 'abcd'
Los valores retornados de las columnas CHAR(4) y VARCHAR(4) son los mismos en cada caso, ya que los espacios finales se eliminan en la recuperacin de valores CHAR. En MySQL 5.0, los valores en columnas CHAR y VARCHAR se almacenan y comparan segn la colacin del conjunto de caracteres asignado a la columna. CHAR BYTE es un alias para CHAR BINARY. Existe por cuestin de compatibilidad. El atributo ASCII asigna el conjunto de caracteres latin1 a una columna CHAR . El atributo UNICODE asigna el conjunto de caracteres ucs2 . MySQL puede cambiar silenciosamente el tipo de una columna CHAR o VARCHAR en tiempo de creacin. Consulte Seccin 13.1.5.1, Cambios tcitos en la especificacin de columnas.
546
547
Otra forma de usar GROUP BY o ORDER BY en una columna BLOB o TEXT conteniendo valores grandes cuando quiere que ms de max_sort_length bytes sean significativos es convertir el valor de la columna en un objeto de longitud fija. La forma estndar de hacerlo es con la funcin SUBSTRING . Por ejemplo, el siguiente comando causa que 2000 bytes de la columna comment se tengan en cuenta para ordenacin:
mysql> SELECT id, SUBSTRING(comment,1,2000) FROM tbl_name -> ORDER BY SUBSTRING(comment,1,2000);
El tamao mximo de un objeto BLOB o TEXT se determina por su tipo, pero el valor mximo que puede transmitir entre el cliente y el servidor viene determinado por la cantidad de memoria disponible y el tamao de los buffers de comunicacin. Puede cambiar el tamao de los buffers de comunicacin cambiando el valor de la variable max_allowed_packet, pero debe hacerlo para el servidor y los clientes . Por ejemplo, mysql y mysqldump le permite cambiar el valor de la variable del cliente max_allowed_packet . Consulte Seccin 7.5.2, Afinar parmetros del servidor, Seccin 8.3, La herramienta intrprete de comandos mysql, y Seccin 8.7, El programa de copia de seguridad de base de datos mysqldump. Cada valor BLOB o TEXT se representa internamente como un objeto a parte. Esto se hace en contraste con todos los otros tipos de columnas, para los que el almacenamiento se hace una vez por columna cuando se abre la tabla.
El ndice del valor NULL es NULL. Por ejemplo, una columna especificada como ENUM('one', 'two', 'three') puede tener cualquiera de los valores mostrados aqu. El ndice de cada valor se muestra: Valor NULL '' ndice NULL 0
548
El tipo SET
1 2 3
Una enumeracin puede tener un mximo de 65,535 elementos. Los espacios finales se borran automticamente para valores ENUM miembros cuando se crea la tabla. Cuando se reciben, los valores almacenados en una columna ENUM se muestran usando el formato de maysculas/minsculas usado en la definicin de la columna. En MySQL 4.1.1, las columnas ENUM pueden recibir un conjunto de caracteres y colacin. Para colaciones binarias o sensibles a maysculas/minsculas, el formato se tiene en cuenta al asignar valores a la columna. Si recibe un valor ENUM en contexto numrico, se retorna el ndice del valor. Por ejemplo, puede recibir valores numricos de una columna ENUM as:
mysql> SELECT enum_col+0 FROM tbl_name;
Si almacena un nmero en una columna ENUM, el nmero se trata como ndice, y el valor almacenado es el miembro de la enumeracin con ese ndice. (Sin embargo, esto no funciona con LOAD DATA, que trata toda la entrada como cadenas de caracteres.) No es recomendable definir una columna ENUM con valores de enumeracin que parezcan nmeros, ya que esto puede causar confusin. Por ejemplo, la siguiente columna tiene miembros de enumeracin con valores de '0', '1', y '2', pero valores de ndice 1, 2, y 3:
numbers ENUM('0','1','2')
Los valores ENUM se ordenan segn el order en que se enumeran los mienbros en la especificacin de la columna. (En otras palabras, los valores ENUM se ordenan segn sus nmeros de ndice.) Por ejemplo, 'a' se ordena antes que 'b' para ENUM('a', 'b'), pero 'b' se ordena antes de 'a' para ENUM('b', 'a'). La cadena vaca se ordena antes de las cadenas no vacas, y los valores NULL se ordenan antes de todos los otros valores de la enumeracin. Para evitar resultados inesperados, especifique la lista ENUM en orden alfabtico. Tambin puede usar GROUP BY CAST(col AS VARCHAR) o GROUP BY CONCAT(col) para asegurarse que la columna se ordena lxicamente en lugar de por nmero de ndice. Si quiere determinar todos los valores posibles para una columna ENUM, use SHOW COLUMNS FROM tbl_name LIKE enum_col y parsee la definicin de ENUM en la segunda columna de la salida.
Un SET puede tener un mximo de 64 miembros distintos. Los espacios finales se borran automticamente de los miembros de un SET cuando se crea la tabla. Cuando se recuperan, los valors almacenados en una columna SET se muestran usando la sensibilidad de maysculas/minsculas usando en la definicin de la columna. En MySQL 5.0,
549
las columnas SET pueden tener un conjunto de caracteres y colacin. Para colaciones binarias o sensibles a maysculas/minsculas, esta sensibilidad se tiene en cuenta al asignar valores a la columna. MySQL almacena valores SET numricamente, con el bit de menos peso del valor almacenado correspondiente al primer miembro del conjunto. Si recibe un valor SET en un contexto numrico, el valor recibido tiene los bits asignados correspondientes a los miembros que coinciden con el valor de la columna. Por ejemplo, puede recuperar los valores numricos de una columna SET as:
mysql> SELECT set_col+0 FROM tbl_name;
Si se almacena un nmero en una columna SET, los bits que se asignan en la representacin binaria del nmero determinan los miembros del conjunto en el valor de la columna. Para una columna especificada como SET('a','b','c','d'), los miembros tienen los siguientes valores decimales y binarios: SET Miembro 'a' 'b' 'c' 'd' Valor decimal 1 2 4 8 Valor binario 0001 0010 0100 1000
Si asigna un valor de 9 a esta columna, esto es 1001 en binario, de forma que el primer y cuarto miembro delSET 'a' y 'd' se seleccionan y el valor resultante es 'a,d'. Para un valor que contenga ms de un elemento SET, no importa el orden en que se listen los elementos cuando inserte el valor. Tampoco no importa cuntas veces se lista un elemento dado para el valor. Cuando el valor se recupera posteriormente, cada elemento en el valor aparece una vez, con los elementos listados segn el orden en que se especificaron al crear la tabla. Si una columna se especifica como SET('a','b','c','d'), 'a,d', 'd,a', y 'd,a,a,d,d' aparecen como 'a,d' al recuperarse. Si asigna un valor no soportado a una columna SET, el valor se ignora. Los valores SET se ordenan numricamente. Los valores NULL se ordenan antes de los no NULL. Normalmente, busca valores SET usando la funcin FIND_IN_SET() o el operador LIKE :
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0; mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
El primer comando encuentra registros cuando set_col contiene el miembro value del conjunto. El segundo es similar, pero no igual: encuentra registros cuando set_col contengan el valor value en cualquier sitio, incluso cuando es una subcadena de otro miembro del conjunto. Los siguientes comandos tambin son legales:
mysql> SELECT * FROM tbl_name WHERE set_col & 1; mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
El primero de estos comandos busca valores que contengan el primer miembro del conjunto. El segundo busca una coincidencia exacta. Tenga cuidado con las comparaciones del segundo tipo. Comparar valores del conjunto 'val1,val2' retorna distintos resultados que comparar valores de 'val2,val1'. Debe especificar los valores en el mismo orden en que se listan en la definicin de la columna. Si desea determinar todos los valores posibles para una columna SET, use SHOW COLUMNS FROM tbl_name LIKE set_col y parsee la definicin de SET en la segunda columna de la salida.
Los requerimientos de almacenamiento para cada uno de los tipos de columnas soportados por MySQL se listan por categora. El mximo tamao de un registro en una tabla MyISAM es 65,534 bytes. Cada columna BLOB y TEXT cuenta slo de cinco a nueve bytes ms alla de su tamao. Si una tabla MyISAM incluye cualquier tipo de columna de tamao variable, el formato de rebistro tambin tiene longitud variable. Cuando se crea una tabla. MySQL puede, bajo ciertas condiciones, cambiar una columna de tamao variable a fijo o viceversa. Consulte Seccin 13.1.5.1, Cambios tcitos en la especificacin de columnas para ms informacin. Requerimientos de almacenamiento para tipos numricos Tipo de columna TINYINT SMALLINT MEDIUMINT INT, INTEGER BIGINT FLOAT(p) FLOAT DOUBLE [PRECISION], objeto REAL DECIMAL(M,D), NUMERIC(M,D) BIT(M) Almacenamiento requerido 1 byte 2 bytes 3 bytes 4 bytes 8 bytes 4 bytes si 0 <= p <= 24, 8 bytes si 25 <= p <= 53 4 bytes 8 bytes Vara; consulte la siguiente explicacin aproximadamente (M+7)/8 bytes
Los requerimientos de almacenamiento para DECIMAL (y NUMERIC) son especficos para cada versin: Desde MySQL 5.0.3, los valores para columnas DECIMAL ms largos se representan usando un formato binario que empaqueta nueve dgitos decimales en cuatro bytes. El almacenamiento para la parte entera y fraccional se determinan separadamente. Cada mltiplo de nueve dgitos requiere cuatro bytes, y el dgito "de resto" requiere alguna fraccin de cuatro bytes. El almacenamiento requerido para los dgitos "de resto" se da en la siguiente tabla: Resto Dtigos 0 1 2 3 4 5 6 7 8 9 Nmero de bytes 0 1 1 2 2 3 3 4 4 4
Antes de MySQL 5.0.3, las columnas DECIMAL se representan como cadenas y el requerimiento de almacenamiento es: M+2 bytes si D > 0, M+1 bytes si D = 0 (D+2, si M < D) Requerimientos de almacenamiento para tipos de fecha y hora
551
Requerimientos de almacenamiento para tipos de cadenas de caracteres Tipo de columna CHAR(M) VARCHAR(M) BINARY(M) VARBINARY(M) TINYBLOB, TINYTEXT BLOB, TEXT MEDIUMBLOB, MEDIUMTEXT LONGBLOB, LONGTEXT ENUM('value1','value2',...) SET('value1','value2',...) Almacenamiento requerido M bytes, 0 <= M <= 255 L+1 bytes, donde L <= M y 0 <= M <= 255 M bytes, 0 <= M <= 255 L+1 bytes, donde L <= M y 0 <= M <= 255 L+1 byte, donde L < 2^8 L+2 bytes, donde L < 2^16 L+3 bytes, donde L < 2^24 L+4 bytes, donde L < 2^32 1 o 2 bytes, dependiendo del nmero de valores de la enumeracin (65,535 valores como mximo) 1, 2, 3, 4, o 8 bytes, dependiendo del nmero de miembros del conjunto (64 miembros como mximo)
Los tipos VARCHAR y BLOB y TEXT son de longitud variable. Para cada uno, los requerimientos de almacenamiento depende de la longitud de los valores de la (representados por L en la tabla precedente), en lugar que el tamao mximo del tipo. Por ejemplo, una columna VARCHAR(10) puede tratar una cadena con una lengitud mxima de 10. El almacenamiento requerido real es la longitud de la cadena (L), ms 1 byte para registrar la longitud de la cadena. Para la cadena 'abcd', L es 4 y el requerimiento de almacenamiento son 5 bytes. Para los tipos CHAR, VARCHAR, y TEXT, los valores L y M en la tabla precedente debe interpretarse como nmeros de caracteres en MySQL 5.0, y las longitudes para estos tipos en las especificaciones de la colmna indican el nmero de caracteres. Por ejemplo, para almacenar un valor TINYTEXT necesita L caracteres + 1 byte. Desde MySQL 5.0.3, el motor NDBCLUSTER soporta slo columnas de longitud fija. Esto significa que una columna VARCHAR de una tabla en MySQL Cluster se comportar casi como si fuera de tipo CHAR (excepto que cada registro todava tiene un byte extra). Por ejemplo, en una tabla Cluster, cada registro en una columna declarada como VARCHAR(100) necesitar 101 bytes para almacenamiento, sin tener en cuenta la longitud de la columna almacenada en cualquier registro. Los tipos BLOB y TEXT requieren 1, 2, 3, o 4 bytes para almacenar la longitud de la columna, dependiendo de la longitud mxima posible del tipo. Consulte Seccin 11.4.3, Los tipos BLOB y TEXT. Las columnas TEXT y BLOB se implementan de forma distinta en el motor de almacenamiento NDB Cluster , donde cada registro en una columna TEXT se compone de dos partes separadas. Una de estas es de longitud fija (256 bytes), y se almacena realmente en la tabla original. La otra consiste de cualquier dato de ms de 256 bytes, que se almacena en una tabla oculta. Los registros en esta segunda tabla siempre tienen una longitud de 2,000 bytes . Esto significa que el tamao de una columna TEXT es 256 si size <= 256 (donde size representa el tamao del registro); de otro modo, el tamao es 256 + size + (2000 - (size - 256) % 2000).
552
El tamao de un objeto ENUM lo determina el nmero de diferentes valores de la enumeracin. Un byte se usa para enumeraciones de hasta 255 valores posibles. Dos bytes se usan para enumeraciones teniendo entre 256 y 65,535 valores posibles. Consulte Seccin 11.4.4, El tipo de columna ENUM. El tamao de un objeto SET se determina por el nmero de diferentes mienbros del conjunto. Si el tamao del conjunto es N, el objeto ocupa (N+7)/8 bytes, redondeado a 1, 2, 3, 4, o 8 bytes. Un SET puede tener como mximo 64 miembros. Consulte Seccin 11.4.5, El tipo SET.
553
El mapeo de tipos de columnas se realiza en tiempo de creacin de la tabla, tras el cual se descartan las especificaciones originales de tipos. Si crea una tabla con tipos usados por otros vendedores y luego realiza un comando DESCRIBE tbl_name, MySQL muestra la estructura de tabla usando los tipos MySQL equivalentes. Por ejemplo:
mysql> CREATE TABLE t (a BOOL, b FLOAT8, c LONG, d NUMERIC); Query OK, 0 rows affected (0.08 sec) mysql> DESCRIBE t; +-------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------+------+-----+---------+-------+ | a | tinyint(1) | YES | | NULL | | | b | double | YES | | NULL | | | c | mediumtext | YES | | NULL | | | d | decimal(10,0) | YES | | NULL | | +-------+---------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
554
555
Operadores
12.1. Operadores
12.1.1. Precedencias de los operadores
La precedencia de operadores se muestra en la siguiente lista, de menor a mayor precedencia. Los operadores que se muestran juntos en una lnea tienen la misma precedencia.
:= ||, OR, XOR &&, AND NOT BETWEEN, CASE, WHEN, THEN, ELSE =, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN | & <<, >> -, + *, /, DIV, %, MOD ^ - (resta unaria), ~ (inversin de bit unaria) ! BINARY, COLLATE
La precedencia mostrada para NOT es desde MySQL 5.0.2. En versiones anteriores, o desde 5.0.2 si el modo HIGH_NOT_PRECEDENCE est activo, la precedencia de NOT es la misma que la del operador ! . Consulte Seccin 5.3.2, El modo SQL del servidor.
12.1.2. Parntesis
( ... ) Use parntesis para forzar el orden de evaluacin en una expresin. Por ejemplo:
mysql> SELECT 1+2*3; -> 7 mysql> SELECT (1+2)*3; -> 9
556
Si ambos argumentos son enteros, se comparan como enteros. Los valores hexadecimales se tratan como cadenas binarias si no se comparan con un nmero. En todos los otros casos, los argumentos se comparan como nmeros con punto flotante (reales). Por defecto, la comparacin de cadenas no es sensible a maysculas y usa el conjunto de caracteres actual (ISO-8859-1 Latin1 por defecto, que siempre funciona bien para ingls). Par convertir un valor a un tipo especfico para una comparacin, puede usar la funcin CAST() . Los valores de cadenas de caracteres pueden convertirse a un conjunto de caracteres distinto usando CONVERT(). Consulte Seccin 12.8, Funciones y operadores de cast. Los siguientes ejemplos ilustran conversin de cadenas a nmeros para operaciones de comparacin:
mysql> SELECT -> 0 mysql> SELECT -> 1 mysql> SELECT -> 0 mysql> SELECT -> 1 1 > '6x'; 7 > '6x'; 0 > 'x6'; 0 = 'x6';
Tenga en cuanta que cuando compara una columna de cadenas de caracteres con un nmero, MySQL no puede usar el ndice de la columna para buscar rpidamente le valor. Si str_col es una columna de cadenas indexada, el ndice no puede usarse al realizar la bsqueda en el siguiente comando:
SELECT * FROM tbl_name WHERE str_col=1;
La razn es que hay diferentes cadenas que pueden convertirse al valor 1: '1', ' 1', '1a', ... = Igual:
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;
<=> NULL-safe equal. Este operador realiza una comparacin de igualdad como el operador =, pero retorna 1 en lugar de NULL si ambos operandos son NULL, y 0 en lugar de NULL si un operando es NULL.
mysql> SELECT -> 1, mysql> SELECT -> 1, 1 <=> 1, NULL <=> NULL, 1 <=> NULL; 1, 0 1 = 1, NULL = NULL, 1 = NULL; NULL, NULL
mysql> SELECT '.01' <> '0.01'; -> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 1
IS valor booleano, IS NOT valor booleano Comprueba si un valor contra un valor booleano, donde boolean_value puede ser TRUE, FALSE, o UNKNOWN.
mysql> SELECT -> 1, mysql> SELECT -> 1, 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; 1, 1 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN; 1, 0
558
-> 1, 1, 0
Para poder trabajar con programas ODBC, MySQL soporta las siguientes caractersticas extra al usar IS NULL: Puede encontrar el registro que contiene el valor AUTO_INCREMENT ms reciente realizando un comando de la siguiente forma inmediatamente tras generar el valor:
SELECT * FROM tbl_name WHERE auto_col IS NULL
Este comportamiento puede desactivarse asignando SQL_AUTO_IS_NULL=0. Consulte Seccin 13.5.3, Sintaxis de SET. Para columnas DATE y DATETIME que se declaran como NOT NULL, puede encontrar la fecha especial '0000-00-00' con un comando como este:
SELECT * FROM tbl_name WHERE date_column IS NULL
Esto es necesario para algunas aplicaciones ODBC, ya que ODBC no soporta un valor de fecha '0000-00-00' .
expr BETWEEN min AND max Si expr es mayor o igual que min y expr es menor o igual a max, BETWEEN retorna 1, de otro modo retorna 0. Esto es equivalente a la expresin (min <= expr AND expr <= max) si todos los argumentos son del mismo tipo. De otro modo la conversin de tipos tiene lugar segn las reglas descritas al principio de la seccin, pero aplicadas a todos los argumentos.
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';
expr NOT BETWEEN min AND max Esto es lo mismo que NOT (expr BETWEEN min AND max).
GREATEST(value1,value2,...) Con dos o ms argumentos, retorna el argumento mayor (con valor mayor). Los argumentos se comparan usando las mismas reglas que para LEAST().
mysql> SELECT GREATEST(2,0); -> 2 mysql> SELECT GREATEST(34.0,3.0,5.0,767.0);
559
expr IN (value,...) Retorna 1 si expr es uno de los valores en la lista IN , de lo contrario retorna 0. Si todos los valores son constantes, se evalan segn el tipo y ordenacin de expr . La bsqueda para el elemento se hace usando bsqueda binaria. Esto significa que IN es muy rpido si la lista IN consiste enteramente en constantes. Si expr es una expresin de cadenas de caracteres sensible a maysculas, la comparacin de cadenas se realiza sensible a maysculas.
mysql> SELECT 2 IN (0,3,5,'wefwf'); -> 0 mysql> SELECT 'wefwf' IN (0,3,5,'wefwf'); -> 1
El nmero de valores en la lista IN slo est limitado por el valor max_allowed_packet. En MySQL 5.0, para cumplir el estndar SQL IN retorna NULL no slo si la expresin de la parte izquierda es NULL, tambin si no encuentra coincidencias en la lista y una de las expresiones en la lista es NULL. La sintaxis de IN() puede usarse para escribir algunas subconsultas. Consulte Seccin 13.2.8.3, Subconsultas con ANY, IN y SOME.
Una comparacin de valores NULL usando = siempre es falsa. La funcin ISNULL() comparte algunos comportamientos especiales con el operador de comparacin IS NULL, consulte la descripcin de IS NULL en Seccin 12.1.3, Funciones y operadores de comparacin.
INTERVAL(N,N1,N2,N3,...) Retorna 0 if N < N1, 1 si N < N2 y as o -1 si N es NULL. Todos los argumentos se tratan como enteros. Esto requiere que N1 < N2 < N3 < ... < Nn para que la funcin funcione correctamente. Esto es porque se usa una bsqueda binaria (muy rpida).
mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); -> 3 mysql> SELECT INTERVAL(10, 1, 10, 100, 1000); -> 2 mysql> SELECT INTERVAL(22, 23, 30, 44, 200); -> 0
560
Operadores lgicos
LEAST(value1,value2,...) Con dos o ms argumentos, retorna el argumento menor (con un valor menor). Los argumentos se comparan usando las siguientes reglas: Si el valor retornado se usan en un contexto INTEGER o todos los argumentos son enteros, se comparan como enteros. Si el valor retornado se usa en un contexto REAL o todos los argumentos son reales, se comparan como reales. Si algn argumento es una cadena de caracteres sensible a maysculas, los argumentos se comparan como cadenas sensibles a maysculas. En cualquier otro caso, los argumentos se comparan como cadenas no sensibles a maysculas.
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'
Tenga en cuenta que las reglas de conversin precedentes pueden producir resultados extraos en algunos casos extremos:
mysql> SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED); -> -9223372036854775808
Esto ocurre porque MySQL lee 9223372036854775808.0 en un contexto entero. La representacin entera no es lo bastante buena para tratar el valor, as que lo cambia a entero con signo.
AND lgica. Se evala a 1 si todos los operandos son distintos a cero y no NULL, a 0 si uno o ms operandos son 0, de otro modo retorna NULL.
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;
OR, || OR lgica. Cuando ambos ooperandos son no NULL, el resultado es 1 si algn operando es diferente a cero, y 0 de otro modo. Con un operando NULL el resultado es 1 si el otro operando no es cero, y NULL de otro modo. Si ambos operandos son NULL, el resultado es NULL.
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 lgica. Retorna NULL si algn operando es NULL. Para operandos no NULL , evala a 1 si un nmero impar de operandos es distinto a cero, sino retorna 0.
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;
562
mysql> SELECT CASE BINARY 'B' -> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END; -> NULL
El tipo de retorno por defecto de una expresin CASE es el tipo agregado compatible de todos los valores de retorno, pero tambin depende del contexto en el que se usa. Si se usa en un entorno de cadenas de caracteres, el resultado se retorna como cadena de caracteres. Si se usa en un contexto numrico, el resultado se retorna como valor decimal, real o entero.
IF(expr1,expr2,expr3) Si expr1 es TRUE (expr1 <> 0 and expr1 <> NULL) entonces IF() retorna expr2; de otro modo retorna expr3. IF() retorna un valor numrico o cadena de caracteres, en funcin del contexto en que se usa.
mysql> SELECT IF(1>2,2,3); -> 3 mysql> SELECT IF(1<2,'yes','no'); -> 'yes' mysql> SELECT IF(STRCMP('test','test1'),'no','yes'); -> 'no'
Si slo una de expr2 o expr3 es explcitamente NULL, el tipo del resultado de la funcin IF() es el mismo tipo que la expresin no NULL . expr1 se evala como un valor entero, que significa que si esta testeando valores de punto flotante o cadenas de caracteres, debe hacerlo mediante operaciones de comparacin.
mysql> SELECT IF(0.1,1,0); -> 0 mysql> SELECT IF(0.1<>0,1,0); -> 1
En el primer caso mostrado, IF(0.1) retorna 0 ya que 0.1 se convierte a un valor entero, resultando en un test de IF(0). Puede que esto no ea lo que espera. En el segundo caso, la comparacin testea el valor de coma flotante para comprobar que no es cero. El resultado de la comparacin se usa como entero. El tipo de retorno de IF() (que puede ocurrir cuando se almacena en una tabla temporal) se calcula como sigue: Expresin expr2 o expr3 retorna una cadena expr2 o expr3 retorna un valor de coma flotante expr2 o expr3 retorna un entero Valor Retornado cadena de caracteres coma flotante entero
Si expr2 y expr3 son cadenas de caracteres, el resultado es sensible a maysculas si alguna de las cadenas lo es.
IFNULL(expr1,expr2) Si expr1 no es NULL, IFNULL() retorna expr1, de otro modo retorna expr2. IFNULL() retorna un valor numrico o de cadena de caracteres, en funcin del contexto en que se usa.
mysql> SELECT IFNULL(1,0); -> 1 mysql> SELECT IFNULL(NULL,10); -> 10 mysql> SELECT IFNULL(1/0,10);
563
El valor por defecto de retorno de IFNULL(expr1,expr2) es el ms general de las dos expresiones, en el orden STRING, REAL, o INTEGER. Considere el caso de una tabla basada en expresiones o donde MySQL debe almacenar internamente un valor retornado por IFNULL() en una tabla temporal:
mysql> CREATE TABLE tmp SELECT IFNULL(1,'test') AS test; mysql> DESCRIBE tmp; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | test | varbinary(4) | NO | | | | +-------+--------------+------+-----+---------+-------+
NULLIF(expr1,expr2) Retorna NULL si expr1 = expr2 es cierto, de otro modo retorna expr1. Es lo mismo que CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END.
mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1
Tenga en cuenta que MySQL evala expr1 dos veces si los argumentos no son iguales.
BIN(N) Retorna una representacin de cadena de caracteres del valor binario de N, donde N es un nmero muy largo (BIGINT) . Esto es equivalente a CONV(N,10,2). Retorna NULL si N es NULL.
mysql> SELECT BIN(12); -> '1100'
564
CHAR(N,...) CHAR() interpreta los argumentos como enteros y retorna la cadena de caracteres que consiste en los caracteres dados por los cdigos de tales enteros. Los valores NULL no se tienen en cuenta.
mysql> SELECT CHAR(77,121,83,81,'76'); -> 'MySQL' mysql> SELECT CHAR(77,77.3,'77.3'); -> 'MMM'
CHAR_LENGTH(str) Retorna la longitud de la cadena de caracteres str, medida en caracteres. Un carcter de mltiples bytes cuenta como un slo carcter. Esto significa que para una cadena de caracteres que contiene cinco caracteres de dos bytes, LENGTH() retorna 10, mientras CHAR_LENGTH() returna 5.
COMPRESS(string_to_compress) Comprime una cadena de caracteres. Esta funcin necesita que MySQL se compile con una biblioteca de compresin como zlib. De otro modo, el valor retornado siempre es NULL. La cadena comprimida puede descomprimirse con UNCOMPRESS().
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)));
Los contenidos comprimidos se almacenan de la siguiente forma: Cadenas vacas se almacenan como cadenas vacas. Cadenas no vacas se almacenan como longitud de cuatros bytes de la cadena descomprimida (los bytes ms bajos primero), seguido de la cadena comprimida. Si la cadena acaba con un espacio, se aade un carcter '.' para evitar problemas con eliminacin de espacios finales al almacenar en una columna CHAR o VARCHAR . (El uso de CHAR o VARCHAR para almacenar cadenas comprimidas no se recomienda. Es mejor usar una columna BLOB .)
565
CONCAT(str1,str2,...) Retorna la cadena resultado de concatenar los argumentos. Retorna NULL si algna argumento es NULL. Puede tener uno o ms argumentos. Si todos los argumentos son cadenas no binarias, el resultado es una cadena no binaria. Si los argumentos incluyen cualquier cadena binaria, el resultado es una cadena binaria. Un argumento numrico se convierte a su forma de cadena binaria equivalente; si quiere evitarlo puede usar conversin de tipos explcita, como en este ejemplo: SELECT CONCAT(CAST(int_col AS CHAR), char_col)
mysql> SELECT CONCAT('My', 'S', 'QL'); -> 'MySQL' mysql> SELECT CONCAT('My', NULL, 'QL'); -> NULL mysql> SELECT CONCAT(14.3); -> '14.3'
CONCAT_WS(separator,str1,str2,...) CONCAT_WS() significa CONCAT With Separator (CONCAT con separador) y es una forma especial de CONCAT(). El primer argumento es el separador para el resto de argumentos. El separador se aade entre las cadenas a concatenar. El separador puede ser una cadena como el resto de argumentos. Si el separador es NULL, el resultado es NULL. La funcin evita valores NULL tras el argumento separador.
mysql> SELECT CONCAT_WS(',','First name','Second name','Last Name'); -> 'First name,Second name,Last Name' mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name'); -> 'First name,Last Name'
En MySQL 5.0, CONCAT_WS() no evita cadenas vacas. (Sin embargo, evita NULLs.)
CONV(N,from_base,to_base) Convierte nmeros entre diferentes bases numricas. Retorna una representacin de cadena de carcters para el nmero N, convertido de base from_base a base to_base. Retorna NULL si algn argumento es NULL. El argumento N se interpreta como entero, pero puede especificarse como un entero o cadena. La base mnima es 2 y la mxima es 36. Su to_base es un nmero negativo, N se trata como un nmero con signo. De otro modo, N se trata como sin signo. CONV() funciona con precisin de 64-bit.
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,...) Retorna str1 si N = 1, str2 if N = 2, y as. Retorna NULL si N es menor que 1 o mayor que el nmero de argumentos. ELT() es el complemento de FIELD().
mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo'); -> 'ej' mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo'); -> 'foo'
566
EXPORT_SET(bits,on,off[,separator[,number_of_bits]]) Retorna una cadena en que para cada bit del valor bits, puede obtener una cadena on y para cada bit reasignado obtiene una cadena off . Los bits en bits se examinan de derecha a izquierda (de bits menores a mayores). Las cadenas se aaden al resultado de izquierda a derecha, separados por la cadena separator (siendo el carcter por defecto la coma ','). El nmero de bits examinados se obtiene por number_of_bits (por defecto 64).
mysql> SELECT EXPORT_SET(5,'Y','N',',',4); -> 'Y,N,Y,N' mysql> SELECT EXPORT_SET(6,'1','0',',',10); -> '0,1,1,0,0,0,0,0,0,0'
FIELD(str,str1,str2,str3,...) Retorna el ndice de str en la lista str1, str2, str3, ... . Retorna 0 si no se encuentra str. Si todos los argumentos de FIELD() son cadenas, todos los argumentos se comparan como cadenas. Si todos los argumentos son nmeros, se comparan como nmeros. De otro modo, los argumentos se comparan como nmeros con doble precisin. Si str es NULL, el valor retornado es 0 porque NULL falla en comparaciones de comparacin con cualquier valor. FIELD() es el complemento de 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) Retorna un valor en el rango de 1 a N si la cadena str est en la lista de cadenas strlist consistente de N subcadenas. Una lista de cadenas es una cadena compuesta de subcadenas separadas por caracteres ',' . Si el primer argumento es una cadena constante y el segundo es una columna de tipo SET, la funcin FIND_IN_SET() est optimizada para usar aritmtica de bit. Retorna 0 si str no est en strlist o si strlist es la cadena vaca. Retorna NULL si algn argumento es NULL. Esta funcin no funciona apropiadamente si el primer argumento contiene un carcter de coma (',') .
mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2
HEX(N_or_S) Si N_OR_S es un nmero, retorna una cadena representacin del valor hexadecimal de N, donde N es un nmero muy grande (BIGINT) . Esto es equivalente a CONV(N,10,16). Si N_OR_S es una cadena, esta funcin retorna una cadena hexadecimal de N_OR_S caracteres, donde cada carcter en N_OR_S se convierte a dos dgitos hexadecimales.
mysql> SELECT HEX(255); -> 'FF' mysql> SELECT 0x616263; -> 'abc' mysql> SELECT HEX('abc'); -> 616263
567
INSERT(str,pos,len,newstr) Retorna la cadena str, con la subcadena comenzando en la posicin pos y len caracteres reemplazados por la cadena newstr. Retorna la cadena original si pos no est entre la longitud de la cadena. Replaza el resto de la cadena a partir de la posicin pos si len no est dentro de la longitud del resto de la cadena. Retorna NULL si cualquier argumento es nulo.
mysql> SELECT INSERT('Quadratic', 3, 4, 'What'); -> 'QuWhattic' mysql> SELECT INSERT('Quadratic', -1, 4, 'What'); -> 'Quadratic' mysql> SELECT INSERT('Quadratic', 3, 100, 'What'); -> 'QuWhat'
INSTR(str,substr) Retorna la posicin de la primera ocurrencia de la subcadena substr en la cadena str. Es lo mismo que la forma de dos argumentos de LOCATE(), excepto que el orden de los argumentos es inverso.
mysql> SELECT INSTR('foobarbar', 'bar'); -> 4 mysql> SELECT INSTR('xbar', 'foobar'); -> 0
Esta funcin puede trabajar con mltiples bytes. En MySQL 5.0, slo es sensible a maysculas si uno de los argumentos es una cadena binaria.
LEFT(str,len) Retorna los len caracteres empezando por la izquierda de la cadena str.
mysql> SELECT LEFT('foobarbar', 5); -> 'fooba'
LENGTH(str) Retorna la longitud de la cadena str, medida en bytes.Un carcter multi-byte cuenta como mltiples bytes. Esto significa que para cadenas que contengan cinco caracteres de dos bytes, LENGTH() retorna 10, mientras que CHAR_LENGTH() retorna 5.
mysql> SELECT LENGTH('text'); -> 4
LOAD_FILE(file_name) 568
Lee el fichero y retorna el contenido como cadena de caracteres. El fichero debe estar localizado en el servidor, debe especificar la ruta completa al fichero, y debe tener el privilegio FILE . El fichero debe ser legible por todo el mundo y su tamao menor a max_allowed_packet bytes. Si el fichero no existe o no puede ser ledo debido a que una de las anteriores condiciones no se cumple, la funcin retorna NULL.
mysql> UPDATE tbl_name SET blob_column=LOAD_FILE('/tmp/picture') WHERE id=1;
LOCATE(substr,str) , LOCATE(substr,str,pos) La primera sintaxis retorna la posicin de la primera ocurrencia de la subcadena substr en la cadena str. La segunda sintaxis retorna la posicin de la primera ocurrencia de la subcadena substr en la cadena str, comanzando en la posicin pos. Retorna 0 si substr no est en str.
mysql> SELECT LOCATE('bar', 'foobarbar'); -> 4 mysql> SELECT LOCATE('xbar', 'foobar'); -> 0 mysql> SELECT LOCATE('bar', 'foobarbar',5); -> 7
Esta funcin trabaja con mltiples bytes. En MySQL 5.0, es sensible a maysculas slo si algn argumento es una cadena binaria.
LOWER(str) Retorna la cadena str con todos los caracteres cambiados a minsculas segn el mapeo del conjunto de caracteres actual (por defecto es ISO-8859-1 Latin1).
mysql> SELECT LOWER('QUADRATICALLY'); -> 'quadratically'
LPAD(str,len,padstr) Retorna la cadena str, alineado a la izquierda con la cadena padstr a una longitud de len caracteres. Si str es mayor que len, el valor retornado se acorta a len caracteres.
mysql> SELECT LPAD('hi',4,'??'); -> '??hi' mysql> SELECT LPAD('hi',1,'??'); -> 'h'
LTRIM(str) Retorna la cadena str con los caracteres en blanco iniciales eliminados.
mysql> SELECT LTRIM(' -> 'barbar' barbar');
569
MAKE_SET(bits,str1,str2,...) Retorna un conjunto de valores (una cadena conteniendo subcadenas separadas por caracteres ',' ) consistiendo en cadenas que tienen el bit correspondiente en bits asignado. str1 se corresponde al bit 0, str2 al bit 1, y as. Los valores NULL en str1, str2, ... no se aaden al resultado.
mysql> SELECT MAKE_SET(1,'a','b','c'); -> 'a' mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world'); -> 'hello,world' mysql> SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world'); -> 'hello' mysql> SELECT MAKE_SET(0,'a','b','c'); -> ''
OCT(N) Retorna una representacin en cadena del valor octal de N, donde N es un nmero largo (BIGINT). Es equivalente a CONV(N,10,8). Retorna NULL si N es NULL.
mysql> SELECT OCT(12); -> '14'
ORD(str) Si el carcter ms a la izquierda de la cadena str es un carcter multi-byte , retorna el cdigo de ese carcter, calculado a partir del valor numrico de sus bytes usando esta frmula:
(1st byte code) + (2nd byte code * 256) + (3rd byte code * 256^2) ...
Si el carctar ms a la izquierda no es multi-byte , ORD() retorna el mismo valor que la funcin ASCII() .
mysql> SELECT ORD('2'); -> 50
QUOTE(str) Acota una cadena para producir un resultado que puede usarse como un valor con caracteres de escape en un comando SQL. La cadena se retorna rodeado por comillas sencillas y con cada
570
instancia de comilla sencilla ('''), antibarra ('\'), ASCII NUL, y Control-Z predecidos por una antibarra. Si el argumento es NULL, el valor de retorno es la palabra NULL sin comillas alrededor.
mysql> SELECT QUOTE('Don\'t!'); -> 'Don\'t!' mysql> SELECT QUOTE(NULL); -> NULL
REPEAT(str,count) Retorna una cadena consistente de la cadena str repetida count veces. Si count <= 0, retorna una cadena vaca. Retorna NULL si str o count son NULL.
mysql> SELECT REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL'
REPLACE(str,from_str,to_str) Retorna la cadena str con todas las ocurrencias de la cadena from_str reemplazadas con la cadena to_str.
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww'); -> 'WwWwWw.mysql.com'
RPAD(str,len,padstr) Retorna la cadena str, alineada a la derecha con la cadena padstr con una longitud de len caracteres. Si str es mayor que len, el valor de retorno se corta a len caracteres.
mysql> SELECT RPAD('hi',5,'?'); -> 'hi???' mysql> SELECT RPAD('hi',1,'?'); -> 'h'
SOUNDEX(str) Retorna una cadena soudex de str. Dos cadenas que suenen igual deben tener cadenas soundex idnticas. Una cadena soundex estndar tiene cuatro caracteres de longitud, pero la funcin SOUNDEX() retorna una cadena arbitrriamente larga. Puede usar SUBSTRING() en el resultado para obtener una cadena soundex estndar. Todos los caracteres no alfabticos en str se ignoran. Todos los caracteres alfabticos internacionales fuera del rango A-Z se tratan como vocales.
mysql> SELECT SOUNDEX('Hello'); -> 'H400' mysql> SELECT SOUNDEX('Quadratically'); -> 'Q36324'
Nota: Esta funcin implementa el algoritmo Soundex original, no la versin ms popular (descrita por D. Hnuth). La diferencia es que la versin original descarta vocales primero y luego duplicados, mientras que la versin mejorada descarta primero los duplicados y luego las vocales.
SUBSTRING(str,pos) , SUBSTRING(str FROM pos), SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len) Las formas sin el arguemnto len retornan una subcadena de la cadena str comenzando en la posicin pos. Las formas con el argumento len retornan una subcadena de longitud len a partir de la cadena str, comenzando en la posicin pos.Las formas que usan FROM son sintaxis SQL estndard. En MySQL 5.0, es posible usar valores negativos para pos. En este caso, el inicio de la subcadena son pos caracteres a partir del final de la cadena, en lugar del principio. Un valor negativo puede usarse para pos en cualquier de las formas de esta funcin.
mysql> SELECT SUBSTRING('Quadratically',5); -> 'ratically' mysql> SELECT SUBSTRING('foobarbar' FROM 4); -> 'barbar' mysql> SELECT SUBSTRING('Quadratically',5,6); -> 'ratica' mysql> SELECT SUBSTRING('Sakila', -3);
572
-> 'ila' mysql> SELECT SUBSTRING('Sakila', -5, 3); -> 'aki' mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2); -> 'ki'
Esta funcin trabaja con mltiples bytes. Tenga en cuenta que si usa un valor menor a 1 para len, el resultado siempre es una cadena vaca. SUBSTR() es sinnimo de SUBSTRING().
SUBSTRING_INDEX(str,delim,count) Retorna la subcadena de la cadena str antes de count ocurrencias del delimitador delim. Si count es positivo, todo a la izquierda del delimitador final (contando desde la izquierda) se retorna. Si count es negativo, todo a la derecha del delimitador final (contando desde la derecha) se retorna.
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); -> 'www.mysql' mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2); -> 'mysql.com'
TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str), TRIM(remstr FROM] str) Retorna la cadena str con todos los prefijos y/o sufijos remstr eliminados. Si ninguno de los especificadores BOTH, LEADING, o se daTRAILING, BOTH se asumen. Si remstr es opcional y no se especifica, los espacios se eliminan.
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'
UNCOMPRESS(string_to_uncompress) Descomprime una cadena comprimida con la funcin COMPRESS() . Si el argumento no es un valor comprimido, el resultado es NULL. Esta funcin necesita que MySQL se compile con una biblioteca de compresin tal como zlib. De otro modo, el valor de retorno siempre es NULL.
mysql> SELECT UNCOMPRESS(COMPRESS('any string')); -> 'any string' mysql> SELECT UNCOMPRESS('any string'); -> NULL
573
UNHEX(str) Realiza la operacin opuesta a HEX(str). Esto es, interpreta cada par de dgitos hexadecimales en el argumento como nmeros y los convierte al carcter representado por el nmero. El caracteres resultantes se retornan como cadena binaria.
mysql> SELECT UNHEX('4D7953514C'); -> 'MySQL' mysql> SELECT 0x4D7953514C; -> 'MySQL' mysql> SELECT UNHEX(HEX('string')); -> 'string' mysql> SELECT HEX(UNHEX('1267')); -> '1267'
UPPER(str) Retorna la cadena str con todos los caracteres cambiados a maysculas segn el mapeo del conjunto de caracteres actual (por defecto es ISO-8859-1 Latin1).
mysql> SELECT UPPER('Hej'); -> 'HEJ'
Si una funcin de cadenas da una cadena binaria como argumento, la cadena resultante tambin es binaria. Un nmero convertido a cadena se trata como cadena binaria (esto es, es sensible a maysculas en comparaciones). Esto afecta slo a comparaciones. Normalmente, si una expresin en una comparacin de cadenas es sensible a maysculas, la comparacin se realiza con sensibilidad a maysculas. expr LIKE pat [ESCAPE 'escape-char'] Coincidencia de patrones usando comparacin mediante expresiones regulares SQL. Retorna 1 (TRUE) o 0 (FALSE). Si expr o pat es NULL, el resultado es NULL. 574
El patrn no puede ser una cadena literal. Por ejemplo, puede especificarse como expresin de cadena o columna. Con LIKE puede usar los siguientes dos caracteres comodn en el patrn: Carcter % _ Descricin Coincidencia de cualquier nmero de caracteres, incluso cero caracteres Coincide exactemente un carcter
mysql> SELECT 'David!' LIKE 'David_'; -> 1 mysql> SELECT 'David!' LIKE '%D%v%'; -> 1
Para testear instancias literales de un carcter comodn, preceda el carcter con el carcter de escape. Si no especifica el carcter ESCAPE , se asume '\' . Cadena \% \_ Descricin Coincide un carcter '%' Coincide un carcter '_'
mysql> SELECT 'David!' LIKE 'David\_'; -> 0 mysql> SELECT 'David_' LIKE 'David\_'; -> 1
Los siguientes dos comandos ilustran que la comparacin de cadenas no son sensibles a maysculas a no ser que uno de los operandos sea una cadena binaria:
mysql> SELECT 'abc' LIKE 'ABC'; -> 1 mysql> SELECT 'abc' LIKE BINARY 'ABC'; -> 0
En MySQL, LIKE se permite en expresiones numricas. (Esta es una extensin del SQL estndar LIKE.)
mysql> SELECT 10 LIKE '1%'; -> 1
Nota: Debido a que MySQL usa sintaxis de escape C en cadenas (por ejemplo, '\n' para representar carcter de nueva lnea), debe doblar cualquier '\' que use en cadenas LIKE . Por ejemplo, para buscar '\n', especifquelo como '\\n'. Para buscar '\', especifquelo como '\\\\'; esto es debido a que las antibarras se eliminan una vez por el parser y otra vez cuando la coincidencia con el patrn se realiza, dejando una nica antibarra para comparar.
expr NOT LIKE pat [ESCAPE 'escape-char'] Es lo mismo que NOT (expr LIKE pat [ESCAPE 'escape-char']).
Funciones numricas
expr REGEXP pat, expr RLIKE pat Realiza una comparacin de patrones de una expresin de cadena de caracteres expr contra un patrn pat. El patrn puede ser una expresin regular extendida. La sintaxis para expresiones regulares se discute en Apndice F, Expresiones regulares en MySQL. Retorna 1 si expr coincide con pat, de otro modo retorna 0. Si expr o pat es NULL, el resultado es NULL. RLIKE es un sinnimo de REGEXP, debido a compatibilidad con mSQL. El patrn no necesita ser una cadena literal. Por ejemplo, puede especificarse como una expresin de cadena o columna. Nota: Debido a que MySQL usa la sintaxis de escape de C en cadenas (por ejemplo, '\n' para representar una nueva lnea), de doblar cualquier '\' que use en sus cadenas REGEXP . REGEXP no es sensible a maysculas, excepto cuando se usa con cadenas binarias.
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]';
REGEXP y RLIKE usan el conjunto de caracteres actual (ISO-8859-1 Latin1 por defecto) al decidir el tipo de un carcter. Atencin: Estos operadores no pueden trabajar con mltiples bytes.
STRCMP(expr1,expr2) STRCMP() retorna 0 si las cadenas son idnticas, -1 si el primer argumento es menor que el segundo segn el orden actual, y 1 en cualquier otro caso.
mysql> SELECT STRCMP('text', 'text2'); -> -1 mysql> SELECT STRCMP('text2', 'text'); -> 1 mysql> SELECT STRCMP('text', 'text'); -> 0
En MySQL 5.0, STRCMP() usa el conjunto de caracteres actual cuando realizac comparaciones. Esto hace el comportamiento de comparaciones por defecto insensible a maysculas a no ser que alguno de los operandos sea una cadena binaria.
Operadores aritmticos
Suma:
mysql> SELECT 3+5; -> 8
Resta:
mysql> SELECT 3-5; -> -2
Nota: Si este operador se usa con BIGINT, el valor de retorno es tambin BIGINT. Esto significa que debe eliminar usar - con enteros que pueden ser iguales o menores a -2^63.
* Multiplicacin:
mysql> SELECT 3*5; -> 15 mysql> SELECT 18014398509481984*18014398509481984.0; -> 324518553658426726783156020576256.0 mysql> SELECT 18014398509481984*18014398509481984; -> 0
El resultado de la ltima expresin es incorrecto ya que el resultado de la multiplicacin entera excede el rango de 64-bit de clculos BIGINT. (Consulte Seccin 11.2, Tipos numricos.)
/ Divisin:
mysql> SELECT 3/5; -> 0.60
Una divisin se calcula con aritmtica BIGINT slo en un contexto donde el resultado se convierte a entero.
DIV Divisin entera. Similar aFLOOR() pero funciona con valores BIGINT. 577
Funciones matemticas
ACOS(X) Retorna el arcocoseno de X, esto es, el valor cuyo coseno es X. Retorna NULL si X no est en el rango -1 a 1.
mysql> SELECT ACOS(1); -> 0 mysql> SELECT ACOS(1.0001); -> NULL mysql> SELECT ACOS(0); -> 1.5707963267949
ASIN(X) Retorna el arcoseno de X, esto es, el valor cuyo seno es X. Retorna NULL si X no est en el rango de -1 a 1.
mysql> SELECT ASIN(0.2); -> 0.20135792079033 mysql> SELECT ASIN('foo'); -> 0
ATAN(Y,X) , ATAN2(Y,X) Retorna la arcotangente de las variables X y Y. Es similar a calcular la arcotangente de Y / X, excepto que los signos de ambos argumentos se usan para determinar el cuadrante del resultado.
mysql> SELECT ATAN(-2,2); -> -0.78539816339745 mysql> SELECT ATAN2(PI(),0); -> 1.5707963267949
578
Funciones matemticas
Estas dos funciones son sinnimos. Tenga en cuenta que el valor retornado se convierte a BIGINT.
CRC32(expr) Computa un valor de redundancia cclica y retorna el valor sin signo de 32 bits. El resultado es NULL si el argumento es NULL. Se espera que el argumento sea una cadena y (si es posible) se trata como una si no lo es.
mysql> SELECT CRC32('MySQL'); -> 3259397556 mysql> SELECT CRC32('mysql'); -> 2501908538
579
Funciones matemticas
-> 0.13533528323661
LOG(X), LOG(B,X) Si se llama con un parmetro, esta funcin retorna el logaritmo natural de X.
mysql> SELECT LOG(2); -> 0.69314718055995 mysql> SELECT LOG(-2); -> NULL
Si se llama con dos parmetros, esta funcin retorna el logaritmo de X para una base arbitrria B.
mysql> SELECT LOG(2,65536); -> 16 mysql> SELECT LOG(10,100); -> 2
LOG2() es til para encontrar cuntos bits necesita un nmero para almacenamiento. Esta funcin es equivalente a la expresin LOG(X) / LOG(2).
580
Funciones matemticas
mysql> SELECT LOG10(2); -> 0.30102999566398 mysql> SELECT LOG10(100); -> 2 mysql> SELECT LOG10(-100); -> NULL
Esta funcin puede usar valores BIGINT. MOD() tambin funciona con valores con una parte fraccional y retorna el resto exacto tras la divisin:
mysql> SELECT MOD(34.5,3); -> 1.5
PI() Retorna el valor de (pi). El nmero de decimales que se muestra por defecto es siete, pero MySQL usa internamente el valor de doble precisin entero.
mysql> SELECT PI(); -> 3.141593 mysql> SELECT PI()+0.000000000000000000; -> 3.141592653589793116
RADIANS(X) Retorna el argumento X, convertido de grados a radianes. (Tenga en cuenta que radianes son 180 grados.)
mysql> SELECT RADIANS(90); -> 1.5707963267949
581
Funciones matemticas
RAND(), RAND(N) Retorna un valor aleatorio en coma flotante del rango de 0 a 1.0. Si se especifica un argumento entero N, es usa como semilla, que produce una secuencia repetible.
mysql> SELECT RAND(); -> 0.9233482386203 mysql> SELECT RAND(20); -> 0.15888261251047 mysql> SELECT RAND(); -> 0.63553050033332 mysql> SELECT RAND(); -> 0.70100469486881 mysql> SELECT RAND(20); -> 0.15888261251047
Puede usar esta funcin para recibir registros de forma aleatoria como se muestra aqu:
mysql> SELECT * FROM tbl_name ORDER BY RAND();
ORDER BY RAND() combinado con LIMIT es til para seleccionar una muestra aleatoria de una conjunto de registros:
mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d -> ORDER BY RAND() LIMIT 1000;
Tenga en cuenta que RAND() en una clusula WHERE se re-evala cada vez que se ejecuta el WHERE. RAND() no pretende ser un generador de nmeros aleatorios perfecto, pero es una forma rpida de generar nmeros aleatorios ad hoc portable entre plataformas para la misma versin de MySQL.
ROUND(X), ROUND(X,D) Retorna el argumento X, redondeado al entero ms cercano. Con dos argumentos, retorna X redondeado a D decimales. D puede ser negativo para redondear D dgitos a la izquierda del punto decimal del valor X.
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
El tipo de retorno es el mismo tipo que el del primer argumento (asumiendo que sea un entero, doble o decimal). Esto significa que para un argumento entero, el resultado es un entero (sin decimales). Antes de MySQL 5.0.3, el comportamiento de ROUND() cuando el argumento se encuentra a medias entre dos enteros depende de la implementacin de la biblioteca C. Implementaciones distintas redondean al nmero par ms prximo, siempre arriba, siempre abajo, o siempre hacia cero. Si necesita un tipo de redondeo, debe usar una funcin bien definida como TRUNCATE() o FLOOR() en su lugar. Desde MySQL 5.0.3, ROUND() usa la biblioteca de matemtica precisa para valores exactos cuando el primer argumento es un valor con decimales: 582
Funciones matemticas
Para nmeros exactos, ROUND() usa la regla de "redondea la mitad hacia arriba": Un valor con una parte fracional de .5 o mayor se redondea arriba al siguiente entero si es positivo o hacia abajo si el siguiente entero es negativo. (En otras palabras, se redondea en direccin contraria al cero.) Un valor con una parte fraccional menor a .5 se redondea hacia abajo al siguiente entero si es positivo o hacia arriba si el siguiente entero es negativo. Para nmeros aproximados, el resultado depende de la biblioteca C. En muchos sistemas, esto significa que ROUND() usa la regla de "redondeo al nmero par ms cercano": Un valor con una parte fraccional se redondea al entero ms cercano. El siguiente ejemplo muestra cmo el redondeo difiere para valores exactos y aproximados:
mysql> SELECT ROUND(2.5), ROUND(25E-1); +------------+--------------+ | ROUND(2.5) | ROUND(25E-1) | +------------+--------------+ | 3 | 2 | +------------+--------------+
SIGN(X) Retorna el signo del argumento como -1, 0, o 1, en funcin de si X es negativo, cero o positivo.
mysql> SELECT SIGN(-32); -> -1 mysql> SELECT SIGN(0); -> 0 mysql> SELECT SIGN(234); -> 1
583
TRUNCATE(X,D) Retorna el nmero X, truncado a D decimales. Si D es 0, el resultado no tiene punto decimal o parte fraccional. D puede ser negativo para truncar (hacer cero) D dgitos a la izquierda del punto decimal del valor X.
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 mysql> SELECT TRUNCATE(122,-2); -> 100
Tenga en cuenta que la consulta tambin selecciona registros con fechas futuras. Las funciones que esperan valores de fecha usualmente aceptan valores de fecha y hora e ignoran la parte de hora. Las funciones que esperan valores de hora usualmente aceptan valores de fecha y hora e ignoran la parte de fecha. Las funciones que retornan la fecha u hora actuales se evalan slo una vez por consulta al principio de la ejecucin de consulta. Esto significa que las referencias mltiples a una funcin tales como NOW() en una misma consulta siempre producen el mismo resultado. Este principio tambin se aplica a CURDATE(), CURTIME(), UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP(), y a cualquiera de sus sinnimos. En MySQL 5.0, las funciones CURRENT_TIMESTAMP(), CURRENT_TIME(), CURRENT_DATE(), y FROM_UNIXTIME() retornan valores en la zona horaria de la conexin, que est disponible como valor de la variable de sistema time_zone . Adems, UNIX_TIMESTAMP() asume que su argumento es un valor de fecha y hora en la zona horaria actual. Consulte Seccin 5.9.8, Soporte de zonas horarias en el servidor MySQL. Los rango de retorno en las siguientes descripciones de funciones se aplican en fechas completas. Si la fecha es un valor cero o una fecha incompleta como '2001-11-00', las funciones que extraen una parte de la fecha pueden retornar 0. Por ejemplo DAYOFMONTH('2001-11-00') retorna 0. ADDDATE(date,INTERVAL expr type), ADDDATE(expr,days) Cuando se invoca con la forma INTERVAL del segundo argumento, ADDDATE() es sinnimo de DATE_ADD(). La funcin relacionada SUBDATE() es sinnimo de DATE_SUB(). Para informacin del argumento INTERVAL , consulte la discusin de DATE_ADD().
mysql> SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY);
584
Si el argumento days es simplemente un valor entero, entonces MySQL 5.0 lo trata como el nmero de das a aadir a expr.
mysql> SELECT ADDDATE('1998-01-02', 31); -> '1998-02-02'
ADDTIME(expr,expr2) ADDTIME() aade expr2 a expr y retorna el resultado. expr es una expresin de fecha u hora y fecha, y expr2 es una expresin temporal.
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'
CONVERT_TZ(dt,from_tz,to_tz) CONVERT_TZ() convierte un valor datetime dt de la zona horaria dada por from_tz a la zona horaria dada por to_tz y retorna el valor resultante. Las zonas horarias pueden especificarse como se describe en Seccin 5.9.8, Soporte de zonas horarias en el servidor MySQL. Esta funcin retorna NULL si los argumentos son invlidos. Si el valor se sale del rango soportado por el tipo TIMESTAMP al convertirse de from_tz a UTC, no se realiza ninguna conversin. El rango TIMESTAMP se describe en Seccin 11.1.2, Panormica de tipos de fechas y hora.
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); -> '2004-01-01 13:00:00' mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00'); -> '2004-01-01 22:00:00'
Nota: Para usar zonas horarias con nombres tales como 'MET' o 'Europe/Moscow', las tabas de zona horaria deben estar actualizadas correctamente. Consulte Seccin 5.9.8, Soporte de zonas horarias en el servidor MySQL para instrucciones.
CURDATE() Retorna la fecha horaria como valor en formato 'YYYY-MM-DD' o YYYYMMDD, dependiendo de si la fucnin se usa en un contexto numrico o de cadena de caracteres.
mysql> SELECT CURDATE(); -> '1997-12-15' mysql> SELECT CURDATE() + 0; -> 19971215
CURTIME()
585
Retorna la hora actual como valor en formato 'HH:MM:SS' o HHMMSS dependiendo de si la fucnin se usa en un contexto numrico o de cadena de caracteres.
mysql> SELECT CURTIME(); -> '23:50:26' mysql> SELECT CURTIME() + 0; -> 235026
DATEDIFF(expr,expr2) DATEDIFF() retorna el nmero de das entre la fecha inicial expr y la fecha final expr2. expr y expr2 son expresiones de fecha o de fecha y hora. Slo las partes de fecha de los valores se usan en los clculos.
mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30'); -> 1 mysql> SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31'); -> -31
DATE_ADD(date,INTERVAL expr type), DATE_SUB(date,INTERVAL expr type) Estas funciones realizan operaciones aritmticas de fechas. date es un valor DATETIME o DATE especificando la fecha de inicio. expr es una expresin que especifica el intervalo a aadir o borrar de la fecha de inicio. expr es una cadena; puede comenzar con un '-' para intervalos negativos. type es una palabra clave que indica cmo debe interpretarse la expresin. La palabra clave INTERVAL y el especificador type no son sensibles a maysculas. La siguiente tabla muestra cmo se relacionan los argumentos type y expr : type Value MICROSECOND SECOND MINUTE HOUR DAY Expected expr Format MICROSECONDS SECONDS MINUTES HOURS DAYS
586
WEEK MONTH QUARTER YEAR SECOND_MICROSECOND MINUTE_MICROSECOND MINUTE_SECOND HOUR_MICROSECOND HOUR_SECOND HOUR_MINUTE DAY_MICROSECOND DAY_SECOND DAY_MINUTE DAY_HOUR YEAR_MONTH
WEEKS MONTHS QUARTERS YEARS 'SECONDS.MICROSECONDS' 'MINUTES.MICROSECONDS' 'MINUTES:SECONDS' 'HOURS.MICROSECONDS' 'HOURS:MINUTES:SECONDS' 'HOURS:MINUTES' 'DAYS.MICROSECONDS' 'DAYS HOURS:MINUTES:SECONDS' 'DAYS HOURS:MINUTES' 'DAYS HOURS' 'YEARS-MONTHS'
Los valores QUARTER y WEEK estn disponibles a partir de MySQL 5.0.0. MySQL permite cualquier delimitador en el formato expr . Los mostrados en la tabla son sugerencias. Si el argumento date es un valora DATE y sus clculos involucarn slo partes YEAR, MONTH, y DAY (esto es, sin partes de hora), el resultado es un valor DATE . De otro modo, el resultado es un valor DATETIME . INTERVAL expr type se permite en cualquier lado del operador + si la expresin en el otro lado es una fecha o fecha y hora. Para el operador - , INTERVAL expr type se permite slo en la parte derecha, ya que no tiene sentido restar una fecha de un intervalo. (Consulte los ejemplos a continuacin.)
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 especifica un intervalo demasiado pequeo (no incluye todas las partes de intervalo que se esperaran de la palabra clave type ), MySQL asume que ha dejado la parte ms a la izquierda del valor del intervalo. Por ejemplo, si especifica un type de DAY_SECOND, se espera que el valor 587
de expr tenga das, horas, minutos y segundos. Si especifica un valor como '1:10', MySQL asume que las partes de da y hora no se encuentran disponibles y que el valor representa minutos y segundos. En otras palabras, '1:10' DAY_SECOND se interpreta de forma que es equivalente a '1:10' MINUTE_SECOND. Esto es anlogo a la forma en que MySQL interpreta valores TIME como representando tiempo transcurrido en lugar de la hora del da. Si suma o borra de un valor de fecha algo que contenga una parte de fora, el resultado se convierte automticamente a valor fecha/hora:
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 usa fechas muy mal formadas, el resultado es NULL. Si suma MONTH, YEAR_MONTH, o YEAR y la fecha resultante tiene un da mayor que el da mximo para el nuevo mes, el da se ajusta al nmero mximo del nuevo mes:
mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH); -> '1998-02-28'
DATE_FORMAT(date,format) Formatea el valor date segn la cadena format . Los siguientes especificadores pueden usarse en la cadena format : Especificador %a %b %c %D %d %e %f %H %h %I %i %j %k %l %M %m %p %r %S %s %T %U Descripcin Da de semana abreviado (Sun..Sat) Mes abreviado (Jan..Dec) Mes, numrico (0..12) Da del mes con sufijo ingls (0th, 1st, 2nd, 3rd, ...) Da del mes numrico (00..31) Da del mes numrico (0..31) Microsegundos (000000..999999) Hora (00..23) Hora (01..12) Hora (01..12) Minutos, numrico (00..59) Da del ao (001..366) Hora (0..23) Hora (1..12) Nombre mes (January..December) Mes, numrico (00..12) AM o PM Hora, 12 horas (hh:mm:ss seguido de AM o PM) Segundos (00..59) Segundos (00..59) Hora, 24 horas (hh:mm:ss) Semana (00..53), donde domingo es el primer da de la semana 588
%u %V %v %W %w %X %x %Y %y %%
Semana (00..53), donde lunes es el primer da de la semana Semana (01..53), donde domingo es el primer da de la semana; usado con %X Semana (01..53), donde lunes es el primer da de la semana; usado con %x Nombre da semana (Sunday..Saturday) Da de la semana (0=Sunday..6=Saturday) Ao para la semana donde domingo es el primer da de la semana, numrico, cuatro dgitos; usado con %V Ao para la semana, donde lunes es el primer da de la semana, numrico, cuatro dgitos; usado con %v Ao, numrico, cuatro dgitos Ao, numrico (dos dgitos) Carcter '%' literal
Todos los otros caracteres se copian al resultado sin interpretacin. Tenga en cuenta que el carcter '%' se necesita antes de caracteres especificadores de formato. Los rangos para los especificadores de mes y da comienzan en cero debido a que MySQL permite almacenar fechas incompletas tales como '2004-00-00'.
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'
DAYOFWEEK(date)
589
Retorna el ndice del da de la semana para date (1 = domingo, 2 = lunes, ..., 7 = sbado). Estos valores del ndice se corresponden con el estndar ODBC.
mysql> SELECT DAYOFWEEK('1998-02-03'); -> 3
EXTRACT(type FROM date) La funcin EXTRACT() usa la misma clase de especificadores de tipo que DATE_ADD() o DATE_SUB(), pero extrae partes de la fecha en lugar de realizar aritmtica de fecha.
mysql> SELECT EXTRACT(YEAR FROM '1999-07-02'); -> 1999 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.000123'); -> 123
Use FROM_DAYS() con precaucin en fechas viejas. No se pretende que se use con valores que precedan el calendario Gregoriano (1582). Consulte Seccin 12.6, Qu calendario utiliza MySQL.
FROM_UNIXTIME(unix_timestamp) , FROM_UNIXTIME(unix_timestamp,format) Retorna una representacin del argumento unix_timestamp como un valor en formato 'YYYYMM-DD HH:MM:SS' o YYYYMMDDHHMMSS , dependiendo de si la funcin se usa en un formato numrico o de cadena de caracteres.
mysql> SELECT FROM_UNIXTIME(875996580); -> '1997-10-04 22:23:00' mysql> SELECT FROM_UNIXTIME(875996580) + 0; -> 19971004222300
Si se da format, el resultado se formatea segn la cadena format. format puede contener los mismos especificadores que los listados en la entrada para la funcin DATE_FORMAT() .
mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), -> '%Y %D %M %h:%i:%s %x'); -> '2003 6th August 06:22:58 2003'
590
GET_FORMAT(DATE|TIME|DATETIME, 'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL') Retorna una cadena de formato. Esta funcin es til en combinacin con las funciones DATE_FORMAT() y STR_TO_DATE() . Los tres valores posibles para el primer argumento y los cinco posibles valores para el segundo argumento resultan en 15 posibles cadenas de formato (para los especificadores usados, consulte la tabla en la descripcin de la funcin DATE_FORMAT() ).
LLamad a funcin GET_FORMAT(DATE,'USA') GET_FORMAT(DATE,'JIS') GET_FORMAT(DATE,'ISO') GET_FORMAT(DATE,'EUR') GET_FORMAT(DATE,'INTERNAL') GET_FORMAT(DATETIME,'USA') GET_FORMAT(DATETIME,'JIS') GET_FORMAT(DATETIME,'ISO') GET_FORMAT(DATETIME,'EUR') GET_FORMAT(DATETIME,'INTERNAL') GET_FORMAT(TIME,'USA') GET_FORMAT(TIME,'JIS') GET_FORMAT(TIME,'ISO') GET_FORMAT(TIME,'EUR') GET_FORMAT(TIME,'INTERNAL') El formato ISO es ISO 9075, no ISO 8601.
Resultado '%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' '%H:%i:%s' '%H:%i:%s' '%H.%i.%S' '%H%i%s'
En MySQL 5.0, TIMESTAMP puede usarse; GET_FORMAT() retorna los mismos valores que para DATETIME.
mysql> SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR')); -> '03.10.2003' mysql> SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA')); -> '2003-10-31'
HOUR(time) Retorna la hora para time. El rango del valor de retorno es 0 a 23 para valores de horas del da.
mysql> SELECT HOUR('10:05:03'); -> 10
Adems, el rango de los valores TIME es mucho mayor, as que HOUR puede retornar valores mayores que 23.
mysql> SELECT HOUR('272:59:59'); -> 272
591
LAST_DAY(date) Toma una fecha o fecha/hora y retorna el valor correspondiente para el ltimo da del mes. Retorna NULL si el argumento es invlido.
mysql> SELECT LAST_DAY('2003-02-05'); -> '2003-02-28' mysql> SELECT LAST_DAY('2004-02-05'); -> '2004-02-29' mysql> SELECT LAST_DAY('2004-01-01 01:01:01'); -> '2004-01-31' mysql> SELECT LAST_DAY('2003-03-32'); -> NULL
MAKEDATE(year,dayofyear) Retorna una fecha, dado un ao y da del ao. dayofyear debe ser mayor a 0 o el resultado es 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
MAKETIME(hour,minute,second) Retorna un valor horario calculado a partir de los argumentos hour, minute, y second .
mysql> SELECT MAKETIME(12,15,30); -> '12:15:30'
MICROSECOND(expr) Retorna los microsegundos a partir del a expresin de hora o fecha/hora expr como nmero en el rango de 0 a 999999.
mysql> SELECT MICROSECOND('12:00:00.123456'); -> 123456 mysql> SELECT MICROSECOND('1997-12-31 23:59:59.000010'); -> 10
MINUTE(time)
592
NOW() Retorna la fecha y hora actual como valor en formato 'YYYY-MM-DD HH:MM:SS' o YYYYMMDDHHMMSS , dependiendo de si la funcin se usa en contexto numrico o de cadena de caracteres.
mysql> SELECT NOW(); -> '1997-12-15 23:50:26' mysql> SELECT NOW() + 0; -> 19971215235026
PERIOD_ADD(P,N) Aade N meses al periodo P (en el formato YYMM o YYYYMM). Retorna un valor en el formato YYYYMM. Tenga en cuenta que el argumento del periodo P no es una fecha.
mysql> SELECT PERIOD_ADD(9801,2); -> 199803
PERIOD_DIFF(P1,P2) Retorna el nmero de meses entre periodos P1 y P2. P1 y P2 deben estar en el formato YYMM o YYYYMM. Tenga en cuenta que los argumentos del periodo P1 y P2 no son fechas.
mysql> SELECT PERIOD_DIFF(9802,199703); -> 11
593
SEC_TO_TIME(seconds) Retorna el argumento seconds , convertido a horas, minutos y segundos, como un valor en formato 'HH:MM:SS' o HHMMSS, dependiendo de si la funcin se usa en contexto numrico o de cadena de caracteres.
mysql> SELECT SEC_TO_TIME(2378); -> '00:39:38' mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938
STR_TO_DATE(str,format) Esta es la inversa de la funcin DATE_FORMAT(). Toma la cadena str y la cadena de formato format. STR_TO_DATE() retorna un valor DATETIME si la cadena de formato contiene parte de fecha y hora, o un valor DATE o TIME si la cadena contiene slo parte de fecha u hora. Los valores fecha, hora o fecha/hora contenidos en str deben ser dados en el formato indicado por format. Para los especificadores que pueden usarse en format, consulte la tabla en la descripcin de la funcin DATE_FORMAT() . Todos los otros caracteres no se interpretan. Si str contiene un valor fecha, hora o fecha/hora ilegal, STR_TO_DATE() retorna NULL. A partir de MySQL 5.0.3, un valor ilegal tambin produce una advertencia.
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('10arp', '%carp'); -> '0000-10-00 00:00:00' mysql> SELECT STR_TO_DATE('2003-15-10 00:00:00','%Y-%m-%d %H:%i:%s'); -> NULL
El chequeo de rango en las partes de los valores de fecha se describe en Seccin 11.3.1, Los tipos de datos DATETIME, DATE y TIMESTAMP. Esto significa, por ejemplo, que una fecha con una parte de da mayor que el nmero de das en un mes se permite mientras la parte del da est en el rango de 1 a 31. Tambin, fechas cero o fechas con partes de 0 se permiten.
mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y'); -> '0000-00-00' mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y'); -> '2004-04-31'
SUBDATE(date,INTERVAL expr type), SUBDATE(expr,days) Cuando se invoca con la forma INTERVAL del segundo argumento, SUBDATE() es sinnimo de DATE_SUB(). Para informacin del argumento INTERVAL , consulte la discusin para DATE_ADD().
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
594
La siguiente forma permite el uso de un valor entero para days. En tales casos, es el nmero de das a ser borrados de la expresin fecha o fecha/hora expr.
mysql> SELECT SUBDATE('1998-01-02 12:00:00', 31); -> '1997-12-02 12:00:00'
Nota no puede usar formato "%X%V" para convertir una cadena ao-semana en fecha ya que la combinacin de un ao y semana no identific unvocamente un ao y semana si la semana atraviesa la forntera de un mes. Para convertir un ao-semana a fecha, debe especificar el da de la semana:
mysql> select str_to_date('200442 Monday', '%X%V %W'); -> 2004-10-18
SUBTIME(expr,expr2) SUBTIME() resta expr2 de expr y retorna el resultado. expr es una expresin de hora o fecha/ hora, y expr2 es una expresin de hora.
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'
TIMEDIFF(expr,expr2) TIMEDIFF() retorna el tiempo entre la hora de inicio expr y la hora final expr2. expr y expr2 son expresiones de hora o de fecha/hora, pero ambas deben ser del mismo tipo.
mysql> SELECT TIMEDIFF('2000:01:01 -> '2000:01:01 -> '-00:00:00.000001' mysql> SELECT TIMEDIFF('1997-12-31 -> '1997-12-30 -> '46:58:57.999999' 00:00:00', 00:00:00.000001'); 23:59:59.000001', 01:01:01.000002');
Con un nico argumento, esta funcin retorna la expresin de fecha o fecha/hora expr como valor fecha/hora. Con dos argumentos, suma la expresin de hora expr2 a la expresin de fecha o de fecha/hora expr y retorna el resultado como valor fecha/hora.
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'
TIMESTAMPADD(interval,int_expr,datetime_expr) Suma la expresin entera int_expr a la expresin de fecha o de fecha/hora datetime_expr. La unidad for int_expr la da el argumento interval , que debe ser uno de los siguientes valores: FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, o YEAR. El valor interval puede especificarse usando una de las palabras claves que se muestran, o con un prefijo de SQL_TSI_. Por ejemplo, DAY o SQL_TSI_DAY son legales.
mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02'); -> '2003-01-02 00:01:00' mysql> SELECT TIMESTAMPADD(WEEK,1,'2003-01-02'); -> '2003-01-09'
TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) Retorna la diferencia entera entre las expresiones de fecha o de fecha/hora datetime_expr1 y datetime_expr2. La unidad del resultado se da en el argumento interval. Los valores legales para interval son los mismos que los listados en la descripcin de la funcin TIMESTAMPADD() .
mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'); -> 3 mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01'); -> -1
TIME_FORMAT(time,format) Se usa como la funcin DATE_FORMAT() pero la cadena format puede contener slo los especificadores de formato que tratan horas, minutos y segundos. Otros especificadores producen un valor NULL o 0. Si el valor time contiene una parte horaria mayor que 23, los especificadores de formato horario %H y %k producen un valor mayor que el rango usual de 0..23. Los otros especificadores de hora producen la hora modulo 12.
mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l'); -> '100 100 04 04 4'
596
TO_DAYS(date) Dada la fecha date, retorna un nmero de da (el nmero de dias desde el ao 0).
mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS('1997-10-07'); -> 729669
TO_DAYS() no est pensado para usarse con valores anteriores al calendario Gregoriano (1582), ya que no tiene en cuenta los das perdidos cuando se cambi el calendario. Consulte Seccin 12.6, Qu calendario utiliza MySQL. Recuerde que MySQL convierte aos de dos dgitos en fechas de cuatro dgitos usando las reglas en Seccin 11.3, Tipos de fecha y hora. Por ejemplo, '1997-10-07' y '97-10-07' se consideran fechas idnticas:
mysql> SELECT TO_DAYS('1997-10-07'), TO_DAYS('97-10-07'); -> 729669, 729669
Para fechas anteriores a 1582 (y posiblemente un ao posterior en otras localizaciones), los resultados de esta funcin no son fiables. Consulte Seccin 12.6, Qu calendario utiliza MySQL para ms detalles.
UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date) Si se llama sin argumentos, retorna el timestamp de Unix (segundos desde '1970-01-01 00:00:00' GMT) como entero sin signo. Si se llama a UNIX_TIMESTAMP() con un argumento date , retorna el valor del argumento como segundos desde '1970-01-01 00:00:00' GMT. date puede ser una cadena DATE , una cadena DATETIME , un TIMESTAMP, o un nmero en el formato YYMMDD o YYYYMMDD en hora local.
mysql> SELECT UNIX_TIMESTAMP(); -> 882226357 mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00'); -> 875996580
Cuando se usa UNIX_TIMESTAMP en una columna TIMESTAMP , la funcin retorna el valor del timestamp interno directamente, sin conversin implcita string-to-Unix-timestamp . Si pasa una fecha fuera de rango a UNIX_TIMESTAMP(), retorna 0, pero tenga en cuenta que slo se hace un chequeo de rango bsico (ao de 1970 a 2037, mes de 01 a 12, da de 01 a 31). Si quiere restar columnas UNIX_TIMESTAMP() puede querer convertir el resultado a enteros sin signo. Consulte Seccin 12.8, Funciones y operadores de cast.
UTC_DATE, UTC_DATE() Retorna la fecha UTC actual como valor en formato 'YYYY-MM-DD' o YYYYMMDD, dependiendo si la funcin se usa en un contexto numrico o de cadenas de caracteres.
mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> '2003-08-14', 20030814
597
UTC_TIME, UTC_TIME() Retorna la hora UTC actual como valor en formato 'HH:MM:SS' or HHMMSS dependiendo si la funcin se usa en un contexto numrico o de cadenas de caracteres.
mysql> SELECT UTC_TIME(), UTC_TIME() + 0; -> '18:07:53', 180753
UTC_TIMESTAMP, UTC_TIMESTAMP() Retorna la fecha y hora UTC actual como valor en formato 'YYYY-MM-DD HH:MM:SS' o YYYYMMDDHHMMSS dependiendo si la funcin se usa en un contexto numrico o de cadenas de caracteres.
mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0; -> '2003-08-14 18:08:04', 20030814180804
WEEK(date[,mode]) Esta funcin retorna el nmero de semana para date. La forma de dos argumentos de WEEK() le permite especificar si la semana comienza en lunes o domingo y si el valor de retorno debe estar en el rango de 0 a 53 o de 1 a 53. Si el argumento mode se omite en MySQL 5.0, el valor de la variable de sistema default_week_format se usa. Consulte Seccin 5.3.3, Variables de sistema del servidor. La siguiente tabla describe cmo funciona el argumento mode :
Primer da Modo 0 1 2 3 4 5 6 7 de semana Domingo Lunes Domingo Lunes Domingo Lunes Domingo Lunes Rango 0-53 0-53 1-53 1-53 0-53 0-53 1-53 1-53 Semana 1 es la primera semana... con un domingo en este ao con ms de 3 das este ao con un domingo este ao con ms de 3 das este ao con ms de 3 das este ao con un lunes en este ao con ms de 3 das este ao con un lunes en este ao
mysql> SELECT -> 7 mysql> SELECT -> 7 mysql> SELECT -> 8 mysql> SELECT -> 53
Tenga en cuenta que si una fecha cae en la ltima semana del ao prvio, MySQL retorna 0 si no usa 2, 3, 6, o 7 con el argumento opcional mode :
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0
Se podra argumentar que MySQL debera retornar 52 para la funcin WEEK() , ya que la fecha dada ocurre en la 52a semana de 1999. Decidimos retornar 0 en su lugar porque queramos que 598
la funcin devolviera el nmero de semana en el ao dado. Esta hace uso de la funcin WEEK() fiable combinada con otras funciones que extraen una parte de fecha de una fecha. Si prefiere que el resultado a ser evaluado respecto al ao que contiene el primer da de la semana para la fecha dada, debe usar 0, 2, 5, o 7 como el argumento mode opcional.
mysql> SELECT WEEK('2000-01-01',2); -> 52
WEEKDAY(date) Retorna el ndice de das de la semana para date (0 = lunes, 1 = martes, ... 6 = domingo).
mysql> SELECT WEEKDAY('1998-02-03 22:23:00'); -> 1 mysql> SELECT WEEKDAY('1997-11-05'); -> 2
WEEKOFYEAR(date) Retorna la semana de la fecha como nmero del rango 1 a 53. Esta es una funcin de compatibilidad equivalente a WEEK(date,3).
mysql> SELECT WEEKOFYEAR('1998-02-20'); -> 8
YEARWEEK(date), YEARWEEK(date,start) Retorna ao y semana para una fecha. El argumento start funciona exactamente como el argumento start de WEEK(). El ao en el resultado puede ser diferente del ao en el argumento fecha para la primera y ltima semana del ao.
mysql> SELECT YEARWEEK('1987-01-01'); -> 198653
Tenga en cuenta que el nmero de semana es diferente de lo que la funcin WEEK() retornara (0) para argumentos opcionales 0 o 1, como WEEK() retorna la semana en el contexto del ao dado.
Cada pas que ha cambiado del calendario Juliano al Gregoriano ha tenido que descartar al menos diez das durante el cambio. Para ver cmo funciona, vamos a mirar el mes de Octubre de 1582, cuando se hizo el primer cambio Juliano-Gregoriano: Lunes 1 18 25 Martes 2 19 26 Mircoles 3 20 27 Jueves 4 21 28 Viernes 15 22 29 Sbado 16 23 30 Domingo 17 24 31
No hay fechas entre 4 y 15 de Octubre. Esta continuidad se llama el corte. Cualquier fecha antes del corte son Julianas, y cualquier fecha posterior es Gregoriana. Las fechas durante el corte no existen. Un calendario aplicado a fechas cuando no estaban en uso se llama proleptico. Por lo tanto, si asumimos que nunca hubo un corte y las reglas Gregorianas funcionaron siempre, tenemos un calendario Gregoriano proleptico. Esto es lo que se usa en MySQL, y es requerido por el estndar SQL. Por esta razn, las fechas anteriores al corte almacenadas como valores MySQL DATE o DATETIME deben ajustarse para compensar la diferencia. Es importante tener en cuenta que el corte no ocurri al mismo tiempo en todos los pases, y que donde ocurri ms tarde se perdieron ms das. Por ejemplo, en Gran Bretaa, tuvo lugar en 1752, cuando el mircoles 2 de Septiembre fue seguido por el jueves 14 de Septiembre; Rusia sigui con el calendario Juliano hasta 1918, perdiendo 13 das en el proceso, y la que se llama popularmente la "Revolucin de Octubre" ocurri en Noviembre segn el calendario Gregoriano.
600
| 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 funcin MATCH() realiza una bsqueda de lenguaje natural para cadenas contra una coleccin de textos. Una coleccin es un conjunto de una o ms columnas includas en un ndice FULLTEXT . La cadena de bsqueda se da como argumento para AGAINST(). Para cada registro en la tabla MATCH() retorna un valor de relevancia, esto es, una medida de similaridad entre la cadena de bsqueda y el texto en el registro en las columnas mencionadas en la lista MATCH(). Por defecto, la bsqueda se realiza de forma insensible a maysculas. Sin embargo, puede realizar bsquedas sensibles a maysculas usando colaciones binarias para columnas indexadas. Por ejemplo, una columna que usa el conjunto de caracteres latin1 que puede asignarse una colacin de latin1_bin para hacerla sensible a maysculas para bsquedas full-text . Cuando se usa MATCH() en una clusula WHERE , como en el ejemplo precedente, los registros retornados se ordenan automticamente con la relevancia mayor primero. Los valores relevantes son nmeros en coma flotante no negativos. Relevancia cero significa que no tiene similaridad. La relevancia se computa basada en el nmero de palabras en el registro, el nmero de palabras nicas en este registro, el nmero total de palabras en la coleccin, y el nmero de documentos (registros) que contienen una palabra particulas. Para bsquedas full-text en lenguaje natural, se requiere que las columnas nombradas en la funcin MATCH() sean las mismas columnas includas en algn ndice FULLTEXT en su tabla. Para la consulta precedente, tenga en cuenta que las columnas nombradas en la funcin MATCH() (title y body) son las mismas que las nombradas en la definicin del ndice FULLTEXT de la tabla article. Si quiere buscar el title o body separadamente, necesitar crear ndices FULLTEXT para cada columna. Tambin es posible realizar una bsqueda boolena o una bsqueda con expansin de consulta. Estos tipos de bsqueda se describen en Seccin 12.7.1, Bsquedas booleanas de texto completo (FullText) y Seccin 12.7.2, Bsquedas de texto completo (Full-Text) con expansin de consulta. El ejemplo precedente es una ilustracin bsica mostrando cmo usar la funcin MATCH() donde los registros se retornan para decrementar la relevancia. El siguiente ejemplo muestra cmo recibir los valores de relevancia explcitamente. Los registros retornados no se ordenan debido a que el comando SELECT no incluye clusulas WHERE ni ORDER BY:
mysql> SELECT id, MATCH (title,body) AGAINST ('Tutorial') -> FROM articles; +----+-----------------------------------------+ | id | MATCH (title,body) AGAINST ('Tutorial') | +----+-----------------------------------------+ | 1 | 0.65545833110809 | | 2 | 0 | | 3 | 0.66266459226608 | | 4 | 0 | | 5 | 0 | | 6 | 0 | +----+-----------------------------------------+ 6 rows in set (0.00 sec)
El siguiente ejemplo es ms complejo. La consulta retorna los valores de relevancia y tambin ordena los registros en orden decrecente de relevancia. Para conseguir este resultado, debe especificar MATCH() dos veces: una vez en la lista SELECT y otra en la clusula WHERE . Esto hace que no haya sobrecarga adicional, ya que el optimizador de MySQL se da cuenta que hay dos llamadas MATCH() son idnticas y invoca la bsqueda full-text slo una vez.
mysql> SELECT id, body, MATCH (title,body) AGAINST -> ('Security implications of running MySQL as root') AS score
601
-> 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.5219271183014 | | 6 | When configured properly, MySQL ... | 1.3114095926285 | +----+-------------------------------------+-----------------+ 2 rows in set (0.00 sec)
La implementacin MySQL de FULLTEXT trata cualquier secuencia de caracteres de palabras (letras, dgitos, y subrayados) como una palabra. Esa secuencia puede contener apstrofes ('), poro no ms que una en un registro. Esto significa que aaa'bbb se trata como una palabra, pero aaa''bbb se trata como dos palabras. Los apstrofoes al principio o fin de una palabra se eliminan por el parser FULLTEXT ; 'aaa'bbb' se parsea como aaa'bbb. El parser FULLTEXT determina dnde empiezan y acaban las palabras buscando algunos delimitadores, por ejemplo ' ' (el espacio), , (coma), y . (punto). Si las palabras no se separan por delmitadores como, por ejemplo, en chino, el parser FULLTEXT no puede determinar dnde empieza y acaba una palabra. Para ser capaz de aadir palabras o ndices indexados en tales idioomas en un ndice FULLTEXT, debe preprocesarlos para que se eliminen mediante algn delimitador arbitrario tal como ". Algunas palabras se ignoran en las bsquedas full-text: Cualquier palabra demasiado corta se ignora. La longitud mnima de las palabras que se encuentran en bsquedas full-text es de cuatro caracteres por defecto. Las palabras en la lista de palabras de parada se ignoran. Una palabra de parada es una palabra tal como el o algn que es tan comn que se considera que no tiene valor semntico. Hay una lista de palabras de parada, pero puede reescribirse con una lista de palabras definidas por el usuario. Consulte Seccin 12.7.4, Afinar bsquedas de texto completo (Full-Text) con MySQL. La longitud de palabra mnima y lista de palabras de parada puede cambiarse como se describe en Seccin 12.7.4, Afinar bsquedas de texto completo (Full-Text) con MySQL. Cada palabra correcta en la coleccin y en la consulta se pesa segn su significado en la coleccin o consulta. Esta forma, una palabra que est presente en varios documentos tiene un peso menor ( y puede incluso tener peso 0), ya que tiene un valor semntico menor en esta coleccin particular. De modo similar, si la palabra es rara, recibe un peso mayor. Los pesos de las palabras se combinan para computar la relevancia del registro. Una tcnica de este tipo funciona mejor con colecciones grandes (de hecho, se ajust con cuidado para funcionar de este modo). Para tablas muy pequeas, la distribucin de palabras no refleja automticamente su valor semntico, y este modelo puede producir resultados extraos en ocasiones. Por ejemplo, aunque la palabra MySQL est presente en cada registro de la tabla articles, una bsqueda de esta palabra no da resultados.
mysql> SELECT * FROM articles -> WHERE MATCH (title,body) AGAINST ('MySQL'); Empty set (0.00 sec)
El resultado de bsqueda es vaco porque la palabra MySQL est presente al menos en el 50% de los registros. Como tal, se trata efectivamente como una palabra de parada. Para conjuntos grandes, este es el comportamiento ms deseable--una consulta en lenguaje natural no debe retornar cada segundo registro de una tabla de 1GB. Para conjuntos pequeos, puede ser menos deseable. Una palabra que concide la mitad de registros en una tabla es menos deseable para localizar documentos relevantes. De hecho, es ms fcil encontrar muchos documentos irrelevantes. Todos sabemos que esto pasa demasiado frecuentemente cuando tratamos de buscar algo en Internet con un motor de bsqueda. Es con este razonamiento que los registros que contienen la palabra se les
602
asigna un valor semntico bajo para el conjunto particular en que ocurre. Una palabra dada puede exceder el lmite del 50% en un conjunto pero no en otro. El lmite de 50% tiene una implicacin significante cuando intenta una primera bsqueda full-text para ver cmo funciona: si crea una tabla e inserta slo uno o dos registros de texto en ella, cada palabra en el texto aparece al menos en el 50% de los registros. Como resultado, no se retorna ningn resultado. Asegrese de insertar al menos tres registros, y preferiblemente muchos ms.
Esta consulta recibe todos los registros que contienen la palabra MySQL pero que no contiene la palabra YourSQL. Bsquedas full-text booleanas tienen estas caractersticas: No usa el lmite del 50%. No ordenan registros automticamente para ordenarlos por relevancia decrecente. Puede verlo en la consulta precedente: El registro con la relevancia mayor es la que contiene MySQL dos veces, pero se lista la ltima, no la primera. Pueden funcionar incluso sin un ndice FULLTEXT, aunque una bsqueda ejecutada de esta forma sera bastante lenta. La longitud mnima y mxima de palabra de parmetro de full-text se aplica. Se aplica la lista de palabras de parada. La capacidad de bsqued full-text booleana soporta los siguientes operadores: + Un signo ms indica que esta palabra debe estar presente en cada registro que se retorne. Un signo menos indica que esta palabra debe no estar presente en cualquiera de los registros que se retornan. (sin operador) Por defecto (cuando ni + ni - se especifica) la palabra es opcional, pero los registros que la contienen se clasifican mejor. Esto mimetiza el comportamiento de MATCH() ... AGAINST() sin el modificador IN BOOLEAN MODE . > < Estos dos operadores se usan para cambiar la contribucin de la palabra al valor de relevancia que se asigna a un registro. El operador > incrementa la contribucin y el operador < lo decrementa. Consulte el ejemplo a continuacin.
603
( ) Los parntesis se usan para agrupara palabras en subexpresiones. Los grupos entre parntesis se pueden anidar. ~ Una tilde acta como operador de negacin, causando que la contribucin de la palabra a la relevancia del registro sea negativa. Esto es til para marcar palabras ruidosas. Un registro que contenga tales palabras se clasifica peor que otros, pero no se excluye, como se hara con el operador - . * El asterisco sirve como operador de truncado. A diferencia de otros operadores, debe ser aadido a la palabra afectada. " Una frase entre comillas dobles ('"') coincide slo con registos que contienen la frase literalmente, como si se hubiera escrito. El motor de full-text divide la frase en palabras, realiza una bsqueda en el ndice FULLTEXT de la palabra. Antes de MySQL 5.0.3, el motor realizaba una bsqueda de subcadenas para la frase en el registro en que se encontraban, de forma que la coincidencia debe incluir caracteres no imprimibles en la frase. Desde MySQL 5.0.3, los caracteres no imprimibles no necesitan coincidir exactamente: La bsqueda de frases requiere slo que las coincidencias contengan exactamente las mismas palabras de la frase y en el mismo orden. Por ejemplo, "test phrase" coincide con "test, phrase" en MySQL 5.0.3, pero no anteriormente. Si la frase no contiene palabras que estn en el ndice, el resultado es vaco. Por ejemplo, si todas las palabras son palabras de parada o con longitud menor que la mnima para palabras indexadas, el resultado es vaco. Los siguientes ejemplos demuestran algunas cadenas de bsqueda que usan operadores booleanos full-text: 'apple banana' Encuentra registros que contengan al menos una de las dos palabras. '+apple +juice' Encuentra registros que contengan ambas palabras. '+apple macintosh' Encuentra registros que contengan la palabra apple, pero claficia mejor las que tamben contengan macintosh. '+apple -macintosh' Encuentra registros que contengan la palabra apple pero no macintosh. '+apple +(>turnover <strudel)' Encuentra registros que contengan las palabras apple y turnover, o apple y strudel (en cualquier orden), pero clasifican apple turnover mejor que apple strudel. 'apple*' Encuentra registros que contenga palabras tales como apple, apples, applesauce, o applet. '"some words"'
604
Encuentra registros que contienen la frase exacta some words (por ejemplo, registros que contengan some words of wisdom pero no some noise words). Tenga en cuenta que el carcter '"' que envuelve la frase son caracteres operadores que delimitan la frase. No son los delimitadores que rodean la cadena de bsqueda en s.
Otro ejemplo puede ser buscar libros de Georges Simenon sobre Maigret, cuando un usuario no est seguro de cmo se escribe Maigret. Una bsqueda para Megre and the reluctant witnesses encuentra slo Maigret and the Reluctant Witnesses sin expansin de consulta. Una bsqueda con expansin de consulta encuentra todos los libros con la palabra Maigret en la segunda pasada. Nota: Debido a que la expansin de bsqueda ciega tiende a incrementar el ruido significativamente retornando documentos no relevantes, slo tiene sentido cuando una frase de bsqueda es corta.
605
idiomas . Las implicaciones y algunas soluciones del problema se describen en Seccin 12.7, Funciones de bsqueda de texto completo (Full-Text). Mientras el uso de mltiples conjuntos de caracteres en una misma tabla se soporta, todas las columnas en un ndice FULLTEXT deben usar el mismo conjunto de caracteres y colacin. La lista de columnas MATCH() debe coincidir exactamente con la lista de columnas en algn ndice FULLTEXT definido en la tabla, a no ser que MATCH() estn IN BOOLEAN MODE. El argumento de AGAINST() debe ser una cadena constante.
A continuacin reinicie el servidor y rehaga los ndices FULLTEXT. Tenga en cuenta las particularidades de myisamchk en las instrucciones a continuacin. Para sobreescribir la lista de palabras de parada por defecto, cambie la variable de sistema ft_stopword_file. (Consulte Seccin 5.3.3, Variables de sistema del servidor.) El valor de la variable debe ser la ruta del fichero que contiene la lista de palabras de parada, o la cadena vaca para desactivar el filtro de palabras de parada. Tras cambiar el valor de esta variable o los contenidos del fichero de palabras de parada, rehaga los ndices FULLTEXT . La lista de palabras de parada es libre, esto es, puede usar cualquier carcter no alfanumrico como el de nueva lnea, espacio, o coma para separar las palabras de parada. Las excepcin son el subrayado (_) y el apstrofe sencillo (') que se tratan como parte de una palabra. El conjunto de caracteres de la lista de palabras de parada es el conjunto de caracteres por defecto del servidor; consulte Seccin 10.3.1, Conjunto de caracteres y colacin del servidor. El lmite del 50% para bsquedas de lenguaje natural est determinada por el esquema de pesos elegido. Para desactivarlo, consulte la siguiente lnea en myisam/ftdefs.h:
#define GWS_IN_USE GWS_PROB
606
A continuacin recompile MySQL. No hay necesidad de rehacer los ndices en este caso. Nota: Al hacer esto se decrementa severamente la habilidad de MySQL para proporcionar valores apropiados de relevancia para la funcin MATCH(). Si realmente necesita buscar para estas palabras comunes, es mejor buscar usando IN BOOLEAN MODE en su lugar, que no observa el lmite del 50%. Para cambiar los operadores usados para bsquedas booleanas full-text, cambie la variable de sistema ft_boolean_syntax. Esta variable tambin puede cambiarse mientras el servidor est en ejecucin, pero debe tener el privilegio SUPER para ello. No es necesario rehacer los ndices. Variables de sistema del servidor describe las reglas que gobiernan cmo cambiar esta variable. Si modifica variables full-text que afectan el indexado (ft_min_word_len, ft_max_word_len, ft_stopword_file), o si cambia el fichero de palabras de parada mismo, debe reconstruir los ndices FULLTEXT tras hacer los cambios y reiniciar el servidor. Para rehacer los ndices en este caso, es suficiente hacer una operacin de reparacin QUICK :
mysql> REPAIR TABLE tbl_name QUICK;
Tenga en cuenta que si usa myisamchk para realizar una operacin que modifica los ndices de tablas (tales como reparar o analizar), los ndices FULLTEXT se reconstruyen usando los valores por defecto full-text para longitud de palabras mnima y mxima y el fichero de palabras de parada a no ser que especifique otro. Esto puede hacer que las consultas fallen. El problema ocurre porque estos parametros slo son conocidos por el servidor. No se almacenan en ficheros ndices MyISAM. Para evitar este problema si ha modificado la longitud mnima o mxima de palabra o el fichero de palabras de parada en el servidor, especifique los mismos valores de ft_min_word_len, ft_max_word_len, y ft_stopword_file a myisamchk que usa para mysqld. Por ejemplo, si ha puesto que la longitud de palabra mnima a 3, puede reparar una tabla con un myisamchk como este:
shell> myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
Para asegurar que myisamchk y el servidor usan los mismos valores para parmetros full-text, puede poner cada uno en las secciones [mysqld] y [myisamchk] de un fichero de opciones:
[mysqld] ft_min_word_len=3 [myisamchk] ft_min_word_len=3
Una alternativa a usar myisamchk es usar REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE, o ALTER TABLE. Estos comandos los realiza el servidor, que conoce los valores apropiados de los parmetros full-text a usa.
607
Stemming Pre-parser genrico proporcionado por el usuario UDF . Hace el modelo ms flexible (aadiendo algunos parmetros ajustables a FULLTEXT en los comandos CREATE TABLE y ALTER TABLE).
BINARY afecta la comparacin; puede darse antes de cualquier operando con el mismo resultado. BINARY str es una abreviacin de CAST(str AS BINARY). Tenga en cuenta que en algunos contextos, si cambia el tipo de una columna BINARY indexada, MySQL no es capaz de usar el ndice eficientemente. Si quiere comparar un valor BLOB u otra cadena binaria de forma no sensible a maysculas, puede hacerlo teniendo en cuenta que las cadenas binarias no tienen conjunto de caracteres, y por lo tanto no tienen concepto de maysculas. Para una comparacin no sensible a maysculas, use la funcin CONVERT() para convertir el valor de cadena a un conjunto de caracteres no sensible a maysculas. El resultado es una cadena no binaria. El resultado es una cadena no binaria, as que la operacin LIKE no es sensible a maysculas:
SELECT 'A' LIKE CONVERT(blob_col USING latin1) FROM tbl_name;
Para usar un conjunto de caracteres diferente, substituya su nombre por latin1 en el comando precedente. CONVERT() puede usarse ms generalmente para comparar cadenas que se representan en distintos conjuntos de caracteres.
CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name) Las funciones CAST() y CONVERT() pueden usarse para tomar un valor de un tipo y producir un valor de otro tipo. type puede ser uno de los siguientes valores: BINARY CHAR DATE DATETIME
608
DECIMAL SIGNED [INTEGER] TIME UNSIGNED [INTEGER] BINARY produce una cadena binaria. Consulte la entrada para el operador BINARY en esta seccin para una descripcin de cmo afecta esto a las comparaciones. El tipo DECIMAL est disponible desde MySQL 5.0.8. CAST() y CONVERT(... USING ...) son sintaxis SQL estndar. La forma no-USING de CONVERT() es sintaxis ODBC . CONVERT() con USING se usa para convertir datos entre distintos conjuntos de caracteres. En MySQL, los nombres transcodificados son los mismos que los nombres de los conjuntos de caracteres correspondientes. Por ejemplo, este comando convierte la cadena 'abc' en el conjunto de caracteres por defecto del servidor a la cadena correspondiente en el conjunto de caracteres utf8 :
SELECT CONVERT('abc' USING utf8);
Las funciones de conversin son tiles cuando quiere crear una columna con un tipo especfico en un comando CREATE ... SELECT:
CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE);
Las funciones tambin pueden ser tiles para ordenar columnas ENUM en orden lxico. Normalmente ordenar columnas ENUM se hace usando el valor numrico interno. Convertir los valores en CHAR resulta en orden lxico:
SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);
CAST(str AS BINARY) es lo mismo que BINARY str. CAST(expr AS CHAR) trata la expresin como una cadena con el conjunto de caracteres por defecto. CAST() cambia el resultaod si lo usa como parte de una expresin ms compleja como CONCAT('Date: ',CAST(NOW() AS DATE)). No debe usar CAST() para extraer datos en datos en distintos formatos sino usar funciones de cadenas como LEFT() or EXTRACT(). Consulte Seccin 12.5, Funciones de fecha y hora. Para convertir una cadena en un valor numrico en un contexto numrico, normalmente no tiene que hacer nada ms que usar el valor de la cadena como si fuera un nmero:
mysql> SELECT 1+'1'; -> 2
Si usa un nmero en un contexto de cadenas, el nmero se convierte automticamente en una cadena BINARY string.
mysql> SELECT CONCAT('hello you ',2); -> 'hello you 2'
MySQL soporta aritmtica con valores con y sin signo de 64-bit. Si usa operadores numricos (tales como +) y uno de los operandos es un entero sin signo, el resultado no tiene signo. Puede cambiar este comportamiento usando los operadores SIGNED y UNSIGNED para cambiar la operacin a un entero con o sin signo de 64-bit , respectivamente.
mysql> SELECT CAST(1-2 AS UNSIGNED)
609
Otras funciones
Tenga en cuenta que si un operando es un valor de coma flotante, el resultado es de coma flotante y no est afectado por la regla precedente. (En este contexto, los valores de la columna DECIMAL se tratan como valores con punto flotante.)
mysql> SELECT CAST(1 AS UNSIGNED) - 2.0; -> -1.0
Si usa una cadena en una operacin aritmtica, se convierte en nmero en coma flotante.
610
Funciones de cifrado
Puede obtener incluso mejor seguridad si no transfiere la clave a travs de la conexin para cada consulta, que puede hacerse almacenando la clave en una variable del servidor al hacer la conexin. Por ejemplo:
SELECT @password:='my password';
611
Funciones de cifrado
AES_ENCRYPT() y AES_DECRYPT() pueden considerarse las funciones de cifrado criptogrficamente ms seguras disponibles en MySQL.
DECODE(crypt_str,pass_str) Descifra la cadena cifrada crypt_str usando pass_str como contrasea. crypt_str debe ser una cadena retornada de ENCODE().
ENCODE(str,pass_str) Cifra str usando pass_str como contrasea. Para descifrar el resultado, use DECODE(). El resultado es una cadena binaria de la misma longitud que str. Si quiere guardarlo en una columna, use una columna de tipo BLOB .
DES_DECRYPT(crypt_str[,key_str]) Descifra una cadena cifrada con DES_ENCRYPT(). En caso de error, esta funcin retorna NULL. Tenga en cuenta que esta funcin funciona slo si MySQL se configura con soporte SSL. Consulte Seccin 5.7.7, Usar conexiones seguras. Si no se da argumento key_str, DES_DECRYPT() examina el primer byte de la cadena cifrada para determinar el nmero de clave DES que se us para cifrar la cadena original, y luego lee la clave del fichero clave DES para descifrar el mensaje. Para que esto funcione, el usuario debe tener el privilegio SUPER. El fichero clave puede especificarse con la opcin del servidor --des-keyfile . Si le pasa a esta funcin el argumento key_str , esta cadena se usa como la clave para descifrar el mensaje. Si el argumento crypt_str no parece una cadena cifrada, MySQL retorna crypt_str.
DES_ENCRYPT(str[,(key_num|key_str)]) Cifra la cadena con la clave dada usando el algoritmo triple-DES. En caso de error, retorna NULL. Tenga en cuenta que esta funcin funciona slo si MySQL se configura con soporte SSL. Consulte Seccin 5.7.7, Usar conexiones seguras. La clave de cifrado a usar se elige basada en el segundo argumento de DES_ENCRYPT(), si se ha dado uno: Argumento Sin argumento key_num key_str Descripcin Se usa la primera clave del fichero clave DES. El nmero de clave dado (0-9) del fichero clave DES se usa. Se usa la cadena clave dada para cifrar str.
El fichero clave puede especificarse con la opcin de servidor --des-key-file . La cadena retornada es una cadena binaria donde el primer carcter es CHAR(128 | key_num).
612
Funciones de cifrado
Se aade 128 para hacer ms sencillo reconocer una clave cifrada. Si usa una cadena clave, key_num es 127. La longitud de la cadena para el resultado es new_len = orig_len + (8-(orig_len % 8))+1. Cada lnea en el fichero clave DES tiene el siguiente formato:
key_num des_key_str
Cada key_num debe ser un nmero en el rango de 0 a 9. Las lneas en el fichero pueden estar en cualquier orden. des_key_str es la cadena que se usa para cifrar el mensaje. Entre el nmero y la clave debe haber un espacio como mnimo. La primera clave es la clave usada por defecto si no especifica ningn argumento clave para DES_ENCRYPT() Puede decir a MySQL que lea un nuevo valor de clave del fichero clave con el comando FLUSH DES_KEY_FILE. Esto necesita el privilegio RELOAD . Un beneficio de tener un conjunto de claves por defecto es que da a las aplicaciones una forma de chequear la existencia de valores de columna cifrados, sin dar al usuario final el derecho de descifrarlos.
mysql> SELECT customer_address FROM customer_table > WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');
ENCRYPT(str[,salt]) Cifra str usando la llamada de sistema Unix crypt() . El argumento salt debe ser una cadena con al menos dos caracteres. Si no se da argumento salt , se usa un valor aleatorio.
mysql> SELECT ENCRYPT('hello'); -> 'VxuFAJXVARROc'
ENCRYPT() ignora todo excepto los primeros ochos caracteres de str, al menos en algunos sistemas. Este comportamiento viene determinado por la implementacin de la llamada de sistema crypt() subyacente. Si crypt() no est disponible en su sistema (como pasa en Windows), ENCRYPT() siempre retorna NULL. Debido a esto, recomandamos que use MD5() o SHA1() en su lugar, y que estas dos funciones existen en todas las plataformas.
MD5(str) Calcula una checksum MD5 de 128-bit para la cadena. El valor se retorna como una cadena binaria de dgitos 32 hex ,o NULL si el argumento era NULL. El valor de retorno puede usarse como clave hash, por ejemplo.
mysql> SELECT MD5('testing'); -> 'ae2b1fca515949e5d54fb22b8ed95575'
Este es el "RSA Data Security, Inc. MD5 Message-Digest Algorithm." Si quiere convertir el valor a maysculas, consulte la descripcin de conversiones de cadenas binarias dada en la entrada del operador BINARY en Seccin 12.8, Funciones y operadores de cast.
613
Funciones de informacin
OLD_PASSWORD(str) OLD_PASSWORD() se aadi en MySQL 4.1,cuando se cambin la implementacin de PASSWORD() para mejorar la seguridad. OLD_PASSWORD() retorna el valor de la implementacin pre-4.1 de PASSWORD(), y est hecha para permitirle resetear contraseas para cualquier cliente pre-4.1 que necesite conectar a su versin 4.1 o posterior de MySQL server sin bloquearlo. Consulte Seccin 5.6.9, Hashing de contraseas en MySQL 4.1.
PASSWORD(str) Calcula y retorna una cadena de contrasea de la contrasea en texto plano str, o NULL si el argumento era NULL. Esta es la funcin que se usa para cifrar contraseas MySQL para almacenar en la columna Password de la tabla user .
mysql> SELECT PASSWORD('badpwd'); -> '7f84554057dd964b'
El cifrado de PASSWORD() es de un sentido (no reversible). PASSWORD() no realiza el cifrado de contrasea de la misma forma que se cifran las contraseas Unix. Consulte ENCRYPT(). Nota: La funcin PASSWORD() se usa por el sistema de autenticacin en MySQL Server; no no debe usarlo en su propias aplicaciones. Para ese propsito, use MD5() o SHA1() en su lugar. Consulte RFC 2195 para ms informacin acerca de tratar contraseas y autenticacin de forma segura en su aplicacin.
SHA1(str), SHA(str) Calcula una checksum SHA1 de 160-bit para la cadena, como se describe en RFC 3174 (Secure Hash Algorithm). El valor se retorna como cadnea de 40 dtigos hexadecimales, o NULL si el argumento era NULL. Uno de los usos posibles para esta funcin es una clave hash. Tambin puede usarlo como funcin criptogrficamente segura para almacenar contraseas
mysql> SELECT SHA1('abc'); -> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1() puede considerarse un equivalente criptogrficamente ms seguro que MD5(). SHA() es sinnimo de SHA1().
El tiempo reportado es el tiempo transcurrido en el cliente final no el tiempo de CPU en el servidor. Se recomienda ejecutar BENCHMARK() varias veces, y interpretar el resultado teniendo en cuenta la carga de la mquina servidor.
614
Funciones de informacin
Ejemplo Valor con la clusula COLLATE Concatenacin de cadenas con distintas colaciones Valor de columna
Constante de Valor de retorno USER() sistema Coercible Ignorable Cadena literal NULL o una expresin derivada de NULL
Antes de MySQL 5.0.3, los valores de retorno se muestran como sigue, y las funciones tales como USER() tienen una coerzabilidad de 2:
Ejemplo Valor con la clusula COLLATE Concatenacin de cadenas con distintas colaciones Valor de columna Cadena literal
Funciones de informacin
mysql> SELECT COLLATION('abc'); -> 'latin1_swedish_ci' mysql> SELECT COLLATION(_utf8'abc'); -> 'utf8_general_ci'
CONNECTION_ID() Retorna el ID de la conexin (ID del thread) para la conexin. Cada conexin tiene su propio y nico ID.
mysql> SELECT CONNECTION_ID(); -> 23786
CURRENT_USER() Retorna la combinacin de nombre de usuario y de equipo que tiene la sesin actual. Este valor se corresponde con la cuenta MySQL que determina sus privilegios de aceso. Puede ser distinto al valor 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'
El ejemplo ilustra que aunque el cliente especica un nombre de usuario de davida (como se indica por el valor de la funcin USER() ), el servidor autentica al cliente usando una cuenta de usuario annimo (como se ve por la parte de usuario vaca del valor CURRENT_USER() ). Una forma en que esto puede ocurrir es que no haya cuenta listada en las cuentas de permisos para davida. En MySQL 5.0, la cadena retornada por CURRENT_USER() usa el conjunto de caracteres utf8 .
DATABASE() Retorna el nombre de base de datos por defecto (actual). En MySQL 5.0, la cadena tiene el conjunto de caracteres utf8 .
mysql> SELECT DATABASE(); -> 'test'
FOUND_ROWS() Un comando SELECT puede incluir una clusula LIMIT para restringir el nmero de registros que el servidor retorna al cliente. En algunos casos, es deseable saber cuntos registos habra retornado el comando sin LIMIT, pero sin volver a lanzar el comando. Para obtener este conteo de registros, incluya la opcin SQL_CALC_FOUND_ROWS en el comando SELECT , luego invoque FOUND_ROWS() :
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name -> WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS();
616
Funciones de informacin
El segundo SELECT retorna un nmero indicando cuantos registros habra retornado el primer SELECT sin la clusula LIMIT . (Si el comando precendente no incluye la opcin SQL_CALC_FOUND_ROWS , FOUND_ROWS() puede retornar un resultado distinto cuando se usa LIMIT y cuando no.) Tenga en cuenta que si usa SELECT SQL_CALC_FOUND_ROWS, MySQL debe calcular cuntos registros hay en el conjunto de resultdos completo. Sin embargo, esto es ms rpido que ejecutar la consulta de nuevo sin LIMIT, ya que el conjunto de resultados no necesita ser enviado al cliente. SQL_CALC_FOUND_ROWS y FOUND_ROWS() pueden ser tiles en situaciones donde puede querer restringir el nmero de registros que retorna una consulta, pero tambin determinar el nmero de registros en el conjunto de resultados entero sin ejecutar la consulta de nuevo. Un ejemplo es el script Web que presenta una salida paginada conteniendo enlaces a las pginas que muestran otras secciones de un resultado de bsqueda. Usando FOUND_ROWS() puede determinar cuntas pginas necesita para el resto de resultados. El uso deSQL_CALC_FOUND_ROWS y FOUND_ROWS() es ms complejo para consultas UNION que para comandos SELECT simples, ya que LIMIT puede ocurrir en varios lugares en una UNION. Puede aplicarse a comandos SELECT individuales en la UNION, o global en el resultado de UNION como conjunto. La intencin de SQL_CALC_FOUND_ROWS para UNION es que debe retornar el nmero de registros que se retornaran sin un LIMIT globar. Las condiciones para uso de SQL_CALC_FOUND_ROWS con UNION son: La palabra clave SQL_CALC_FOUND_ROWS debe aparecer en el primer SELECT de la UNION. El valor de FOUND_ROWS() es exacto slo si se usa UNION ALL . Si se usa UNION sin ALL, se eliminan duplicados y el valor de FOUND_ROWS() es slo aproximado. Si no hay LIMIT en UNION, se ignora SQL_CALC_FOUND_ROWS y retorna el nmero de registros en la tabla temporal que se crea para procesar UNION.
LAST_INSERT_ID(), LAST_INSERT_ID(expr) Retorna el ltimo valor generado automticamente que se insert en una columna AUTO_INCREMENT.
mysql> SELECT LAST_INSERT_ID(); -> 195
El ltimo ID generado se mantiene en el servidor para cada conexin. Esto significa que el valor de la funcin retorna a cada cliente el valor AUTO_INCREMENT ms reciente generado por ese cliente. Este valor no puede ser afectado por otros clientes, incluso si generan valores AUTO_INCREMENT ellos mismos. Este comportamiento asegura que reciba sus propios IDs sin tener en cuenta la actividad de otros clientes y sin la necesidad de bloqueos o transacciones. El valor de LAST_INSERT_ID() no cambia si actualiza la columna AUTO_INCREMENT de un registro con un valor no mgico (esto es, un valor que no es NULL ni 0). Si inserta varios registros a la vez con un comando de insercin LAST_INSERT_ID() retorna el valor del primer registro insertado. La razn para esto es hacer posible reproducir fcilmente el mismo comando INSERT contra otro servidor. Si usa INSERT IGNORE y el registro se ignora, el contador AUTO_INCREMENT no se incrementa y LAST_INSERT_ID() retorna 0, lo que refleja que no se ha insertado ningn registro. (Antes de MySQL 4.1, AUTO_INCREMENT el contador se incrementa y LAST_INSERT_ID() retorna el nuevo valor.) 617
Funciones de informacin
Si se da expr como argumento para LAST_INSERT_ID(), el valor del argumento se retorna por la funcin y se recuerda como el siguiente valor a ser retornado por LAST_INSERT_ID(). Esto puede usarse para simular secuencias: Cree una tabla para guardar el contador de secuencia y inicializarlo:
mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);
El comando UPDATE incrementa el contador de secuencia y causa que la siguiente llamada a LAST_INSERT_ID() retorne el valor actualizado. El comando SELECT recibe ese valor. La funcin de la API C mysql_insert_id() puede usarse para obtener el valor . Consulte Seccin 24.2.3.34, mysql_insert_id(). Puede generar secuencias sin llamar a LAST_INSERT_ID(), pero la utilidad de usar esta funcin de esta forma es que el valor ID se mantiene en el servidor como el ltimo valor generado automticamente. Es vlido para multi usuarios porque varios clientes pueden realizar el comando UPDATE y obtener su propio valor de secuencia con el comando SELECT (o mysql_insert_id()), sin afectar o ser afectado por otros clientes que generen sus propios valores de secuencia. Tenga en cuenta que mysql_insert_id() slo se actualiza tras los comandos INSERT y UPDATE , as que no puede usar la funcin de la API C para recibir el valor de LAST_INSERT_ID(expr) tras ejecutar otros comandos SQL como SELECT o SET.
ROW_COUNT() ROW_COUNT() retorna el nmero de registros actualizados, insertados o borrados por el comando precedente. Esto es lo mismo que el nmero de registros que muestra el cliente mysql y el valor de la funcin de la API C mysql_affected_rows() .
mysql> INSERT INTO t VALUES(1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 3 | +-------------+ 1 row in set (0.00 sec) mysql> DELETE FROM t WHERE i IN(1,2); Query OK, 2 rows affected (0.00 sec) mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 2 | +-------------+ 1 row in set (0.00 sec)
SESSION_USER()
618
Funciones varias
El valor indica el nombre de usuario especificado al conectar con el servidor, y el equipo cliente desde el que se est conectando. El valor puede ser distinto del de CURRENT_USER(). Puede extraer la parte de nombre de usuario as:
mysql> SELECT SUBSTRING_INDEX(USER(),'@',1); -> 'davida'
En MySQL 5.0, USER() retorna un valor en el conjunto de caracteres utf8, as que debe asegurarse que la literal '@' se interpreta en el conjunto de caracteres:
mysql> SELECT SUBSTRING_INDEX(USER(),_utf8'@',1); -> 'davida'
VERSION() Retorna una cadena que indica la versin del servidor MySQL. La cadena usa el conjunto de caracteres utf8 .
mysql> SELECT VERSION(); -> '5.0.9-standard'
Tenga en cuenta que si su cadena de versin acaba con -log significa que el logueo est activado.
FORMAT(X,D) Formatea el nmero X a un formato como '#,###,###.##', redondeado a D decimales, y retorna el resultado como una cadena. Si D es 0, el resultado no tiene punto decimar o parte fraccional.
mysql> SELECT FORMAT(12332.123456, 4); -> '12,332.1235' mysql> SELECT FORMAT(12332.1,4); -> '12,332.1000' mysql> SELECT FORMAT(12332.2,0); -> '12,332'
619
Funciones varias
GET_LOCK(str,timeout) Intenta obtener un bloqueo con un nombre dado por la cadena str, con un tiempo mximo de timeout segundos. Retorna 1 si el bloqueo se obtiene con xito, 0 si el intento supera el tiempo mximo (por ejemplo, debido a que otro cliente haya bloqueado el nombre prviamente), o NULL si ocurre un error (tal como quedarse sin memoria o que el flujo acabe con mysqladmin kill). Si tiene un bloqueo obtenido con GET_LOCK(), se libera cuando ejecuta RELEASE_LOCK(), ejecuta un nuevo GET_LOCK(), o su conexin termina (normal o anormalmente). Esta funcin puede usarse para implementar bloqueos de aplicaciones o simular bloqueo de registros. Los nombres se bloquean en el servidor. Si un nombre lo ha bloqueado un cliente, GET_LOCK() bloquea cualquier peticin de otro cliente para bloquear el mismo nombre. Esto permite a los clientes que se pongan con un nombre de bloqueo dado a usar el nombre para realizar advertencias de bloqueo cooperativo. Pero tenga en cuenta que esto permite a un cliente que no est entre el conjunto de clientes cooperativos bloquear un nombre, de forma deliverada o no, y evitar que ninguno de los clientes cooperativos puedan bloquear dicho nombre. Una forma de reducir la probabilidad que esto pase es usar nombres de bloqueo especificos de bases de datos o de aplicacin. Por ejemplo, use nombres de bloqueo de la forma db_name.str o app_name.str.
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
Tenga en cuenta que la segunda llamada a RELEASE_LOCK() retorna NULL debido a que el bloqueo 'lock1' se libera automticamente por la segunda llamada GET_LOCK() .
INET_ATON(expr) Dada la representacin de cuatros nmeros separados por puntos de una direccin de red como cadena de caracteres, retorna un entero que representa el valor numrico de la direccin. Las direcciones pueden ser direcciones de 4 o 8 bytes .
mysql> SELECT INET_ATON('209.207.224.40'); -> 3520061480
El nmero generado siempre tiene orden de bytes de red. Para el ejemplo mostrado anteriormente, el nmero se calcula como 209*256^3 + 207*256^2 + 224*256 + 40. INET_ATON() tambin entiende direcciones IP de forma corta:
mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1'); -> 2130706433, 2130706433
NOTA: Cuando almacene valores generados por INET_ATON(), se recomiendoa que use una columna INT UNSIGNED. Si usa una columna INT (con signo), los valores correspondientes a direcciones IP para las que el primer octeto es mayor que 127 se truncan a 2147483647 (esto es, el valor retornado por INET_ATON('127.255.255.255')). Consulte Seccin 11.2, Tipos numricos.
INET_NTOA(expr)
620
Funciones varias
Dada una direccin de red numrica (4 o 8 bytes), retorna la representacin de puntos de la direccin como cadena.
mysql> SELECT INET_NTOA(3520061480); -> '209.207.224.40'
IS_FREE_LOCK(str) Chequea si el nombre de bloqueo str est libre para uso (esto es, no bloqueado). Retorna 1 si el bloqueo est libre (nadie lo usa para bloquear), 0 si el bloqueo est en uso, y NULL en errores (tales como argumentos incorrectos).
IS_USED_LOCK(str) Chequea si el nombre de bloqueo str est en uso (esto es, bloqueado). Si es as, retorna el identificador de conexin del cliente que tiene el bloqueo. De otro modo, retorna NULL.
MASTER_POS_WAIT(log_name,log_pos[,timeout]) Esta funcin es til para control de sincronizacin de maestro/ esclavo. Bloquea hasta que el esclavo ha ledo y aplicado todas las actualizaciones hasta la posicin especificada en el log del maestro. El valor retornado es el nmero de eventos logueados que tiene que esperar para llegar a la posicin especificada. La funcin retorna NULL si el flujo esclavo SQL no est arrancado, la informacin maestra del esclavo no est inicializada, los argumentos son incorrectos, u ocurre un error. Retorna -1 si se agota el tiempo de espera. Si el flujo SQL esclavo para mientras MASTER_POS_WAIT() est esperando, la funcin retorna NULL. Si el eslavo pasa la posicin especificada, la funcin retorna inmediatamente. Si un valor timeout se especifica, MASTER_POS_WAIT() para de esprar cuando pasan timeout segundos. timeout debe ser superior a 0; un cero o timeout negativo significa que no hay timeout.
RELEASE_LOCK(str) Libera el bloqueo nombrado por la cadena str obtenida con GET_LOCK(). Retorna 1 si el bloqueo se libera, 0 si el bloqueo no estaba bloqueado por este flujo (en cuyo caso el bloqueo no se libera), y NULL si el bloqueo nombrado no exista. El bloqueo no existe si nunca se obtuvo por una llamada a GET_LOCK() o si haba sido liberado prviamente. El comando DO es conveniente para usar con RELEASE_LOCK(). Consulte Seccin 13.2.2, Sintaxis de DO.
UUID() Retorna un Universal Unique Identifier (UUID) (Identificador nico Universal) generado segn la DCE 1.1: Remote Procedure Call (Apndice A) CAE (Common Applications Environment) Especificaciones publicadas por The Open Group en Octubre 1997 (Nmero de Documento C706). Se designa un UUID como nmero que es nico globalmente en espacio y tiempo. Dos llamadas a UUID() generan dos valores distintos, incluso si estas llamadas se realizan en dos mquinas separadas y no estn conectadas entre ellas.
621
Un UUID es un nmero de 128 bits representado por una cadena de cinco nmeros hexadecimales en formato aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee: Los primeros tres nmeros se generan de un valor temporal. El cuarto nmero preserva unicidad temporal en caso de que el valor temporal pierda moniticidad (por ejemplo, debido al cambio horario). El quinto nmero es un nmero IEEE 802 de nodo que proporciona unicidad espacial. Un nmero aleatorio se sustituye si el ltimo no est disponible (por ejemplo, debido a que la mquina no tenga tarjeta Ethernet, o no sabemos encontrar la direccin hardware de una interfaz en el sistema operativo). En este caso, la unicidad espacial no se puede garantizar. Sin embargo, una colisin debe tener una probabilidad muy baja. Actualmente, la direccin MAC de una interfaz se tiene en cuenta slo en FreeBSD y Linux. En otros sistemas operativos, MySQL usa un nmero generado aleatoriamente de 48 bits.
mysql> SELECT UUID(); -> '6ccd780c-baba-1026-9564-0040f4311e29'
BIT_AND(expr) Retorna el AND bit a bit de todos los bits en expr. Los clculos se realizan con precisin de 64 bits (BIGINT) . En MySQL 5.0, esta funcin retoran 18446744073709551615 si no hubieran registros coindicentes. (Este es el valor de un BIGINT sin signo con todos los bits a 1.)
BIT_OR(expr) Retorna la OR bit a bit de todos los bits en expr. El clculo se realiza con precisin de 64 bits (BIGINT) . Esta funcin retorna 0 si no hay registros coincidentes.
BIT_XOR(expr) 622
Retorna el XOR bit a bit de todos los bits en expr. Los clculos se realizan con precisin de 64 bits (BIGINT) . Esta funcin retorna 0 si no hay registros coincidentes.
COUNT(expr) Retorna el contador del nmero de valores no NULL en los registros recibidos por un comando SELECT.
mysql> SELECT student.student_name,COUNT(*) -> FROM student,course -> WHERE student.student_id=course.student_id -> GROUP BY student_name;
COUNT(*) es algo diferente en que retorna un contador del nmero de registros retornados, si contienen o no valores NULL . COUNT(*) est optimizado para retornar muy rpidamente si SELECTretorna de una tabla, no se retornan otras columnas, y no hay clusula WHERE . Por ejemplo:
mysql> SELECT COUNT(*) FROM student;
Esta optimizacin se aplica slo a tablas MyISAM, ya que un conteo exacto de registros se almacena para estos tipos de tablas y puede ser accedido muy rpidamente. Para motores de almacenamiento transaccionales (InnoDB, BDB), almacenar un contador de registros es ms problemtico ya que pueden ocurrir mltiples transacciones, cada una de las cuales puede afectar al contador.
En MySQL, puede obtener el nmero de combinaciones de distintas expresiones que no contiene NULL dada una lista de expresiones. En SQL estndar, tendra que hacer una concatenacin de todas las expresiones dentro de COUNT(DISTINCT ...).
GROUP_CONCAT(expr) Esta funcin retorna una cadena resultado con los valores no NULL concatenados de un grupo. Retorna NULL si no hay valores no NULL . La sintaxis completa es la siguiente:
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val]) mysql> SELECT student_name, -> GROUP_CONCAT(test_score) -> FROM student -> GROUP BY student_name;
Or:
mysql> SELECT student_name, -> GROUP_CONCAT(DISTINCT test_score
623
ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name;
En MySQL, puede obtener los valores concatenados de combinaciones de expresiones. Puede eliminar valores duplicados usando DISTINCT. Si quiere ordenar valores en el resultado, debe usar la clusula ORDER BY. Para ordenar en orden inverso, aada la palabra clave DESC (descendente) al nombre de la columna que est ordenando con la clusula ORDER BY . El valor por defecto es orden ascendente; puede especificarse explcitamente usando la palabra clave ASC. SEPARATOR tiene a continuacin la cadena que debe insertarse entre los valores del resultado. Por defecto es una coma (','). Puede eliminar el separador especificando SEPARATOR ''. Puede especificar la longitud mxima con la variable de sistema group_concat_max_len . La sintaxis para ello en tiempo de ejecucin es la siguiente, donde val es un entero sin signo:
SET [SESSION | GLOBAL] group_concat_max_len = val;
MIN([DISTINCT] expr), MAX([DISTINCT] expr) Retornas los valores mximos y mnimos de expr. MIN() y MAX() pueden tener un argumento; en tales casos retornan el valor de cadena mnimo y mximo. Consulte Seccin 7.4.5, Cmo utiliza MySQL los ndices. La palabra clave DISTINCT puede usarse en MySQL 5.0 para encontrar el mnimo o mximo de los distintos valores de expr; esto es soportado, pero produce el mismo resultado que omitiendo DISTINCT.
mysql> SELECT student_name, MIN(test_score), MAX(test_score) -> FROM student -> GROUP BY student_name;
Para MIN(), MAX(), y otras funciones agregadas, MySQL compara columnas ENUM y SET por su valor de cadena de caracteres en lugar que por la posicin relativa de la cadena en el conjunto. Esto difiere de cmo los compara ORDER BY. Esto se rectificar en una futura versin de MySQL .
STD(expr), STDDEV(expr) Retorna la desviacin estndar de expr. Esta es una extensin del estndar SQL. La forma STDDEV() de esta funcin se proporciona para compatibilidad con Oracle. Desde MySQL 5.0.3, la funcin estndar SQL STDDEV_POP() puede usarse en su lugar.
STDDEV_POP(expr) Retorna la desviacin estndar de expr (la raz cuadrada de VAR_POP()). Esta funcin se aadi en MySQL 5.0.3. Antes de 5.0.3, puede usar STD() o STDDEV(), que son equivalentes pero no SQL estndar.
STDDEV_SAMP(expr) Retorna la muestra de la desviacin estndar de expr (la raz cuadrada de VAR_SAMP(). Esta funcin se aadi en MySQL 5.0.3.
SUM([DISTINCT] expr)
624
Modificadores de GROUP BY
Retorna la suma de expr. Si el conjunto resultado no tiene registros, SUM() retorna NULL. La palabra clave DISTINCT puede usarse en MySQL 5.0 para sumar slo los valores distintos de expr.
VAR_POP(expr) Retorna la varianza estndar de expr. Considera los registros como la poblacin completa, no como una muestra, as que tiene el nmero de registros como denominador. Esta funcin se aadi en MySQL 5.0.3. Antes de 5.0.3, puede usar VARIANCE(), que es equivalente pero no SQL estndar.
VAR_SAMP(expr) Retorna la varianza de muestra de expr. Esto es, el denominador es el nmero de registros menos uno. Esta funcin se aadi en MySQL 5.0.3.
VARIANCE(expr) Retorna la varianza estndar de expr. Esto es una extensin de SQL estndar. Desde MySQL 5.0.3, la funcin SQL estndar VAR_POP() puede usarse en su lugar.
Los contenidos de la tabla pueden resumirse por ao con un simple GROUP BY como este:
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year; +------+-------------+ | year | SUM(profit) | +------+-------------+ | 2000 | 4525 | | 2001 | 3010 | +------+-------------+
Esta salida muestra el beneficio total para cada ao, pero si quiere determinar el beneficio total registrado durante todos los aos, debe aadir los valores individuales usted mismo o ejecutar una consulta adicional. O puede usar ROLLUP, que proporciona ambos niveles de anlisis con una nica consulta. Aadir un modificador WITH ROLLUP a la clusula GROUP BY provoca que la consulta produzca otro registro que muestra el beneficio total sobre todos los valores de ao:
625
Modificadores de GROUP BY
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP; +------+-------------+ | year | SUM(profit) | +------+-------------+ | 2000 | 4525 | | 2001 | 3010 | | NULL | 7535 | +------+-------------+
La lnea super agregada con la suma total se identifica con el valor NULL en la columna year . ROLLUP tiene un efecto ms complejo cuando hay mltiples columnas GROUP BY . En este caso, cada vez que hay un break (cambio en el valor) en cualquiera excepto la ltima columna de agrupacin, la consulta produce registros super agregados extra. Por ejemplo, sin ROLLUP, un resumen de la tabla sales basado en year, country, y product puede tener este aspecto:
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 | +------+---------+------------+-------------+
La salida indica valores resumen slo en el nivel de anlisis year/country/product . Cuando se aade ROLLUP , la consulta produce registros extra:
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 | | 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 | +------+---------+------------+-------------+
Para esta consulta, aadir ROLLUP provoca que la salida incluya informacin resumen en cuatro niveles de anlisis, no slo uno. Aqu se muestra cmo interpretar la salida de ROLLUP :
626
A continuacin de cada conjunto de registros producto de un ao dado y un pas, un registro resume extra se produce mostrando el total para todos los productos. Estos registros tienen la columna product a NULL. A continuacin de cada conjunto de registros para un ao dado, se produce un registro resumen extra mostrando el total para todos los pases y productos. Estos registros tienen las columnas country y products a NULL. Finalmente, a continuacin de todos los otros registros, un registro extra resumen se produce mostrando el total para todos los aos, paises y productos. Este registro tiene las columnas year, country, y products a NULL. Otras consideraciones usando ROLLUP Los siguientes puntos listan algunos comportamientos especficos a la implementacin de MySQL de ROLLUP: Cuando usa ROLLUP, no puede usar una clusula ORDER BY para ordenar los resultados. En otras palabras, ROLLUP y ORDER BY son mtuamente exclusivas. Sin embargo, puede tener algn control sobre la ordenacin. GROUP BY en MySQL ordena los resultados, y puede usar explcitamente ASC y DESC con columnas mostradas en la lista GROUP BY para especificar orden de ordenacin para columnas individuales. (Los registros resumen de alto nivel apadidos por ROLLUP todava aparecen tras los registros para los que son calculados, a pesar del orden de ordenacin.) LIMIT puede usarse para restringir el nmero de registros retornados al cliente. LIMIT se aplica tras ROLLUP, as que el lmite se aplica contra los registros extra aadidos por ROLLUP. Por ejemplo:
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 | +------+---------+------------+-------------+
Usar LIMIT con ROLLUP puede producir resultados que son ms difciles de interpretar, ya que tiene menos contexto para entender los registros super agregados. Los indicadores NULL en cada registro super agregado se preducen cuando los registros se envan al cliente. El servidor busca las columnas llamadas en la clusula GROUP BY siguiendo la que est ms a la izquierda que ha cambiado un valor. Para cualquier columna en el conjunto de resultados con un nombre que sea una coincidencia lxica para cualquiera de estos nombres, su valor se cambia a NULL. (Si especifica columnas para agrupar con nmero de columna, el servidor identifica tales columnas para cambiar a NULL por el nmero.) Debido a que los valores NULL en los registros super agregados se guardan en el conjunto de resultados en una de las ltimas etapas del proceso de la consulta, no puede testearlas como valores NULL dentro de la propia consulta. Por ejemplo, no puede aadir HAVING product IS NULL a la consulta para eliminar de la salida todos los valores menos los registros super agregados. Por otro lado, los valores NULL aparecen como NULL en la parte del cliente y pueden testearse como tales usando cualquier interfaz de programacin de cliente MySQL.
627
Puede usarlo para obtener mejor rendimiento al evitar ordenar y agrupar elementos innecesarios. Por ejemplo, no necesita agrupar customer.name en la siguiente consulta:
mysql> SELECT order.custid, customer.name, MAX(payments) -> FROM order,customer -> WHERE order.custid = customer.custid -> GROUP BY order.custid;
En SQL estndar, puede tener que aadir customer.name a la clusula GROUP BY . En MySQL, el nombre es redundante si no se ejecuta en modo ANSI. No use esta caracterstica si las columnas que omite de la parte GROUP BY no son nicos en el grupo! Obtendra resultados impredecibles. En algunos casos, puede usar MIN() y MAX() para obtener valores especficos de columna incluso si no son nicos. La siguiente da el valor de column del registro conteniendo el valor ms pequeo en la columna sort :
SUBSTR(MIN(CONCAT(RPAD(sort,6,' '),column)),7)
Consulte Seccin 3.6.4, Los registros de un grupo que tienen el mximo valor en alguna columna. Tenga en cuenta que si trata de seguir SQL estndar, no puede usar expresiones en clsulas GROUP BY o ORDER BY . Puede solucionar esta limitacin usando un alias para la expresin:
mysql> SELECT id,FLOOR(value/100) AS val -> FROM tbl_name -> GROUP BY id, val ORDER BY val;
Sin embargo, MySQL le permite usar expresiones en clusulas GROUP BY y ORDER BY . Por ejemplo:
mysql> SELECT id, FLOOR(value/100) FROM tbl_name ORDER BY RAND();
628
629
alter_specification [, alter_specification] ... alter_specification: [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
ALTER DATABASE le permite cambiar las caractersticas globales de una base de datos. Estas caractersticas se almacenan en el fichero db.opt en el directorio de la base de datos. Para usar ALTER DATABASE, necesita el permiso ALTER en la base de datos. La clusula CHARACTER SET cambia el conjunto de caracteres por defecto de la base de datos. La clusula COLLATE cambia la colacin por defecto de la base de datos. El conjunto de caracteres y la colacin se discuten en Captulo 10, Soporte de conjuntos de caracteres. En MySQL 5.0, el nombre de base de datos puede omitirse. El comando se aplica a la base de datos por defecto. ALTER SCHEMA puede usarse desde MySQL 5.0.2.
ALTER TABLE le permite cambiar la estructura de una tabla existente. Por ejemplo, puede aadir o borrar columnas, crear o destruir ndices, cambiar el tipo de columnas existentes, o renombrar columnas o la misma tabla. Puede cambiar el comentario de la tabla y su tipo. La sintaxis para varias de las alteraciones permitidas es similar a clusulas del comando CREATE TABLE. Esto incluye modificaciones table_options , para opciones tales como ENGINE, AUTO_INCREMENT, y AVG_ROW_LENGTH. Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE. Algunas operaciones pueden producir advertencias si se intentan en una tabla para que el motor de almacenamiento no soporte la operacin. Estas advertencias pueden mostrarse con SHOW WARNINGS. Consulte Seccin 13.5.4.22, Sintaxis de SHOW WARNINGS. Si usa ALTER TABLE para cambiar la especificacin de una columna pero DESCRIBE tbl_name indica que la columna no ha cambiado, es posible que MySQL haya ignorado las modificaciones
630
por alguna de las razones descritas en Seccin 13.1.5.1, Cambios tcitos en la especificacin de columnas. Por ejemplo, si intenta cambiar una columna VARCHAR a CHAR, MySQL usa VARCHAR si la tabla contiene otras columnas de longitud variable. ALTER TABLE funciona creando una copia temporal de la tabla original. La alteracin se realiza en la copia, luego la tabla original se borra y se renombra la nueva. Mientras se ejecuta ALTER TABLE la tabla original es legible por otros clientes. Las actualizaciones y escrituras en la tabla se esperan hasta que la nueva tabla est lista, luego se redirigen automticamente a la nueva tabla sin ninguna actualizacin fallida. Tenga en cuenta que si usa cualquier otra opcin en ALTER TABLE distinta a RENAME, MySQL siempre crea una tabla temporal, incluso si los datos no necesitan ser copiados (tales como cuando cambia el nombre de una columna). Planeamos arreglar esto en el futuro, pero debido a que ALTER TABLE no es un comando que se use frecuentemente, no es un tema demasiado urgente. Para tablas MyISAM puede incrementar la velocidad de la operacin de recrear ndices (que es la parte ms lenta del proceso de alteracin) mediante la variable de sistema myisam_sort_buffer_size poniendo un valor alto. Para usar ALTER TABLE, necesita ALTER, INSERT, y permisos CREATE para la tabla. IGNORE es una extensin MySQL a SQL estndar. Controla cmo funciona ALTER TABLE si hay duplicados en las claves primarias en la nueva tabla o si ocuren advertencias cuando est activo el modo STRICT. Si no se especifica IGNORE la copia se aborta y no se ejecuta si hay errores de clave duplicada. Si se especifica IGNORE , entonces para duplicados con clave nica, slo se usa el primer registro. El resto de registros conflicitivos se borran. Los valores errneos se truncan al valor ms cercano aceptable. Puede ejecutar mltiples clusulas ADD, ALTER, DROP, y CHANGE en un nico comando ALTER TABLE . Esta es una extensin MySQL al estndar SQL, que permite slo una de cada clusula por comando ALTER TABLE . Por ejemplo, para borrar mltiples columnas en un nico comando:
mysql> ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
CHANGE col_name, DROP col_name, y DROP INDEX son extensiones MySQL al estndar SQL. MODIFY es una extensin de Oracle a ALTER TABLE. La palabra COLUMN es opcional y puede omitirse. Si usa ALTER TABLE tbl_name RENAME TO new_tbl_name sin ninguna otra opcin, MySQL smplemente renombra cualquier fichero que se corresponda a la tabla tbl_name. No es necesario crear una tabla temporal. (Puede usar el comando RENAME TABLE para renombrar tablas. Consulte Seccin 13.1.9, Sintaxis de RENAME TABLE.) Las clusulas column_definition usan la misma sintaxis para ADD y CHANGE as como CREATE TABLE. Tenga en cuenta que esta sintaxis incluye el nombre de la columna, no slo el tipo. Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE. Puede renombrar una columna usando CHANGE old_col_name column_definition. Para ello, especifique el nombre de columna viejo y nuevo y el tipo de la columna actual. Por ejemplo, para renombrar una columna INTEGER de a a b, puede hacer:
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
Si quiere cambiar el tipo de una columna pero no el nombre, la sintaxis CHANGE necesita un nombre viejo y nuevo de columna, incluso si son iguales. Por ejemplo:
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
Puede usar MODIFY para cambiar el tipo de una columna sin renombrarla:
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
631
Si usa CHANGE o MODIFY para acortar una columna para la que existe un ndice en la columna, y la longitud de la columna resultante es menor que la del ndice, MySQL reduce el ndice automticamente. Cuando cambia un tipo de columna usando CHANGE o MODIFY, MySQL intenta convertir valores de columna existentes al nuevo tipo lo mejor posible. En MySQL 5.0, puede usar FIRST o AFTER col_name para aadir una columna a una posicin especfica sin un registro de tabla. Por defecto se aade al final. Puede usar FIRST y AFTER en operaciones CHANGE o MODIFY en MySQL 5.0. ALTER COLUMN especifica un nuevo valor por defecto para una columna o borra el antiguo valor por defecto. Si el antiguo valor por defecto se borra y la columna puede ser NULL, el nuevo valor por defecto es NULL. Si la columna no puede ser NULL, MySQL asigna un valor por defecto, como se describe en Seccin 13.1.5, Sintaxis de CREATE TABLE. DROP INDEX borra un ndice. Es una extensin MySQL al estndar SQL. Consulte Seccin 13.1.7, Sintaxis de DROP INDEX. Si las columnas se borran de una tabla, las columnas tambin se borran de cualquier ndice del que formaran parte. Si todas las columnas que crean un ndice se borran, tambin se borra el ndice. Si una tabla contiene slo una columna, la columna no puede borrarse. Si lo que quiere es borrar la tabla, use DROP TABLE . ORDER BY le permite crear la nueva tabla con los registros en un orden especfico. Tenga en cuenta que la tabla no queda en este orden tras las inserciones y borrados. Esta opcin es til cuando sabe que normalmente consultar los registros en el mismo orden; usando esta opcin tras grandes cambios en la tabla, puede ser capaz de obtener un mejor rendimiento. En algunos casos, puede hacer la ordenacin ms fcil para MySQL si la tabla est en el orden de la columna por la que quiere ordenar posteriormente. Si usa ALTER TABLE en una tabla MyISAM , todos los ndices no nicos se crean en un batch separado (como para REPAIR TABLE). Esto debe hacer ALTER TABLE mucho ms rpido cuando tiene muchos ndices. En MySQL 5.0, esta caracterstica puede activarse explcitamente ALTER TABLE ... DISABLE KEYS le dice a MySQL que pare de actualizar ndices no nicos para una tabla MyISAM . ALTER TABLE ... ENABLE KEYS debe usarse para recrear ndices perdidos. MySQL lo hace con un algoritmo especial que es mucho ms rpido que insertar claves una a una, as que deshabilitar claves antes de realizar operaciones de insercin masivas debera dar una mejora de velocidad. Usar ALTER TABLE ... DISABLE KEYS requiere del permiso INDEX adems de los permisos mencionados anteriormente. ALTER TABLE ignora las opciones DATA DIRECTORY y INDEX DIRECTORY. Si quiere cambiar el conjunto de caracteres por defecto de la tabla y todas las columnas de caracteres (CHAR, VARCHAR, TEXT) a un nuevo conjunto de caracteres, use un comando como:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
Atencin: La operacin precedente convierte los valores de columnas entre conjuntos de caracteres. Esto no es lo que quiere hacer si tiene una columna en un conjunto de caracteres (como latin1) pero los valores almacenados realmente usan otro conjunto de caracteres incompatible (como utf8). En este caso, tiene que hacer lo siguiente para cada una de tales columnas:
ALTER TABLE t1 CHANGE c1 c1 BLOB; ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER 632 SET utf8;
La razn de que esto funcione es que no hay conversin cuando convierte desde o hacia columnas BLOB . Si especifica CONVERT TO CHARACTER SET binary, las columnas CHAR, VARCHAR, y TEXT se converten a sus cadenas de caracteres binarias (BINARY, VARBINARY, BLOB). Esto significa que las columnas no tendrn un conjunto de carcters y que siguientes operaciones CONVERT TO no se les aplicarn. Para slo cambiar el conjunto de caracteres por defecto de una tabla, use este comando:
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;
La palabra DEFAULT es opcional. El conjunto de caracteres por defecto es el que se usa si no especifica uno para una nueva columna que aada a la tabla (por ejemplo, con ALTER TABLE ... ADD column). Atencin: En MySQL 5.0, ALTER TABLE ... DEFAULT CHARACTER SET y ALTER TABLE ... CHARACTER SET son equivalentes y cambian slo el conjunto de caracteres por defecto de la tabla. Con la funcin mysql_info() de la API de C, puede consultar el nmero de registros copiados, y (cuando se usa IGNORE ) cuntos registros se borraron debido a duplicacin de valores de claves nica. Consulte Seccin 24.2.3.32, mysql_info(). Hay algunos ejemplos que muestran usos de ALTER TABLE. Comienza con una tabla t1 que se crea como se muestra:
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
Para cambiar la columna a desde INTEGER a TINYINT NOT NULL (dejando el mismo nombre), y para cambiar la columna b desde CHAR(10) a CHAR(20) as como dejarla de b a c:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
Tenga en cuenta que indexamos c (como PRIMARY KEY), ya que las columnas AUTO_INCREMENT deben indexarse, y tambin que declaramos c como NOT NULL, ya que las columnas de clave primara no pueden ser NULL. Cuando aade una columna AUTO_INCREMENT los valores se rellenan con nmeros secuenciales automticamente. Para tablas MyISAM puede asignar el primer nmero de secuencia ejecutando SET INSERT_ID=value antes de ALTER TABLE o usando la opcin de tabla AUTO_INCREMENT=value. Consulte Seccin 13.5.3, Sintaxis de SET.
633
Desde MySQL 5.0.3, puede usar la opcin de tabla ALTER TABLE ... AUTO_INCREMENT=value para InnoDB para asignar el nmero de secuencia de nuevos registros si el valor es mayor que el mximo valor en la columna AUTO_INCREMENT . Si el valor es menor que el mximo actual en la columna, no se da ningn mensaje de error y el valor de secuencia actual no se cambia. Con tablas MyISAM , si no cambia la columna AUTO_INCREMENT , el nmero de secuencia no se ve afectado. Si elimina una columna AUTO_INCREMENT y luego aade otra columna AUTO_INCREMENT los nmeros se resecuencian comenzando en 1. Consulte Seccin A.7.1, Problemas con ALTER TABLE.
CREATE DATABASE crea una base de datos con el nombre dado. Para usar CREATE DATABASE, necesita el permiso CREATE en la base de datos. Las reglas para nombres de bases de datos permitidos se dan en Seccin 9.2, Nombres de bases de datos, tablas, ndices, columnas y alias. Ocurre un error si la base de datos existe y no especifica IF NOT EXISTS. En MySQL 5.0, las opciones create_specification pueden darse para especificar caracterstica de la base de datos. Las caractersticas se almacenan en el fichero db.opt en el directorio de la base de datos. La clusula CHARACTER SET especifica el conjunto de caracteres por defecto de la base de datos. La clusula COLLATE especifica la colacin por defecto de la base de datos. Los nombres de colacin y de conjunto de caracteres se discuten en Captulo 10, Soporte de conjuntos de caracteres. Las bases de datos en MySQL se implementan como directorios que contienen ficheros que se corresponden a tablas en la base de datos. Como no hay tablas en la base de datos cuando se crean inicialmente, el comando CREATE DATABASE en MySQL 5.0 crea slo un directorio bajo el directorio de datos de MySQL y el fichero db.opt file. Si crea manualmente un directorio bajo el directorio de datos (por ejemplo, con mkdir), el servidor lo considera como un directorio de base de datos y muestra la salida de SHOW DATABASES. CREATE SCHEMA puede usarse desde MySQL 5.0.2. Tambin puede usar el programa mysqladmin para crear bases de datos. Consulte Seccin 8.4, Administrar un servidor MySQL con mysqladmin.
En MySQL 5.0, CREATE INDEX se mapea a un comando ALTER TABLE para crear ndices. Consulte Seccin 13.1.2, Sintaxis de ALTER TABLE. Normalmente, crea todos los ndices en una tabla cuando se crea la propia tabla con CREATE TABLE. Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE. CREATE INDEX le permite aadir ndices a tablas existentes. Una lista de columnas de la forma (col1,col2,...) crea un ndice de mltiples columnas. Los valores de ndice se forman al concatenar los valores de las columnas dadas.
634
Para columnas CHAR y VARCHAR, los ndices pueden crearse para que usen slo parte de una columna, usando col_name(length) para indexar un prefijo consistente en los primeros length caracteres de cada valor de la columna. BLOB t TEXT pueden indexarse, pero se debe dar una longitud de prefijo. El comando mostrado aqu crea un ndice usando los primeros 10 caracteres de la columna name :
CREATE INDEX part_of_name ON customer (name(10));
Como la mayora de nombres usualmente difieren en los primeros 10 caracteres, este ndice no debera ser mucho ms lento que un ndice creado con la columna name entera. Adems, usar columnas parcialmente para ndices puede hacer un fichero ndice mucho menor, que puede ahorrar mucho espacio de disco y adems acelarar las operaciones INSERT . Los prefijos pueden tener una longitud de hasta 255 bytes. Para tablas MyISAM y InnoDB en MySQL 5.0, pueden tener una longitud de hasta 1000 bytes . Tenga en cuenta que los lmites de los prefijos se miden en bytes, mientras que la longitud de prefijo en comandos CREATE INDEX se interpreta como el nmero de caracteres. Tenga esto en cuenta cuando especifique una longitud de prefijo para una columna que use un conjunto de caracteres de mltiples bytes. En MySQL 5.0: Puede aadir un ndice en una columna que puede tener valores NULL slo si est usando MyISAM, InnoDB, o BDB . Puede aadir un ndice en una columna BLOB o TEXT slo si est usando el tipo de tabla MyISAM, BDB, o InnoDB . Una especificacin index_col_name puede acabar con ASC o DESC. Estas palabras se permiten para extensiones futuras para especificar almacenamiento de ndice ascendente o descendente. Actualmente se parsean pero se ignoran; los valores de ndice siempre se almacenan en orden ascendente. En MySQL 5.0, algunos motores le permiten especificar un tipo de ndice cuando se crea un ndice. La sintaxis para el especificador index_type es USING type_name. Los valores type_name posibles soportados por distintos motores se muestran en la siguiente tabla. Donde se muestran mltiples tipos de ndice , el primero es el tipo por defecto cuando no se especifica index_type . Motor de almacenamiento Tipos de ndice permitidos MyISAM InnoDB MEMORY/HEAP Ejemplo:
CREATE TABLE lookup (id INT) ENGINE = MEMORY; CREATE INDEX id_index USING BTREE ON lookup (id);
TYPE type_name puede usarse como sinnimo de USING type_name para especificar un tipo de ndice. Sin embargo, USING es la forma preferida. Adems, el nombre de ndice que precede el tipo de ndice en la especificacin de la sintaxis de ndice no es opcional con TYPE. Esto es debido a que, en contra de USING, TYPE no es una palabra reservada y se interpreta como nombre de ndice. Si especifica un tipo de ndice que no es legal para un motor de almacenamiento, pero hay otro tipo de ndice disponible que puede usar el motor sin afectar los resultados de la consulta, el motor usa el tipo disponible. Para ms informacin sobre cmo MySQL usa ndices, consulte Seccin 7.4.5, Cmo utiliza MySQL los ndices. ndices FULLTEXT en MySQL 5.0 puede indexar slo columnas CHAR, VARCHAR, y TEXT , y slo en tablas MyISAM . Consulte Seccin 12.7, Funciones de bsqueda de texto completo (Full-Text).
635
ndices SPATIAL en MySQL 5.0 puede indexar slo columnas espaciales, y slo en tablas MyISAM . Los tipo de columna espaciales se describen en Captulo 18, Extensiones espaciales de MySQL.
O:
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] [UNIQUE [KEY] | [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 [BINARY] | TEXT [BINARY] | MEDIUMTEXT [BINARY] | LONGTEXT [BINARY] | ENUM(value1,value2,value3,...) | SET(value1,value2,value3,...) | spatial_type index_col_name: col_name [(length)] [ASC | DESC] reference_definition: REFERENCES tbl_name [(index_col_name,...)] [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] [ON DELETE reference_option] [ON UPDATE reference_option] reference_option:
636
RESTRICT | CASCADE | SET NULL | NO ACTION table_options: table_option [table_option] ... table_option: {ENGINE|TYPE} = engine_name | AUTO_INCREMENT = value | AVG_ROW_LENGTH = value | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name] | 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|REDUNDANT|COMPACT} | 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' select_statement: [IGNORE | REPLACE] [AS] SELECT ...
CREATE TABLE crea una tabla con el nombre dado. Debe tener el permiso CREATE para la tabla. Las reglas para nombres de tabla permitidos se dan en Seccin 9.2, Nombres de bases de datos, tablas, ndices, columnas y alias. Por defecto, la tabla se crea en la base de datos actual. Ocurre un error si la tabla existe, si no hay base de datos actual o si la base de datos no existe. En MySQL 5.0, el nombre de tabla puede especificarse como db_name.tbl_name para crear la tabla en la base de datos especfica. Esto funciona haya una base de datos actual o no. Si usa identificadores entre comillas, entrecomille el nombre de base de datos y de tabla por separado. Por ejemplo, `mydb`.`mytbl` es legal, pero `mydb.mytbl` no. Puede usar la palabra TEMPORARY al crear una tabla. Una tabla TEMPORARY es visible slo para la conexin actual, y se borra automticamente cuando la conexin se cierra. Esto significa que dos conexiones distintas pueden usar el mismo nombre de tabla temporal sin entrar en conflicto entre ellas ni con tablas no TEMPORARY con el mismo nombre. (La tabla existente se oculta hasta que se borra la tabla temporal.) En MySQL 5.0, debe tener el permiso CREATE TEMPORARY TABLES para crear tablas temporales. MySQL 5.0 soporta las palabras IF NOT EXISTS para que no ocurra un error si la tabla existe. Tenga en cuenta que no hay verificacin que la tabla existente tenga una estructura idntica a la indicada por el comando CREATE TABLE . Nota: Si usa IF NOT EXISTS en un comando CREATE TABLE ... SELECT ,cualquier registro seleccionado por la parte SELECT se inserta si la tabla existe o no. MySQL representa cada tabla mediante un fichero .frm de formato de tabla (definicin) en el directorio de base de datos. El motor para la tabla puede crear otros ficheros tambin. En el caso de tablas MyISAM , el motor crea ficheros ndice y de datos. Por lo tanto, para cada tabla MyISAM tbl_name, hay tres ficheros de disco: Fichero tbl_name.frm tbl_name.MYD tbl_name.MYI Propsito Fichero de formato de tabla (definicin) Fichero de datos Fichero ndice
Los ficheros creados por cada motor de almacenamiento para representar tablas se describen en Captulo 14, Motores de almacenamiento de MySQL y tipos de tablas.
637
Para informacin general de las propiedades de los diversos tipos de columna, consulte Captulo 11, Tipos de columna. Para informacin acerca de tipos de columna espaciales, consulte Captulo 18, Extensiones espaciales de MySQL. Si no se especifica NULL ni NOT NULL, la columna se trata como si se especificara NULL . Una columna entera puede tener el atributo adicional AUTO_INCREMENT. Cuando inserta un valor de NULL (recomendado) o 0 en una columna AUTO_INCREMENT autoindexada, la columna se asigna al siguiente valor de secuencia. Tpicamente esto es value+1, donde value es el mayor valor posible para la columna en la tabla. Secuencias AUTO_INCREMENT comienzan con 1. Tales columnas deben definirse como uno de los tipos enteros como se describe en Seccin 11.1.1, Panormica de tipos numricos. (El valor 1.0 no es un entero.) Consulte Seccin 24.2.3.34, mysql_insert_id(). En MySQL 5.0, especificar NO_AUTO_VALUE_ON_ZERO para la opcin de servidor --sql-mode o la variable de sistema sql_mode le permite almacenar 0 en columnas AUTO_INCREMENT como 0 sin generar un nuevo valor de secuencia. Consulte Seccin 5.3.1, Opciones del comando mysqld. Nota: Slo puede haber una columna AUTO_INCREMENT por tabla, debe estar indexada, y no puede tener un valor DEFAULT . Una columna AUTO_INCREMENT funciona correctamente slo si contiene slo valores positivos. Insertar un nmero negativo se trata como insertar un nmero positivo muy grande. Esto se hace para evitar problemas de precisin cuando los nmeros cambian de positivos a negativos y asegura que no obtiene accidentalmente una columna AUTO_INCREMENT que contenga 0. Para tablas MyISAM y BDB , puede especificar una columna AUTO_INCREMENT secundaria en una clave de mltiples columnas. Consulte Seccin 3.6.9, Utilizacin de AUTO_INCREMENT. Para hacer MySQL compatible con otras aplicaciones ODBC , puede encontrar el valor AUTO_INCREMENT para el ltimo registro insertado con la siguiente consulta:
SELECT * FROM tbl_name WHERE auto_col IS NULL
En MySQL 5.0, las definiciones de columnas de caracteres puede incluir un atributo CHARACTER SET para especificar el conjunto de caracteres y, opcionalmente, una colacin para la columna. Para detalles, consulte Captulo 10, Soporte de conjuntos de caracteres. CHARSET es sinnimo de CHARACTER SET.
CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
MySQL 5.0 interpreta las especificaciones de longitud en definiciones de columna en caracteres. (Algunas versiones anteriores los interpretan en bytes.) Un comentario para una columna puede especificarse en MySQL 5.0 con la opcin COMMENT . El comentario se muestra con los comandos SHOW CREATE TABLE y SHOW FULL COLUMNS .
En MySQL 5.0, el atributo SERIAL puede usarse como un alias para BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE. KEY normalemente es sinnimo para INDEX. En MySQL 5.0, el atributo clave PRIMARY KEY puede especificarse como KEY cuando se da en una definicin de columna. Esto se implement por compatibilidad con otros sistemas de bases de datos. En MySQL, un ndice UNIQUE es uno en que todos los valores en el ndice deben ser distintos. Ocurre un error si intenta aadir un nuevo registro con una clave que coincida con un registro existente. La excepcin es que una columna en el ndice puede contener valores NULL , puede contener valores NULL mltiples. Esta excepcin no se aplica a tablas BDB , en las que una columna indexada le permita un nico NULL. 638
Una PRIMARY KEY es una KEY nica donde todas las columnas de la clave deben definirse como NOT NULL. Si no se declaran explcitamente como NOT NULL, MySQL las declara implcitamente ( y sin decirlo ) . Una tabla puede tener slo una PRIMARY KEY. Si no tiene una PRIMARY KEY y una aplicacin pide una PRIMARY KEY en sus tablas, MySQL retorna el primer ndice UNIQUE que no tenga columnas NULL como la PRIMARY KEY. En la tabla creada, una PRIMARY KEY se guarda en primer lugar, seguida por todos los ndices UNIQUE, y luego los ndices no nicos. Esto ayuda al optimizador MySQL a priorizar qu indice usar y tambin detectar ms rpido claves UNIQUE duplicadas. Una PRIMARY KEY puede ser un ndice de mltiples columnas. Sin embargo, no puede crear un ndice de mltiples columnas usando el atributo de clave PRIMARY KEY en una especificacin de columna. Hacerlo slo marca la columna como primaria. Debe usar una clusula PRIMARY KEY(index_col_name, ...) separada. Si un ndice PRIMARY KEY o UNIQUE consite slo de una columna que tenga un tipo entero, puede referirse a la columna como _rowid en comandos SELECT. En MySQL, el nombre de una PRIMARY KEY es PRIMARY. Para otros ndices, si no asigna un nombre, el ndice tieen el mismo nombre que la primera columna indexada, con un sufijo opcional (_2, _3, ...) para hacerlo nico. Puede ver los nombres de ndice para una tabla usando SHOW INDEX FROM tbl_name. Consulte Seccin 13.5.4.11, Sintaxis de SHOW INDEX. A partir de MySQL 5.0, algunos motores de almacenamiento le permiten especificar un tipo de ndice al crear el ndice. Consulte Seccin 13.1.4, Sintaxis de CREATE INDEX. Para ms informacin acerca de cmo usa los ndices MySQL, consulte Seccin 7.4.5, Cmo utiliza MySQL los ndices. Con sintaxis col_name(length) en una especificacin de ndice, puede crear un ndice que use slo los primeros length caracteres de una columna CHAR o VARCHAR . Indexar slo un prefijo de valores de columna como este puede hacer el fichero de ndice mucho ms pequeo. Consulte Seccin 7.4.3, ndices de columna. En MySQL 5.0, los motores MyISAM y InnoDB soportan indexacin en columnas BLOB y TEXT . Al indexar columnas BLOB o TEXT debe especificar una longitud de prefijo para el ndice. Por ejemplo:
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
En MySQL 5.0, los prefijos pueden tener hasta 1000 bytes de longitud para tablas MyISAM y InnoDB y 255 bytes para otros tipos de tabla. Tenga en cuenta que los lmites de prefijo se miden en bytes, mientras que la longitud de prefijo en comandos CREATE TABLE se interpretan como el nmero de caracteres. Asegrese de tener esto en cuenta al especificar una longitud de prefijo para una columna que use un conjunto de caracteres multi-byte . Una especificacin index_col_name puede acabar con ASC o DESC. Estas palabras clave se permiten para extensiones futuras para especificar almacenamiento de ndices ascendente o descendentemente. Actualmente se parsean pero se ignoran; los valores de ndice siempre se almacenan en orden ascendente. Cuando usa ORDER BY o GROUP BY en una columna TEXT o BLOB en un SELECT, el servidor ordena los valores usando slo el nmero inicial de bytes indicados por la variable de sistema max_sort_length . Consulte Seccin 11.4.3, Los tipos BLOB y TEXT. En MySQL 5.0, puede crear ndices especiales FULLTEXT , que se usan para ndices full-text . Slo las tablas MyISAM soportan ndices FULLTEXT . Pueden crearse slo desde columnas CHAR, VARCHAR, y TEXT. La indexacin siempre se hace sobre la columna entera; la indexacin parcial no se soporta y cualquier longitud de prefijo se ignora. Consulte Seccin 12.7, Funciones de bsqueda de texto completo (Full-Text) para ms detalles.
639
En MySQL 5.0, puede crear ndices SPATIAL en tipos de columna espaciales. Los tipos espaciales se soportan slo para tablas MyISAM y las columnas indexadas deben declararase como NOT NULL. Consulte Captulo 18, Extensiones espaciales de MySQL. En MySQL 5.0, las tablas InnoDB soportan el chequeo de restricciones de claves forneas . Consulte Captulo 15, El motor de almacenamiento InnoDB. Tenga en cuenta que la sintaxis FOREIGN KEY en InnoDB es ms restrictiva que la sintaxis presentada para el comando CREATE TABLE al inicio de esta seccin: las columnas en la tabla referenciada debe siempre nombrarse explcitamente. InnoDB soporta tanto acciones ON DELETE como ON UPDATE en MySQL 5.0. Para la sintaxis precisa, consulte Seccin 15.6.4, Restricciones (constraints) FOREIGN KEY. Para otros motores de almacenamiento, MySQL Server parsea la sintaxis FOREIGN KEY y REFERENCES en comandos CREATE TABLE , pero no hace nada. La clusula CHECK se parsea paro se ignora en todos los motores de almacenamiento. Consulte Seccin 1.7.5.5, Claves forneas (foreign keys). Para tablas MyISAM cada columna NULL ocupa un bit extra, redondeado al byte ms prximo. La mxima longitud de registro en bytes puede calcularse como sigue:
row length = 1 + (sum of column lengths) + (number of NULL columns + delete_flag + 7)/8 + (number of variable-length columns)
delete_flag es 1 para tables con formato de registro esttico. Las tablas estticas usan un bit en el registro para un flag que indica si el registro se ha borrado. delete_flag es 0 para tablas dinmicas ya que el flag se almacena en una cabecera de registro dinmica. Estos clculos no se aplican en tablas InnoDB , en las que el tamao de almacenamiento no es distinto para columnas NULL y NOT NULL . La parte table_options de la sintaxis CREATE TABLE puede usarse desde MySQL 3.23. Las opciones ENGINE y TYPE especifican el motor de almacenamiento para la tabla. ENGINE es el nombre preferido para la opcin en MySQL 5.0, y TYPE est obsoleto. El soporte para la palabra TYPE usada en este contexto desaparecer en MySQL 5.1. Las opciones ENGINE y TYPE pueden tener los siguientes valores: Motor de almacenamiento ARCHIVE BDB Descripcin El motor de almacenamiento para archivar. Consulte Seccin 14.7, El motor de almacenamiento ARCHIVE. Tablas transaccionales con bloqueo de pgina. Conocidas como BerkeleyDB. Consulte Seccin 14.4, El motor de almacenamiento BDB (BerkeleyDB). Tablas que almacenan registros en valores separados por comas. Consulte Seccin 14.8, El motor de almacenamiento CSV. Motor de ejemplo. Consulte Seccin 14.5, El motor de almacenamiento EXAMPLE. Motor que accede a tablas remotas. Consulte Seccin 14.6, El motor de almacenamiento FEDERATED. Consulte Seccin 14.3, El motor de almacenamiento MEMORY (HEAP). No disponible en MySQL 5.0. Si est actualizando a MySQL 5.0 desde una versin prvia, debe convertir cualquier tabla ISAM existente a MyISAM antes de la actualizacin. Consulte Captulo 14, Motores de almacenamiento de MySQL y tipos de tablas.
640
Tablas transaccionales con bloqueo de registro y claves forneas. Consulte Captulo 15, El motor de almacenamiento InnoDB. Los datos de este tipo de tabla se almacenan slo en memoria. (Conocido anteriormente como HEAP.) Coleccin de tablas MyISAM usadas como una sola tabla. Tambin conocido como MRG_MyISAM. Consulte Seccin 14.2, El motor de almacenamiento MERGE. Motor binario portable que es el motor por defecto usado en MySQL. Consulte Seccin 14.1, El motor de almacenamiento MyISAM. Clusterizado, tolerante a errores, tablas en memoria. Tambin conocido como NDB. Consulte Captulo 16, MySQL Cluster.
MyISAM NDBCLUSTER
Para ms informacin acerca de motores MySQL, consulte Captulo 14, Motores de almacenamiento de MySQL y tipos de tablas. Si un motor no est disponible, MySQL usa en su lugar MyISAM . Por ejemplo, si una definicin de tabla incluye la opcin ENGINE=BDB pero el servidor MySQL no soporta tablas BDB , la tabla se crea como MyISAM . Esto hace posible tener un entorno de replicacin donde tiene tablas transaccionales en el maestro pero tablas no transaccionales en el esclavo (para tener ms velocidad). En MySQL 5.0, aparece una advertencia si la especificacin del motor no es correcta. Las otras opciones de tabla se usan para optimizar el comportamiento de la tabla. En la mayora de casos, no tiene que especificar ninguna de ellas. La opcin funciona para todos los motores a no ser que se indique lo contrario: AUTO_INCREMENT El valor inicial para AUTO_INCREMENT para la tabla. En MySQL 5.0, slo funciona para tablas MyISAM y MEMORY. Tambin se soporta para InnoDB desde MySQL 5.0.3. Para inicializar el primer valor de auto incremento para motores que no soporten esta opcin, inserte un registro de prueba con un valor que sea uno menor al deseado tras crear la tabla, y luego borre este registro. Para motores que soportan la opcin de tabla AUTO_INCREMENT en comandos CREATE TABLE puede usar ALTER TABLE tbl_name AUTO_INCREMENT = n para resetear el valor AUTO_INCREMENT . AVG_ROW_LENGTH Una aproximacin de la longitud media de registro para su tabla. Necesita inicializarla slo para tablas grandes con registros de longitud variable. Cuando crea una tabla MyISAM , MySQL usa el producto de las opciones MAX_ROWS y AVG_ROW_LENGTH para decidir el tamao de la tabla resultante. Si no las especifica, el tamao mximo para la tabla es 65,536TB de datos (4GB antes de MySQL 5.0.6). (Si su sistema operativo no soporta ficheros de este tamao, los tamaos de fichero se restringen al lmite del sistema operativo.) Si quiere mantener bajos los tamaos de los punteros para que el ndice sea pequeo y rpido y no necesita realmente ficheros grandes, puede decrementar el tamao de puntero por defecto mediante la variable de sistema myisam_data_pointer_size que se aadi en MySQL 4.1.2. (Consulte Seccin 5.3.3, Variables de sistema del servidor.) Si quiere que todas sus tablas sean capaces de crecer por encima del lmite por defecto y quiere mantener sus tablas ligeramente ms lentas y ms grandes de lo necesario, puede incrementar el tamao de punter por defecto cambiando esta variable. [DEFAULT] CHARACTER SET Especifica el conjunto de caracteres para la tabla. CHARSET es un sinnimo. para CHARACTER SET. 641
COLLATE Especifica la colacin por defecto de la tabla. CHECKSUM Pngalo a 1 si quiere que MySQL mantenga un checksum para todos los registros (un checksum que MySQL actualiza automticamente segn cambia la tabla). Esto hace que la tabla tenga actualizaciones ms lentas, pero hace ms fcil encontrar tablas corruptas. El comando CHECKSUM TABLE muestra el checksum (slo para MyISAM). COMMENT Un comentario para su tabla, hasta 60 caracteres. MAX_ROWS Mximo nmero de registros que planea almacenar en la tabla. No es un lmite absoluto, sino un indicador que la tabla debe ser capaz de almacenar al menos estos registros. MIN_ROWS Mnimo nmero de registros que planea almacenar en la tabla. PACK_KEYS Ponga esta opcin a 1 si quiere tener ndices ms pequeos. Esto hace normalmente que las actualizaciones sean ms lentas y las lecturas ms rpidas. Poner esta opcin a 0 deshabilita la compresin de claves. Ponerla a DEFAULT le dice al motor que comprima slo columnas CHAR/VARCHAR largas (MyISAM y ISAM slo). Si no usa PACK_KEYS, por defecto se comprimen slo cadenas, no nmeros. Si usa PACK_KEYS=1, tambin se empaquetan nmeros. Al comprimir claves de nmeros binarios, MySQL usa compresin de prefijo: Cada clave necesita un byte extra para indicar cuntos bytes de la clave previa son los mismos para la siguiente clave. El puntero al registro se almacena en orden de el-mayor-byte-primero directamente tras la clave, para mejorar la compresin. Esto significa que si tiene muchas claves iguales en dos registros consecutivos, todas las mismas claves siguientes usualmente slo ocupan dos bytes (incluyendo el puntero al registro). Comparar esto con el caso ordinario donde las siguente claves ocupan storage_size_for_key + pointer_size (donde el tamao del puntero es usualmente 4). Obtiene un gran beneficio a partir de la compresin de prefijos solo si tiene muchos nmeros que sean el mismo. Si todas las claves son totalmente distintas, usa un byte ms por clave, si la clave no es una clave que pueda tener valores NULL . (En ese caso, el tamao empaquetado de la clave se almacena en el mismo byte que se usa para marcar si una clave es NULL.) PASSWORD Cifra el fichero .frm con una contrasea. Esta opcin no hace nada en la versin estndar de MySQL. DELAY_KEY_WRITE Pngalo a 1 si quiere retardar actualizaciones de clave para la tabla hasta que la tabla se cierra (slo en MyISAM). ROW_FORMAT
642
Define cmo deben almacenarse los registros. Actualmente esta opcin slo funciona con tablas MyISAM. El valor de la opcin puede ser FIXED o DYNAMIC para formato de longitud esttica o variable. myisampack cambia el tipo a COMPRESSED. Consulte Seccin 14.1.3, Formatos de almacenamiento de tablas MyISAM. Desde MySQL/InnoDB-5.0.3, los registros de InnoDB se almacenan de forma ms compacta (ROW_FORMAT=COMPACT) por defecto. El antiguo formato puede usarse espeficicando ROW_FORMAT=REDUNDANT. RAID_TYPE Tenga en cuenta que el soporte para RAID se ha eliminado desde MySQL 5.0. Para informacin sobre RAID, consulte Manual de referencia de MySQL 4.1. UNION UNION se usa cuando quiere usar una coleccin de tablas idnticas como una. Funciona slo con tablas MERGE . Consulte Seccin 14.2, El motor de almacenamiento MERGE. En MySQL 5.0, debe tener permisos SELECT, UPDATE, y DELETE para las tablas mapeadas en una tabla MERGE . (Nota: Originalmente, todas las tablas usadas tenan que estar en la misma base de datos que la tabla MERGE. Esta restriccin se ha eliminado.) INSERT_METHOD Si quiere insertar datos en una tabla MERGE debe especificarlo con INSERT_METHOD en la tabla en que se debe insertar el registro. INSERT_METHOD es una opcin til para tablas MERGE slo. Use un valor dee FIRST o LAST para que las inserciones vayan a la primera o ltima tabla, o un valor de NO para evitar inserciones. Consulte Seccin 14.2, El motor de almacenamiento MERGE. DATA DIRECTORY, INDEX DIRECTORY Usando DATA DIRECTORY='directory' o INDEX DIRECTORY='directory' puede especificar dnde debe el moto MyISAM buardar un fichero de datos e ndice de una tabla. Tenga en cuenta que el directorio debe ser una ruta completa al directorio (no una ruta relativa). Estas opciones slo funcionan cuando no usa la opcin --skip-symbolic-links . Su sistema operativo debe tener una llamada realpath() que funcione bien. Consulte Seccin 7.6.1.2, Utilizacin de enlaces simblicos para tablas en Unix para ms informacin. En MySQL 5.0, puede crear una tabla de otra aadiendo un comando SELECT al final del comando CREATE TABLE :
CREATE TABLE new_tbl SELECT * FROM orig_tbl;
MySQL crea nuevas columnas para todos los elementos en un SELECT. Por ejemplo:
mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (a), KEY(b)) -> TYPE=MyISAM SELECT b,c FROM test2;
Esto crea una tabla MyISAM con tres columnas, a, b, y c. Tenga en cuenta que las columnas para el comando SELECT se aaden a la derecha de la tabla, no se sobreescriben en la misma. Consulte el siguiente ejemplo:
mysql> SELECT * FROM foo; +---+ | n | +---+ | 1 | +---+
643
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)
Para cada registro en la tabla foo, se inserta un registro en bar con los valores de foo y valores por defecto para las nuevas columnas: Si hay cualquier error al copiar los datos a la tabla, se borra automticamente y no se crea. CREATE TABLE ... SELECT no crea ningn ndice automticamente. Se hace a propsito para hacer el comando lo ms flexible posible. Si quiere tener ndices en la tabla creada, debe especificarlo antes del comando SELECT :
mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
Algunas conversiones de tipos de columnas pueden ocurrir. Por ejemplo, el atributo AUTO_INCREMENT no se preserva, y las columnas VARCHAR pueden ser CHAR . Al crear una tabla con CREATE ... SELECT, asegurse de poner un alias para cualquier llamada a funcin o expresin en la consulta. Si no lo hace, el comando CREATE puede fallar o crear nombres de columnas no deseados.
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;
En MySQL 5.0, use LIKE para crear una tabla vaca basada en la definicin de otra tabla, incluyendo cualquier atributo de columna e ndice definido en la tabla original:
CREATE TABLE new_tbl LIKE orig_tbl;
CREATE TABLE ... LIKE no copia ninguna opcin de tabla DATA DIRECTORY o INDEX DIRECTORY especificadas en la tabla original, ni ninguna definicin de clave fornea. Puede preceder SELECT con IGNORE o REPLACE para indicar cmo tratar registros que dupliquen claves nicas. Con IGNORE, los nuevos registros que duplican un registro nico existente se descartan. Con REPLACE, los nuevos registros reemplazan a los antiguos con el mismo valor. Si ni IGNORE ni REPLACE se indican, los valores nicos duplicados dan un error. Para asegurar que el log de update o binario puede usarse para recrear tablas originales, MySQL no permite inserciones concurrentes durante CREATE TABLE ... SELECT.
644
Si cualquier columna en una tabla tiene una longitud variable, el registro entero pasa a tener longitud variable. Por lo tanto, si una tabla contiene cualquier columna de longitud variable (VARCHAR, TEXT, o BLOB), toda columna CHAR con ms de tres caracteres se cambia a columna VARCHAR . Esto no afecta cmo usa las columnas en ningn modo; en MySQL, VARCHAR es slo un modo distinto de almacenar caracteres. MySQL realiza esta conversin porque ahorra espacio y hacer las operaciones de tabla ms rpidas. Consulte Captulo 14, Motores de almacenamiento de MySQL y tipos de tablas. Antes de MySQL 5.0.3, una columna CHAR o VARCHAR con una longitud mayor a 255 se convierte al tipo TEXT ms pequeo que puede contener valores de la longitud dada. Por ejemplo, VARCHAR(500) se convierte en TEXT, y VARCHAR(200000) se convierte en MEDIUMTEXT. Tenga en cuenta que esta conversin resulta en un cambio de comportamiento del tratamiento de espacios finales. Conversiones similares ocurren para BINARY y VARBINARY, excepto que se convierten en tipo BLOB. Desde MySQL 5.0.3, una columna CHAR o BINARY con una longitud mayor a 255 no se convierte silenciosamente . En su lugar, ocurre un error. Desde MySQL 5.0.6 , la conversin silenciosa de columnas VARCHAR y VARBINARY con una longitudo mayor a 65,535 no ocurre si el modo estricto SQL est activado. En su lugar, ocurre un error. Para una especificacin de DECIMAL(M,D), si M no es mayor que D, se ajusta por encima. Por ejemplo DECIMAL(10,10) pasa a ser DECIMAL(11,10). Otros cambios de columna incluyen cambios de atributos o especficacin de ndice: Los tamaos de muestra de TIMESTAMP se descartan. Tenga en cuenta que columnas TIMESTAMP han cambiado considrablemente en versiones recientes de MySQL anteriores a 5.0; para una descripcin, consulte Manual de referencia de MySQL 4.1. Las columnas que son parte de PRIMARY KEY son NOT NULL incluso si no se declaran como tales. Los espacios finales se borran automticamente para ENUM y SET cuando se crea la tabla. MySQL mapea ciertos tipos de columna usados por otras bases de datos SQL a tipos MySQL . Consulte Seccin 11.7, Usar tipos de columnas de otros motores de bases de datos. Si incluye una clusula USING para especificar un tipo de ndice que no sea legal para un motor de almacenamiento dado, pero hay otro tipo de ndice disponible que puede usar el motor sin afectar el resultado de la consulta, el motor usa el tipo disponible. Para ver si MySQL usa un tipo de columna distinto al especificado, realice un comando DESCRIBE o SHOW CREATE TABLE tras crear o alterar la tabla. Otros cambios de tipo de columna pueden ocurrir si comprime una tabla usando myisampack. Consulte Seccin 14.1.3.3, Caractersticas de las tablas comprimidas.
DROP DATABASE borrar todas las tablas en la base de datos y borrar la base de datos. Sea muy cuidadoso con este comando! Para usarDROP DATABASE, necesita el permiso DROP en la base de datos. IF EXISTS se usa para evitar un error si la base de datos no existe. DROP SCHEMA puede usarse desde MySQL 5.0.2. Si usa DROP DATABASE en una base de datos enlazada simblicamente, tanto el enlace como la base de datos se borran.
645
DROP DATABASE retorna el nmero de tablas que se eliminan. Se corresponde con el nmero de ficheros .frm borrados. El comando DROP DATABASE borrar del directorio de base de datos los ficheros y directorios que MySQL puede crear durante operaciones normales: Todos los ficheros con estas extensiones: .BAK .MRG .MYI .DAT .MYD .db .HSH .ISD .frm
Todos los subdirectorios con nombres que tienen dos dgitos hexadecimales 00-ff. Son subdirectorios usados por tablas RAID . (Estos directorios no se borran desde MySQL 5.0, cuando se elimin el soporte para tablas RAID . Debe convertir las tablas RAID y eliminar estos directorios manualmente antes de actualizar a MySQL 5.0. Consulte Seccin 2.10.1, Aumentar la versin de 4.1 a 5.0.) El fichero db.opt , si existe. Si permanecen otros ficheros o directorios en el directorio de la base de datos tras que MySQL borre los ficheros listados, el directorio de base de datos no puede borrarse. En este caso, debe borrar cualquier fichero restante manualmente y realizar el comando DROP DATABASE de nuevo. Puede borrar bases de datos con mysqladmin. Consulte Seccin 8.4, Administrar un servidor MySQL con mysqladmin.
DROP INDEX borra el ndice llamado index_name de la tabla tbl_name. En MySQL 5.0, DROP INDEX se mapea a comando ALTER TABLE para borrar el ndice. Consulte Seccin 13.1.2, Sintaxis de ALTER TABLE.
DROP TABLE borra una o ms tablas. Debe tener el permiso DROP para cada tabla. Todos los datos de la definicin de tabla son borrados, as que tenga cuidado con este comando! Use IF EXISTS para evitar un error para tablas que no existan. Un NOTE se genera para cada tabla no existente cuando se usa IF EXISTS. Consulte Seccin 13.5.4.22, Sintaxis de SHOW WARNINGS. RESTRICT y CASCADE se permiten para hacer la portabilidad ms fcil. De momento, no hacen nada. Nota: DROP TABLE hace un commit automticamente con la transaccin activa,a no ser que use la palabra TEMPORARY. La palabra TEMPORARY tiene el siguiente efecto: El comando slo borra tablas TEMPORARY. El comando no acaba una transaccin en marcha. No se chequean derechos de acceso. (Una tabla TEMPORARY es visible slo para el cliente que la ha creado, as que no es necesario.)
646
Usar TEMPORARY es una buena forma de asegurar que no borra accidentalmente una tabla no TEMPORARY.
Este comando renombra una o ms tablas. La operacin de renombrar se hace automticamente, lo que significa que ningn otro flujo puede acceder a ninguna de las tablas mientras se ejecuta el renombrado. Por ejemplo, si tiene una tabla existente old_table, puede crear otra tabla new_table con la misma estructura pero vaca, y luego reemplazar la tabla existente con la vaca como sigue:
CREATE TABLE new_table (...); RENAME TABLE old_table TO backup_table, new_table TO old_table;
Si el comando renombra ms de una tabla, las operaciones de renombrado se realizan de izquierda a derecha. Si quiere intercambiar dos nombres de tablas, puede hacerlo as (asumiendo que no existe ninguna tabla llamada tmp_table):
RENAME TABLE old_table TO tmp_table, new_table TO old_table, tmp_table TO new_table;
Mientras haya dos bases de datos en el mismo sistema de ficheros puede renombrar una tabla para moverla de una base de datos a otra:
RENAME TABLE current_db.tbl_name TO other_db.tbl_name;
Cuando ejecuta RENAME, no puede tener ninguna tabla bloqueada o transacciones activas. Debe tener los permisos ALTER y DROP en la tabla original, y los permisos CREATE y INSERT en la nueva tabla. Si MySQL encuentra cualquier error en un renombrado mltiple, hace un renombrado inverso para todas las tablas renombradas para devolver todo a su estado original.
O:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[.*] [, tbl_name[.*] ...] USING table_references [WHERE where_definition]
647
Sintaxis de DELETE
DELETE borra los registros de tbl_name que satisfacen la condicin dada por where_definition, y retorna el nmero de registros borrados. Si realiza un comando DELETE sin clusula WHERE se borran todos los registros. Una forma ms rpida de hacerlo, cuando no quiere saber el nmero de registros borrados, se usa TRUNCATE TABLE. Consulte Seccin 13.2.9, Sintaxis de TRUNCATE. Si borra el registro conteniendo el mximo valor para una columna AUTO_INCREMENT , el valor se resa para una tabla BDB , pero no para tablas MyISAM o InnoDB . Si borra todos los registros en la tabla con DELETE FROM tbl_name (sin clusula WHERE ) en modo AUTOCOMMIT , la secuencia comienza para todos los tipos de tabla excepto para InnoDB y MyISAM. Hay algunas excepciones para este comportamiento para tablas InnoDB , como se discute en Seccin 15.6.3, Cmo funciona una columna AUTO_INCREMENT en InnoDB. Para tablas MyISAM y BDB , puede especificar una columna AUTO_INCREMENT secundaria en una clave de mltiples columnas. En este caso, el reso de valores borrados del inicio de la secuencia se realiza incluso para tablas MyISAM . Consulte Seccin 3.6.9, Utilizacin de AUTO_INCREMENT. El comando DELETE soporta los siguientes modificadores: Si especifica LOW_PRIORITY, la ejecucin de DELETE se retarda hasta que no hay ms clientes leyendo de la tabla. Para tablas MyISAM , si usa la palabra QUICK , el motor de almacenamiento no mezcla las hojas del ndice durante el borrado, que puede acelerar algunos tipos de operaciones de borrado. En MySQL 5.0, la palabra clave IGNORE hace que MySQL ignore todos los errores durante el proceso de borrar registros. (Los errores encontrados durante la etapa de parseo se procesan de la forma habitual.) Los errores que se ignoran debido al uso de esta opcin se retornan como advertencias. La velocidad de las operaciones de borrado pueden verse afectadas por factores discutidos en Seccin 7.2.16, Velocidad de sentencias DELETE. En tablas MyISAM , los registros borrados se mantienen en una lista enlazada y las operaciones INSERT siguientes resan antiguas posiciones de registro. Para reclamar espacio no usado y reducir tamao de fichero, use el comando OPTIMIZE TABLE o la utilidad myisamchk para reorganizar las tablas. OPTIMIZE TABLE es ms sencillo, pero myisamchk es ms rpido. Consulte Seccin 13.5.2.5, Sintaxis de OPTIMIZE TABLE y Seccin 5.8.3.10, Optimizacin de tablas. El modificador QUICK afecta si las hojas del ndice es mezclan en operaciones de borrado. DELETE QUICK es ms til para aplicaciones en que los valores del ndice para registros borrados se replazan con valores similares de registros insertados posteriormente. En este caso, los agujeros dejados por los valores borrados se resan. DELETE QUICK no es til cuando los valores borrados conducen a bloques de ndices no rellenos con un rango de valores ndice para el que vuelven a ocurrir nuevas inserciones. En este caso, el uso de QUICK puede conducir a un gasto de espacio que queda sin reclamar. Aqu hay un ejemplo de este escenario: 1. Cree una tabla que contenga una columna AUTO_INCREMENT indexada. 2. Inserta varios registros en la tabla. Cada insercin resulta en un valor ndice que se aade al final del ndice. 3. Borra un bloque de registros al final del rango de la columna usando DELETE QUICK. En este escenario, los bloques de ndice asociados con los valores de ndice borrado quedan sin rellenar pero no se mezclan con otros bloques de ndice debido al uso de QUICK. Quedan sin rellenar
648
Sintaxis de DELETE
cuando hay nuevas inserciones, ya que los nuevos registros no tienen valores ndice en el rango borrado. Adems, quedan sin rellenar incluso si luego usa DELETE sin QUICK, a no ser que algunos de los valores de ndice borrados estn en los bloques de ndice dentro o adyacentes a los bloques no rellenos. Para reclamar el espacio de ndice sin usar bajo estas circunstancias use OPTIMIZE TABLE. Si va a borrar varios registros de una tabla, puede ser ms sencillo usar DELETE QUICK seguido por OPTIMIZE TABLE. Esto reconstruye el ndice en lugar de realizar varias operaciones de mezcla de bloques de ndice. La opcin de MySQL LIMIT row_count para DELETE le dice al servidor el mximo nmero de registros a borrar antes de retornar el control al cliente. Esto puede usarse para asegurar que un comando DELETE especfico no tarada demasiado tiempo. Puede simplemente repetir el comando DELETE hasta que el nmero de registros afectados sea menor que el valor LIMIT . Si el comando DELETE incluye una clusula ORDER BY , los registros se borran en el orden especificado por la clusula. Esto es muy til slo en conjuncin con LIMIT. Por ejemplo, el siguiente ejemplo encuentra registros coincidentes con la clusula WHERE ordenados por timestamp_column, y borra el primero (el ms viejo).
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp_column LIMIT 1;
Puede especificar mltiples tablas en un comando DELETE para borrar registros de una o ms tablas dependiendo de una condicin particular en mltiples tablas. Sin embargo, no puede usar ORDER BY o LIMIT en un DELETE de mltiples tablas. La parte table_references lista las tablas involucradas en el join. Esta sintaxis se describe en Seccin 13.2.7.1, Sintaxis de JOIN. Para la primera sintaxis, slo los registros coincidentes de las tablas listadas antes de la clusula FROM se borran. Para la segunda sintaxis, slo los registros coincidentes de las tablas listadas en la clusula FROM (antes de la clusula USING ) se borran. El efecto es que puede borrar registros para varias tablas al mismo tiempo y tienen tablas adicionales que se usan para buscar:
DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
O:
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
Estos comandos usan las tres tablas al buscar registros a borrar, pero borrar los registros coincidentes slo para las tablas t1 y t2. Los ejemplos anteriores muestran inner joins usando el operador coma, pero comandos DELETE de varias tablas pueden usar cualquier tipo de join permitido por comandos SELECT tales como LEFT JOIN. La sintaxis permite .* tras los nombres de tabla para compatibilidad con Access. Si usa un comando DELETE de varias tablas incluyendo tablas InnoDB para las que hay restricciones de clave fornea, el optimizador MySQL puede procesar tablas en un orden ditinto del de su relacin padre/hijo. En este caso, el comando falla y se deshace. En su lugar, debe borrar de una tabla ncia y confiar en la capacidad de ON DELETE que proporciona InnoDB para hacer que las otras tablas se modifiquen correctamente. Nota: En MySQL 5.0, debe usar el alias (si se di) al referirse a un nombre de tabla: En MySQL 4.1:
DELETE t1 FROM test AS t1, test2 WHERE ...
649
Sintaxis de DO
Borrados cruzados entre bases de datos se soportan para borrados de varias tablas, pero en este caso, debe referirse a las tablas sin usar alias. Por ejemplo:
DELETE test1.tmp1, test2.tmp2 FROM test1.tmp1, test2.tmp2 WHERE ...
Actualmente, no puede borrar desde una tabla y seleccionar de la misma tabla en una subconsulta.
13.2.2. Sintaxis de DO
DO expr [, expr] ...
DO ejecuta la expresin pero no retorna ningn resultado. Esto es una abreviacin de SELECT expr, ..., pero tiene la ventaja que es ms rpido cuando no le importa el resultado. DO es til principalmente con funciones que tienen efectos colaterales, tales como RELEASE_LOCK().
El comando HANDLER proporciona acceso directo a las interfaces del motor de la tabla. En MySQL 5.0, est disponible para tablas MyISAM y InnoDB . El comando HANDLER ... OPEN abre una tabla, hacindola accesible mediante posteriores comandos HANDLER ... READ . Este objeto de tabla no se comparte con otros flujos y no se cierra hasta que el flujo llama HANDLER ... CLOSE o el flujo termina. Si abre la tabla usando un alias, referencias posteriores a la tabla con otros comandos HANDLER deben usar el alias en lugar del nombre de la tabla. La primera sintaxis HANDLER ... READ recibe un registro donde el ndice especificado satisface los valores dados y la condicin WHERE se cumple. Si tiene un ndice de mltiples columnas, especifique los valores de la columna ndice como una lista separada por comas. Los valores epecificados para todas las columnas en el ndice, o los valores especficos para un prefijo a la izquierda de las columnas ndice. Suponga que un ndice incluye tres columnas llamadas col_a, col_b, y col_c, en ese orden. El comando HANDLER puede especificar valores para las tres columnas en el ndice, o para las columnas en el prefijo a la izquierda. Por ejemplo:
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 segunda sintaxis HANDLER ... READ recibe un registro de la tabla en orden del ndice que cumple la condicin WHERE . La tercera sintaxis HANDLER ... READ recibe un registro de la tabla en orden de registro natural que cumple la condicin WHERE . Es ms rpido que HANDLER tbl_name READ index_name cuando se desea un escaneo completo de tabla. El orden de registro natural es el orden en que se almacenan los registros en un fichero de datos de una tabla MyISAM. Este comando funciona para tablas InnoDB tambin, pero no hay tal concepto porque no hay un fichero de datos separado. Sin una clusula LIMIT , todas las formas de HANDLER ... READ reciben un nico registros si una est disponible. Para retornar un nmero especfico de registros, incluya una clusula LIMIT . Tiene la misma sintaxis que para el comando SELECT . Consulte Seccin 13.2.7, Sintaxis de SELECT. HANDLER ... CLOSE cierra una tabla que se abri con HANDLER ... OPEN.
650
Sintaxis de INSERT
Nota: Para emplear la interfaz HANDLER para referirse a una tabla PRIMARY KEY, use el identificador `PRIMARY` entrecomillado:
HANDLER tbl_name READ `PRIMARY` > (...);
HANDLER es un comando de bajo nivel. Por ejemplo, no proporciona consistencia. Esto es, HANDLER ... OPEN no toma una muestra de la tabla, y no bloquea la tabla. Esto significa que tras un comando HANDLER ... OPEN realizado, los datos de la tabla pueden ser modificados (por este o por otro flujo) y estas modificaciones pueden aparecer slo parcialmente en escaneos HANDLER ... NEXT o HANDLER ... PREV . Hay varias razones para usar la interfaz HANDLER en lugar de comandos SELECT normales: HANDLER es ms rpido que SELECT: Un objeto de tratamiento de motor de almacenamiento designado se reserva para HANDLER ... OPEN. El objeto se resa para posteriores comandos HANDLER para esa tabla; no necesita reinicializarse para cada una. Hay menos parseo. No hay sobrecarga del chequeo de consultas ni optimizador. La tabla no tiene que estar bloqueada entre peticiones. La interfaz del handler no tiene que propocionar una vista de los datos consistente (por ejemplo, se permiten dirty reads), as que el motor puede usar optimizacin que SELECT no permite. HANDLER hace mucho ms fcil portar aplicaciones que usen una interfaz tipo ISAM a MySQL. HANDLER le permite consultar una base de datos de forma difcil o imposible de realizar con SELECT. La interfaz de HANDLER es una forma ms natural de consultar los datos cuando se trabaja con aplicaciones que proporcionan una interfaz de usuario interactiva a la base de datos.
O:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name SET col_name={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
O:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT ... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
INSERT inserta nuevos registros en una tabla existente. Las formas INSERT ... VALUES y INSERT ... SET del comando insertan registros basados en valores explcitamente especificados. La forma INSERT ... SELECT inserta registros seleccionados de otra tabla o tablas. INSERT ... SELECT se discute en Seccin 13.2.4.1, Sintaxis de INSERT ... SELECT. tbl_name es la tabla en que los registros deben insertarse. Las columnas para las que el comando proporciona valores pueden especificarse como sigue: La lista de nombres de columna o la clusula SET indican las columnas explcitamente.
651
Sintaxis de INSERT
Si no especifica la lista de columnas para INSERT ... VALUES o INSERT ... SELECT, los valores para cada columna en la tabla deben proporcionarse en la lista VALUES o por el SELECT. Si no sabe el orden de las columnas en la tabla, use DESCRIBE tbl_name para encontrarlo. Los valores de columna pueden darse de distintos modos: Si no est ejecutando el modo estricto, cualquier columna que no tenga un valor asignado explcitamente recibe su valor por defecto (explcito o implcito). Por ejemplo, si especifica una lista de columnas que no nombra todas las columnas en la tabla, las no nombradas reciben sus valores por defecto. Los valores por defecto asignados se describen en Seccin 13.1.5, Sintaxis de CREATE TABLE. Consulte Seccin 1.7.6.2, Restricciones (constraints) sobre datos invlidos. Si quiere que un comando INSERT genere un error a no ser que especifique explcitamente valores para todas las columnas que no tienen un valor por defecto, debe usar modo STRICT . Consulte Seccin 5.3.2, El modo SQL del servidor. Use DEFAULT para asignar a una columna explcitamente su valor por defecto. Esto hace ms fcil escribir comandos INSERT que asignan valores a todas las columnas excepto unas pocoas, ya que le permite evitar la escritura de una lista de valores VALUES incompleta. De otro modo, tendra que escribir la lista de los nombres de columna correspondientes a cada valor en la lista VALUES . En MySQL 5.0, puede usar DEFAULT(col_name) como forma ms general que puede usarse en expresiones para producir un valor por defecto de una columna. Si la lista de columnas y la lista VALUES estn vacas, INSERT crea un registro con cada conjunto de columnas con sus valores por defecto:
mysql> INSERT INTO tbl_name () VALUES();
En modo STRICT obtendr un error si una columna no tiene un valor por defecto. De otro modo, MySQL usar el valor implcito para cualquier columna sin un valor explcito por defecto definido. Puede especificar una expresin expr para proporcionar un valor de columna. Esto puede involucar convesin de tipos si el tipo de la expresin no coincide con el tipo de la columna, y la conversin de un valor dado puede resultar en distintos valores insertados dependiendo del tipo de columna. Por ejmplo, insertar la cadena '1999.0e-2' en una columna INT, FLOAT, DECIMAL(10,6), o YEAR resulta en los valores 1999, 19.9921, 19.992100, y 1999 insertados, respectivamente. La razn de que el valor almacenado en las columnas INT y YEAR sea 1999 es que la conversin cadenaa-entero consulta slo el trozo de la parte inicial de la cadena que se puede considerar como un entero vlido o ao. Para las columnas de coma flotante o punto fijo, la conversin cadena-a-comaflotante considera la cadena entera un valor vlido. Una expresin expr puede referirse a cualquier columna que se haya asignado antes en una lista de valores. Por ejemplo, puede hacer esto porque el valor para col2 se refiere a col1, que se ha asignado prviamente:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
Pero lo siguiente no es legal, ya que el valor para col1 se refiere a col2, que se asigna tras col1:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);
Una excepcin involucra a columnas que contienen valores AUTO_INCREMENT . Como el valor AUTO_INCREMENT se genera tras otras asignaciones de valores, cualquier referencia a una columna AUTO_INCREMENT en la asignacin retorna un 0. El comando INSERT soporta los siguientes modificadores: Si usa la palabra DELAYED, el servidor pone el registro o registros a ser insertados en un bffer, y el cliente realizando el comando INSERT DELAYED puede continuar. Si la tabla est en uso, el servidor trata los registros. Cuando la tabla se libera, el servidor comienza a insertar registros,
652
Sintaxis de INSERT
chequeando peridicamente para ver si hay alguna peticin de lectura para la tabla. Si la hay, la cola de registros retardados se suspende hasta que la tabla se libera de nuevo. Consulte Seccin 13.2.4.2, Sintaxis de INSERT DELAYED. Si usa la palabra LOW_PRIORITY , la ejecucin de INSERT se retrasa hasta que no hay otros clientes leyendo de la tabla. Esto incluye a otros clientes que comiencen a leer mientras que los clientes existentes estn leyendo, y meintras el comando INSERT LOW_PRIORITY est en espera. Es posible, por lo tanto, para un cliente que realice un comando INSERT LOW_PRIORITY esperar durante mucho tiempo (o incluso para siempre) en un entorno de muchas lecturas. (Esto es un contraste de INSERT DELAYED, que deja al cliente continuar. Consulte Seccin 13.2.4.2, Sintaxis de INSERT DELAYED.) Tenga en cuenta que LOW_PRIORITY no debe usarse normalmente con tablas MyISAM y que hacerlo deshabilita inserciones concurrentes. Consulte Seccin 14.1, El motor de almacenamiento MyISAM. Si especifica HIGH_PRIORITY, deshabilita el efecto de la opcin --low-priority-updates si el servidor se arranc con esa opcin. Hace que las insecionces concurrentes no se usen. Los valores afectados por un INSERT pueden usarse usando la funcin mysql_affected_rows() de la API de C. Consulte Seccin 24.2.3.1, mysql_affected_rows(). Si usa la palabra IGNORE en un comando INSERT , los errores que ocurren mientras se ejecuta el comando se tratan como advertencias. Por ejemplo, sin IGNORE, un registro que duplique un ndice UNIQUE existente o valor PRIMARY KEY en la tabla hace que un error de clave duplicada en el comando se aborte. Con IGNORE, el registro todava no se inserta, pero no se muestra error. Las conversionse de datos dispararan errores y abortaran el comando si no se sepecificara IGNORE . Con IGNORE, los valores invlidaos se ajustan al valor ms cercano y se insertan; las advertencias se producen pero el comando no se aborta. Puede determinar con la funcin mysql_info() de la API de C cuntos registros se insertan realmente en la tabla. Si especifica ON DUPLICATE KEY UPDATE, y se inserta un registro que duplicara un valor en un ndice UNIQUE o PRIMARY KEY, se realiza un UPDATE del antiguo registro. Por ejemplo, si la columna a se declara como UNIQUE y contiene el valor 1, los siguientes dos comandos tienen efectos idnticos:
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;
El valor de registros afectados es 1 si el registros se inserta como un nuevo registro y 2 si un valor existente se actualiza. Nota: Si la columna b es nica, el INSERT sera equivalente a este comando UPDATE :
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
Si a=1 OR b=2 se cumple para varios registros, slo un registro se actualiza. En general, debera intentar evitar usar una clusula ON DUPLICATE KEY en tablas con claves nicas mltiples. MySQL 5.0 permite el uso de la funcin VALUES(col_name) en la clusula UPDATE que se refiere a los valores de columna de la porcin INSERT del comando INSERT ... UPDATE . En otras palabras, VALUES(col_name) en la clusula UPDATE se refiere al valor de col_name que se insertaran, no ocurre conflicto de clave duplicada. Esta funcin es especialmente til en inserciones de mltiples registros. La funcin VALUES() tiene sentido slo en comandos INSERT ... UPDATE y retorna NULL de otro modo. Ejemplo:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
653
Sintaxis de INSERT
-> ON DUPLICATE KEY UPDATE c=3; mysql> INSERT INTO table (a,b,c) VALUES (4,5,6) -> ON DUPLICATE KEY UPDATE c=9;
Cuando usa ON DUPLICATE KEY UPDATE, la opcin DELAYED se ignora. Puede encontrar el valor usado para una columna AUTO_INCREMENT usando la funcin SQL LAST_INSERT_ID() . Desde la API C, use la funcin mysql_insert_id() . Sin embargo, debe tener en cuenta que las dos funciones no siempre se comportan idnticamente. El comportamiento de comandos INSERT respecto a columnas AUTO_INCREMENT se discute en Seccin 12.9.3, Funciones de informacin y Seccin 24.2.3.34, mysql_insert_id(). Si usa un comando INSERT ... VALUES con listas de mltiples valores o INSERT ... SELECT, el comando retorna una cadena de informacin en este formato:
Records: 100 Duplicates: 0 Warnings: 0
Records indica el nmero de registros procesados por el comando. (Este no es necesariamente el nmero de registros realmente insertados, ya que Duplicates puede ser distinto a cero.) Duplicates indica el nmero de registros que no pueden insertarse ya que duplicaran algunos valores de ndice nicos existentes Warnings indicata el nmero de intentos para insertar valores de columna que fueron problemticos por algo. Las advertencias pueden ocurrir bajo cualquiera de las siguientes condiciones: Insertar NULL en una columna que se ha declarado NOT NULL. Para comandos INSERT de mltiples columnas o comandos INSERT INTO... SELECT, la columna se asigna con el valor por defecto para el tipo de datos de la columna. Este es 0 para tipos numricos, la cadena vaca ('') para tipos de cadenas, y el valor cero para tipos de fecha y hora. Los comandos INSERT INTO ... SELECT se tratan del mismo modo que inserciones de mltiples registros porque el servidor no examina el resultado del SELECT para ver si retorna o no un nico registro. (para un nico registro INSERT, no hay ninguna advertencia cuando NULL se inserta en una columna NOT NULL . En lugar de eso, el comando falla con un error.) Poner en una columna numrica un valor fuera del rango de la columna. El valor se redondea al punto final del rango ms cercano. Asigne un valor tal como '10.34 a' a una columna numrica. El texto final se elimina y la parte numrica se inserta. Si el valor de cadena no tiene parte inicial numrica, la columna se pone a 0. Insertar una cadena en una columna de cadena (CHAR, VARCHAR, TEXT, o BLOB) que excede la maxima longitud de la columna. El valor se trunca a la mxima longitud de la columna. Insertar un valor en una columna de fecha u hora que es ilegal para el tipo de la columna. La columna se asigna con el valor cero apropiado para el tipo. Si usa la API de C, la cadena de informacin puede obtenerse invocando la funcin mysql_info() Consulte Seccin 24.2.3.32, mysql_info().
Con INSERT ... SELECT, puede insertar rpidamente varios registros en un atabla desde una o varias tablas. Por ejemplo:
INSERT INTO tbl_temp2 (fld_id) SELECT tbl_temp1.fld_order_id
654
Sintaxis de INSERT
La siguiente condicin sirve para un comando INSERT ... SELECT : En MySQL 5.0, especifique IGNORE explcitamente para ignorar registros que causaran violaciones de clave duplicada. No use DELAYED con INSERT ... SELECT. En MySQL 5.0, la tabla objetivo del comando INSERT puede aparecer en la clusula FROM de la parte SELECT de la consulta. (Esto no era posible en algunas versiones antiguas de MySQL.) Las columnas AUTO_INCREMENT funcionan normalmente. Para asegurar que el log binario puede usarse para recrear las tablas originales, MySQL no permite inserciones concurrentes durante INSERT ... SELECT. Actualmente, no puede insertar en una tabla y seleccionar de la misma tabla en una subconsulta. En las partes de valores de ON DUPLICATE KEY UPDATE puede referirse a una columna en otras tablas, mientras no use GROUP BY en la parte SELECT . Un efecto lateral es que debe calificar los nombres de columna no nicos en la parte de valores. Puede usar REPLACE en lugar de INSERT para sobreescribir registros antiguos REPLACE es la contraparte de INSERT IGNORE en el tratamiento de nuevos registros que contienen valores de clave nica que duplican registros antiguos: Los nuevos registros se usan para reemplazar los antiguos registros en lugar de descartarlos.
La opcin DELAYED para el comando INSERT es una extensin de MySQL del estndar SQL muy til si tiene clientes que no pueden esperar a que se complete el INSERT . Este es un problema comn cuando usa MySQL para loguear y peridicamente ejecuta comandos SELECT y UPDATE que tardan mucho tiempo en completarse. Cuando un cliente usa INSERT DELAYED, obtiene un ok del servidor una vez, y el registro se encola para insertarse cuando la tabla no est en uso por otro flujo. Otro beneficio de usar INSERT DELAYED es que las inserciones desde varios clientes se tratan juntas y se escriben en un bloque. Esto es mucho ms rpido que realizar inserciones separadas. Hay algunas restricciones al uso de DELAYED: En MySQL 5.0, INSERT DELAYED funciona slo con tablas MyISAM y MEMORY . Para tablas MyISAM , si no hay bloques libres en medio del fichero de datos, se soportan comandos SELECT y INSERT concurrentes. Bajo estas circunstncias, muy raramente necesitar usar INSERT DELAYED con MyISAM. Consulte Seccin 14.1, El motor de almacenamiento MyISAM y Seccin 14.3, El motor de almacenamiento MEMORY (HEAP). En MySQL 5.0, INSERT DELAYED debe usarse slo para comandos INSERT que especifiquen una lista de valores. El servidor ignora DELAYED para comandos INSERT DELAYED ... SELECT . El servidor ignora DELAYED para comandos INSERT DELAYED ... ON DUPLICATE UPDATE. Debido a que el comando retorna inmediatamente antes que los registros se inserten, no puede usar LAST_INSERT_ID() para obtener el valor AUTO_INCREMENT que el comando genera. Los registros DELAYED no son visibles por los comandos SELECT hasta que se hayan insertado realmente.
655
Sintaxis de INSERT
DELAYED se ignora en la replicacin de esclavos porque puede causar que el esclavo tenga distintos datos que el maestro. Tenga en cuenta que los registros encolados se tratan slo en memoria hasta que se insertan en la tabla. Esto significa que si termina mysqld forzadamente (por ejemplo, con kill -9) o si mysqld muere inesperadamente, cualquier registro encolado que no se escriba en disco se pierde. A continuacin se describe en detalle qu ocurre cuando usa la opcin DELAYED con INSERT o REPLACE. En esta descriin, el flujo es el flujo que recibe un comando INSERT DELAYED y handler es el flujo que trata todos los comandos INSERT DELAYED para una tabla particular. Cuando un flujo ejecuta un comando DELAYED para una tabla, un flujo handler se crea para procesar todos los comandos DELAYED para la tabla, si tal handler no exista prviamente. El flujo chequea si el handler ha adquirido prviamente un bloqueo DELAYED ; si no, le dice al flujo handler que lo haga. El bloqueo DELAYED puede obtenerse incluso si otros flujos tienen el bloqueo READ o WRITE en la tabla. Sin embargo, el handler espera a todos los bloqueos ALTER TABLE o FLUSH TABLES para asegurar que la estructura de tabla est actualizada. El flujo ejecuta el comando INSERT, pero en lugar de escribir el registro en la tabla, pone una copia del registro final en una cola administrada por el flujo handler. Cualquier error de sintaxis es detectado por el flujo y se reporta al programa cliente. El cliente no puede obtener del servidor el nmero de registros duplicados o el valor AUTO_INCREMENT del registro resultante, ya que INSERT retorna antes que se complete la operacin de insercin. (Si usa la API C, la funcin mysql_info() no retorna nada inteligible por la misma razn.) El log binario se actualiza por parte del flujo handler cuando el registro se inserta en la tabla. En caso de inserciones de mltiples registros, el log binario se actualiza cuando el primer registro se inserta. Tras cada delayed_insert_limit los registros se escriben, el handler chequea si algn comando SELECT todava est pendiente. Si es as, les permite ejecutarse antes de continuar. Cuando el handler no tiene ms registros en su cola, la tabla se desbloquea. Si no se reciben nuevos comandos INSERT DELAYED en delayed_insert_timeout segundos, el handler termina. Si ms de delayed_queue_size registros estn pendientes en una cola de handler especfica, el flujo que pida el INSERT DELAYED espera hasta que haya espacio en la cola. Esto se hace para asegurar que mysqld no usa toda la memoria para la cola de memoria retrasada. El flujo handler se muestra en l lista de procesos MySQL con delayed_insert en la columna Command . Si muere si ejecuta un comando FLUSH TABLES o puede matarlo con KILL thread_id. Sin embargo, antes de salir, primero almacena todos los registros encolados en la tabla. Durante esta operacin no acepta ningn nuevo comando INSERT de otros flujos. Si ejecuta un comando INSERT DELAYED a continuacin, se crea un nuevo flujo handler. Tenga en cuenta que esto significa que comandos INSERT DELAYED tienen mayor prioridad que comandos INSERT normales si hay un handler INSERT DELAYED en ejecucin. Otros comandos de actualizacin tienen que esperar hast que la cola INSERT DELAYED est vaca, alguien termine el flujo handler (con KILL thread_id), o alguien ejecute un FLUSH TABLES. Las siguientes variables de estado proporcionan informacin acerca de comandos INSERT DELAYED : Variable de estado Delayed_insert_threads Delayed_writes Significado Nmero de flujos handler Nmero de registros escritos con INSERT DELAYED
656
Not_flushed_delayed_rows
Puede ver estas variables ejecutando un comando SHOW STATUS o mysqladmin extendedstatus. Tenga en cuenta que INSERT DELAYED es ms lento que un INSERT normal si la tabla no est en uso. Tambin hay una sobrecarga adicional para el servidor debido a que tiene que tratar un flujo separado para cada tabla en que haya registros retardados. Esto significa que debe usar INSERT DELAYED slo cuando est realmente seguro que lo necesita.
El comando LOAD DATA INFILE lee registros desde un fichero de texto a una tabla a muy alta velocidad. El nombre de fichero debe darse como una cadena literal. Para ms informacin acerca de la eficiencia de INSERT contra LOAD DATA INFILE y acelerar LOAD DATA INFILE, consulte Seccin 7.2.14, Velocidad de la sentencia INSERT. En MySQL 5.0, el conjunto de caracteres indicado por la variable de sistema character_set_database se usa para interpretar la informacin en el fichero. SET NAMES y el valor de character_set_client no afecta la interpretacin de la entrada. Puede cargar ficheros de datos usando la utilidad mysqlimport ; opera enviando un comando LOAD DATA INFILE al servidor. La opcin --local hace que mysqlimport lea ficheros de datos desde el equipo cliente. Puede especificar la opcin --compress para obtener un mejor rendimiento en redes lentas si el cliente y el servidor soportan el protocolo comprimido. Consulte Seccin 8.9, El programa para importar datos mysqlimport. Si usa LOW_PRIORITY, la ejecucin del comando LOAD DATA se retarda hasta que no haya ms clientes leyendo de la tabla. Si especifica CONCURRENT con una tabla MyISAM que satisfaga la condicin para inserciones concurrentes (esto es, no contiene bloques libres en medio), entonces otros flujos pueden recibir datos desde la tabla mientras se ejecuta LOAD DATA . Usar esta opcin afecta al rendimiento de LOAD DATA ligeramente, incluso si no hay otro flujo usando la tabla al mismo tiempo. Si se especifica LOCAL, se interpreta respecto al cliente final de la conexin: Si especificamos LOCAL, el programa cliente lee el fichero en el equipo cliente y lo enva al servidor. Podemos indicar la ruta completa del fichero para especificar su localizacin exacta. Si indicamos la ruta relativa, el fichero se interpreta relativo al directorio en el que el cliente se inici. Si no se especifica LOCAL , el fichero tiene que estar en el equipo servidor y el servidor lo lee directamente. Al localizar ficheros en el equipo servidor, el servidor usa las siguientes reglas: Si se da una ruta absoluta, el servidor usa la ruta como tal.
657
Si se da una ruta relativa con uno o ms componentes, el servidor busca este fichero relativo al directorio de datos del servidor. Si se da un nombre de fichero sin ninguna ruta, el servidor busca el fichero en el directorio de base de datos de la base de datos por defecto. Tenga en cuenta que estas reglas significan que un fichero llamado ./myfile.txt se lee del directorio de datos del servidor, mientras que el mismo fichero llamado como myfile.txt se lee desde el directorio de base de datos de la base de datos por defecto. Por ejemplo, el siguiente comando LOAD DATA lee el fichero data.txt del directorio de la base de datos para db1 porque db1 es la base de datos actual, incluso si el comando carga explcitamente el fichero en una tabla en la base de datos db2:
mysql> USE db1; mysql> LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
Tenga en cuenta que las rutas de windows se especifican usando barras en lugar de antibarras. Si usa barras, debe doblarlas. Por razones de seguridad, al leer ficheros de texto localizados en el servidor, los ficheros deben residir en el directorio de la base de datos o ser lebles por todo el mundo. Adems, para usar LOAD DATA INFILE en ficheros del servidor, debe tener el permiso FILE . Consulte Seccin 5.6.3, Privilegios de los que provee MySQL. Usar LOCAL es un poco ms lento que dejar al servidor acceder al fichero directamente, porque el contenido del fichero debe enviarse por la conexin desde el cliente al servidor . Por otra parte, no necesita el permiso FILE para cargar ficheros locales. En MySQL 5.0, LOCAL funciona slo si su servidor y su cliente lo tienen activado. Por ejemplo, si mysqld se arranca con --local-infile=0, entonces LOCAL no funciona. Consulte Seccin 5.5.4, Cuestiones relacionadas con la seguridad y LOAD DATA LOCAL. Si necesita LOAD DATA para leer desde un pipe, puede usar la siguiente tcnica (aqu cargamos el listado del directorio / en una tabla):
mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x find / -ls > /mysql/db/x/x mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x
Las palabaras REPLACE y IGNORE controlan el tratamiento de registros de entrada que duplican registros existentes en claves nicas. Si especifica REPLACE, los registros de entrada reemplazan registros existentes (en otras palabras, los registros que tienen el mismo valor para una clave primaria o nica que un registro existente). Consulte Seccin 13.2.6, Sintaxis de REPLACE. Si especifica IGNORE, los registros de entrada que dupliquen un registro existente en una clave nica se ignoran. Si no especifica ninguna opcin, el comportamiento depende de si la palabra LOCAL se ha especificado o no. Sin LOCAL, ocurre un error cuando se encuentra un valor de clave duplicado, y el resto del fichero de texto se ignora. Con LOCAL, el comportamiento por defecto es el mismo que si se especifica IGNORE, esto es porque el servidor no tiene forma de parar la transmisin del fichero en medio de la operacin. Si quiere ignorar restricciones de clave fornea durante la operacin de carga, puede realizar un comando SET FOREIGN_KEY_CHECKS=0 antes de ejecutar LOAD DATA. Si usa LOAD DATA INFILE en una tabla vaca MyISAM , todos los ndices no nicos se crean en batch separados (como para REPAIR TABLE). Esto hace LOAD DATA INFILE mucho ms rpido cuando tiene varios ndices. Normalmente esto es muy rpido, pero en algunos casos extromos, puede crear los ndices incluso ms rpido desactivndolos con ALTER TABLE ... DISABLE KEYS
658
antes de cargar el fichero en la tabla y usar ALTER TABLE ... ENABLE KEYS para recrear los ndices tras cargar el fichero. Consulte Seccin 7.2.14, Velocidad de la sentencia INSERT. LOAD DATA INFILE es el complemento de SELECT ... INTO OUTFILE. (Consulte Seccin 13.2.7, Sintaxis de SELECT.) Para escribir datos de una tabla en un fichero use SELECT ... INTO OUTFILE. Para leer el fichero de nuevo en una tabla, use LOAD DATA INFILE. La sintaxis de las clusulas FIELDS y LINES es la misma para ambos. Ambas son opcionales, pero FIELDS debe preceder a LINES si se especifican ambas. Si especifica una clusula FIELDS , cada una de sus subclusulas (TERMINATED BY, [OPTIONALLY] ENCLOSED BY, y ESCAPED BY) tambin es opcional, excepto que debe especificar al menos una de ellas. Si no especifica una clusula FIELDS, por defecto es como si hubiera escrito esto:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
Si no especifica una clusula LINES, por defecto es como si hubiera escrito esto:
LINES TERMINATED BY '\n' STARTING BY ''
En otras palabras, por defecto LOAD DATA INFILE acta como sigue al leer la entrada: Busca delimitadores de lnea como nuevas lneas. No ignora ningn prefijo de lnea. Rompe las lneas en campos con los tabuladores. No espera campos entrecomillados dentro de ningn carcter delimitador. Interpreta las ocurrencias de tabuladores, nuevas lneas o '\' precedidas por '\' como caracteres literales que son parte de valores de campos. Por defecto SELECT ... INTO OUTFILE acta como sigue al escribir la salida: Escribe tabuladores entre campos. No entrecomilla los campos. Usa '\' para escapar las instancias de tabuladores, nuevas lneas o '\' que ocurren entre valores de campos. Escribe nuevas lneas al final de las lneas. Tenga en cuenta que para escribir FIELDS ESCAPED BY '\\', debe escribir dos antibarras para que se interprete como una nica antibarra. Nota: Si ha generado el fichero de texto en un sistema Windows , puede tener que usar LINES TERMINATED BY '\r\n' para leer correctamente el fichero, ya que los programas de Windows tpicamente usan dos caracteres como terminadores de lnea . Algunos programas como WordPad, pueden usar \r como terminador de lnea al escribir ficheros. Para leer tales ficheros, use LINES TERMINATED BY '\r'. Si todas las lneas que quiere leer tienen un prefijo comn que quiere ignorar, puede usar LINES STARTING BY 'prefix_string' para ignorar el prefijo (y cualquier cosa antes del mismo). Si una lnea no incluye el prefijo, la lnea entera se ignora. Nota prefix_string puede ocurrir en medio de una lnea. Ejemplo:
mysql> LOAD DATA INFILE '/tmp/test.txt' -> INTO TABLE test LINES STARTING BY "xxx";
659
Y obtener los datos ("row",1) y ("row",2). La opcin IGNORE number LINES puede usarse para ignorar lneas al inicio del fichero. Por ejemplo, puede usar IGNORE 1 LINES para ignorar una cabecera inicial que contenga los nombres de las columnas:
mysql> LOAD DATA INFILE '/tmp/test.txt' -> INTO TABLE test IGNORE 1 LINES;
Cuando usa SELECT ... INTO OUTFILE junto con LOAD DATA INFILE para escribir datos desde una base de datos en un fichero y luego lee datos del fichero de nuevo en la base de datos, las opciones de tratamiento de fichero y de lnea para ambos comandos deben coincidir. De otro modo, LOAD DATA INFILE no interpreta los contenidos del fichero correctamente. Suponga que usa SELECT ... INTO OUTFILE para escribir un fichero con campos delimitados por comas:
mysql> SELECT * INTO OUTFILE 'data.txt' -> FIELDS TERMINATED BY ',' -> FROM table2;
Si en lugar de esto trata de leer en el fichero con el comando mostrado aqu, no funcionara porque le dice a LOAD DATA INFILE que busque tabuladores entre campos:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2 -> FIELDS TERMINATED BY '\t';
El resultado esperado es que cada lnea de entrada se interprete como un nico campo. LOAD DATA INFILE puede usarse para leer ficheros obtenidos de fuentes externas. Por ejemplo, un fichero en formato dBASE tiene campos separados por comas y entrecomillados por comillas dobles. Si las lneas en el fichero se terminan con nuevas lneas, el comando mostrado aqu ilustra las opciones de campo y lnea que debera usar para cargar el fichero:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name -> FIELDS TERMINATED BY ',' ENCLOSED BY '"' -> LINES TERMINATED BY '\n';
Cualquiera de las opciones de tratamiento de campo o lnea pueden especificarse como una cadena vaca (''). Si no est vaca, los valores FIELDS [OPTIONALLY] ENCLOSED BY y FIELDS ESCAPED BY deben ser un nico carcter. Los valores FIELDS TERMINATED BY, LINES STARTING BY, y LINES TERMINATED BY pueden tener ms de un carcter . Por ejemplo, para escribir lneas terminadas por parejas de retorno de carro y nueva lnea, o para leer un fichero conteniendo tales lneas, especifique una clusula LINES TERMINATED BY '\r\n' . Para leer un fichero que contenga bromas separadas por lneas consistentes de %%, puede hacer lo siguiente
mysql> -> -> mysql> -> -> CREATE TABLE jokes (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joke TEXT NOT NULL); LOAD DATA INFILE '/tmp/jokes.txt' INTO TABLE jokes FIELDS TERMINATED BY '' LINES TERMINATED BY '\n%%\n' (joke);
FIELDS [OPTIONALLY] ENCLOSED BY controla el entrecomillado de los campos. Para la salida (SELECT ... INTO OUTFILE), si omite la palabra OPTIONALLY, todos los campos se delimitan por
660
el carcter ENCLOSED BY. Un ejemplo de tal salida (usando coma como el delimitador de campo) se muestra aqu:
"1","a "2","a "3","a "4","a string","100.20" string containing a , comma","102.20" string containing a \" quote","102.20" string containing a \", quote and comma","102.20"
Si especifica OPTIONALLY, el carcter ENCLOSED BY se usa slo para delimitar valores en columnas que tienen datos de cadenas (tales como CHAR, BINARY, TEXT, o ENUM):
1,"a 2,"a 3,"a 4,"a string",100.20 string containing a , comma",102.20 string containing a \" quote",102.20 string containing a \", quote and comma",102.20
Tenga en cuenta que la ocurrencias del carcter ENCLOSED BY dentro de un campo se escapan mediante un prefijo del carcter ESCAPED BY. Tambin tenta en cuenta que si especifica un valor ESCAPED BY vaco, es posible generar salida que no puede leerse correctamente con LOAD DATA INFILE. Por ejemplo, la salida precedente tendra la siguiente apariencia si el carcter de escape estuviera vaco. Observe que el segundo campo en la cuarta lnea contiene una coma siguiendo la delimitacin, que (errneamente) parece que termine el campo:
1,"a 2,"a 3,"a 4,"a string",100.20 string containing a , comma",102.20 string containing a " quote",102.20 string containing a ", quote and comma",102.20
Para entrada, el carcter ENCLOSED BY , si est presente, se elimina del final de los valores de campos . (Esto es cierto se especifique OPTIONALLY o no; OPTIONALLY no tiene efecto en la interpretacin de la entrada.) Las ocurrencias del carcter ENCLOSED BY prececdidas por el carater ESCAPED BY se interpretan como parte del campo actual. Si el campo comienza con el carcter ENCLOSED BY , las instancias del mismo se reorganizan como terminadores del campo slo si van seguidas por el campo o la secuencia TERMINATED BY . Para evitar ambigedad, las ocurrencias del carcter ENCLOSED BY dentro de un campo se pueden doblar y se interpretan como una nica instancia del carcter. Por ejemplo, si se especifica ENCLOSED BY '"' , la delimitacin se trata como se muestra aqu:
"The ""BIG"" boss" The "BIG" boss The ""BIG"" boss -> The "BIG" boss -> The "BIG" boss -> The ""BIG"" boss
FIELDS ESCAPED BY controla cmo escribir o leer caracteres especiales. Si el carcter FIELDS ESCAPED BY no est vaco, se usa como prefijo para los siguientes caracteres de salida: El carcter FIELDS ESCAPED BY El carcter FIELDS [OPTIONALLY] ENCLOSED BY El primer carcter de los valores FIELDS TERMINATED BY y LINES TERMINATED BY ASCII 0 (lo que realmente se escribe a continuacin del carcter de escape es '0' en ASCCI, no un byte con valor cero) Si el carcter FIELDS ESCAPED BY est vaco, no se escapan caracteres y NULL se muestra como NULL, no \N. Probablemente no es una buena idea especificar un carcter de escape vaco, particularmente si los valores de campos en sus datos contienen cualquiera de los caracteres en la lista dada. Para entrada, si el carcter FIELDS ESCAPED BY no est vaco, las ocurrencias del mismo se eliminan y el siguiente carcter se toma literalmente como parte del campo. Las excepciones son un '0' escapado o 'N' (por ejemplo, \0 o \N si el carcter de escape es '\'). Estas secuencias se interpretan como ASCII NUL (un byte con valor cero) y NULL. Las reglas para tratamiento de NULL se describen posteriormente.
661
Para ms infomacin de la sintaxis de escape '\' consulte Seccin 9.1, Valores literales. En ciertos casos, las opciones de tratamiento de campos y lnea interactan: Si LINES TERMINATED BY es una cadena vaco y FIELDS TERMINATED BY no est vaco, las lneas se terminan con FIELDS TERMINATED BY. Si los valores FIELDS TERMINATED BY y FIELDS ENCLOSED BY estn vacois (''), se usa un formato fijo de registro (no delimitado). Con este formato, no se usan delimitadores entre campos (pero puede tener un terminador de lnea). En su lugar, los valores de columna se escriben y leen usando los anchos de muestra de las columnas. Por ejemplo, si una columna se declara como INT(7), los valores para la columna se escriben usando campos de siete caracteres. En la entrada, los valores para la columna se obtienen leyendo siete caracteres. LINES TERMINATED BY se usa para separar lneas. Si una lnea no contiene todos los campos, el resto de columnas se asignan con sus valores por defecto. Si no tiene un terminador de lnea, debe asignarlo a ''. En este caso, el fichero de texto debe contener todos los campos para cada registro. El formato fijo de registro tambin afecta al tratamiento de valores NULL, como se describe posteriormente. Tenga en cuenta que el formato de tamao fijo no funciona si est usando un conjunto de caracteres multi byte. El tratamiento de valores NULL vara en funcin de las opciones FIELDS y LINES en uso: Para los valores FIELDS y LINES por defecto, NULL se escribe como \N para la salida, y \N para la entrada se lee como NULL (considerando que el carcter ESCAPED BY es '\'). Si FIELDS ENCLOSED BY no est vaclo, un campo que contenga el literal NULL como valor se lee como el valor NULL . Esto difiere de la palabra NULL delimitada por caracteres FIELDS ENCLOSED BY , que se lee como la cadena 'NULL'. Si FIELDS ESCAPED BY est vaco, NULL se escribe como la palabra NULL. Con formato fijo de registro (lo que ocurre cuando FIELDS TERMINATED BY y FIELDS ENCLOSED BY estn vacos), NULL se escribe como una cadena vaca. Teng en cuenta que esto hace que ambos valores NULL y cadenas vacas en la tabla sean indistinguibles cuando se escriben en el fichero ya que ambos se escriben como cadenas vacas. Si necesita distinguir entre ambos al leer del fichero, no debe usar el formato de registro fijo. Algunos casos no son soportados por LOAD DATA INFILE: Registros de tamao fijo (FIELDS TERMINATED BY y FIELDS ENCLOSED BY ambos vacos) y columnas BLOB o TEXT . Si especifica un separador que es igual o prefijo de otro, LOAD DATA INFILE no ser capaz de interpretar la entrada correctamente. Por ejemplo, la siguiente clusula FIELDS causara problemas:
FIELDS TERMINATED BY '"' ENCLOSED BY '"'
Si FIELDS ESCAPED BY est vaco, un valor que contenga una ocurrencia de FIELDS ENCLOSED BY o LINES TERMINATED BY seguido por el valor FIELDS TERMINATED BY causa que LOAD DATA INFILE pare de leer un campo o lnea demasiado rpido. Esto ocurre porque LOAD DATA INFILE no puede determinar apropiadamente dnde acaba el campo o lnea. El siguiente ejemplo carga todas las columnas de la tabla persondata :
mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
Por defecto, cuando no se proporciona una lista al final de un comando LOAD DATA INFILE, las lneas de entrada se espera que contengan un campo para cada columna de la tabla. Si quiere cargar slo algunas columnas de una tabla, especifique una lista de columnas:
mysql> LOAD DATA INFILE 'persondata.txt'
662
->
Debe especificar una lista de columnas si el orden de los campos del fichero de entrada difiere del orden de las columnas en la tabla. De otro modo, MySQL no puede decir cmo hacer coincidir los campos de entrada con las columnas de la tabla. Antes de MySQL 5.0.3, la lista de columnas debe contener slo nombres de columnas en la tabla que se carga, y la clusula SET no se soporta. Desde MySQL 5.0.3, la lista de columnas puede contener nombres de columna o variables y la clusula SET se soporta. Esto le permite asignar valores de entrada a variables de usuario, y luego realizar transformaciones on estos valores antes de asignar los resultados a las columnas. Las variables de usuario en la clusula SET puede usarse de distintos modos. El siguiente ejemplo usa la primera columna en el fichero de datos directamente para el valor de t1.column1, y asigna la segunda columna a una variable de usuario que est sujeta a una operacin de divisin antes de ser usada por el valor de t2.column2:
LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @var1) SET column2 = @var1/100;
La clusula SET puede usarse para proporcionar valores no derivados del fichero de entrada. Los siguientes comandos actualizan column3 con la fecha y hora actuales:
LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, column2) SET column3 = CURRENT_TIMESTAMP;
Tambin puede descartar un valor de entrada asignndolo a una variable de usuario y no asignando la variable a una columna de tabla:
LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @dummy, column2, @dummy, column3);
El uso de la lista de columnas/variables y la clusula SET est sujeto a las siguientes restricciones: Las asignaciones en la clusula SET deben tener slo nombres de columna en el lado izquierdo del operador de asignacin. Puede usar subconsultas en la parte derecha de la asignacin de SET. Una subconsulta que retorne un valor a ser asignado a otra coluimna slo puede ser una subconsulta escalar. Adems, no puede usar una subconsulta para seleccionar desde la tabla que se est cargando. Las lneas ignoradas por un clusula IGNORE no se procesan por parta de la lista de columnas/ variables o por la clusula SET . Las variables de usuario no pueden usarse al cargar datos con formato de registo ya que las variables de usuario no tienen un ancho de muestra. Al procesar una lnea de entrada, LOAD DATA la divide en campos y usa los valores segn la lista de columnas/ variables y la clusula SET , si estn presentes. A continuacin se inserta el registro resultante en la tabla. Si hay disparadores BEFORE INSERT o AFTER INSERT para la tabla, se activan antes o despus de insertar el registro, respectivamente. Si una lnea de entrada tiene demasiados campos, los campos extra se ignoran y el nmero de advertencias se incrementa. Si una lnea de entrada no tiene suficientes campos, las columnas de la tabla que no tienen entrada adquieren su valor por defecto. Los valores por defecto se describen en Seccin 13.1.5, Sintaxis de CREATE TABLE. Un valor de campo vaco se interpreta de forma distinta que si el valor no est presente:
663
Sintaxis de REPLACE
Para tipos de cadenas, la columna adquiere la cadena vaca. Para tipos numricos, la columna recibe el valor 0. Para tipos de fecha y hora, la columna obtiene el valor cero apropiado para el tipo. Consulte Seccin 11.3, Tipos de fecha y hora. Estos son los mismos valores que resultan si asigna una cadena vaca explcitamente a un tipo de cadena de caracteres, numrico o de fecha u hora en un comando INSERT o UPDATE statement. Las columnas TIMESTAMP obtienen la fecha y hora actuales slo si hay un valor NULL para la columna (esto es, \N), o (para la primera columna TIMESTAMP nicamente) si se omite TIMESTAMP de la lista de campos cuando se especifica una. LOAD DATA INFILE trata todas las entradas como cadenas, asi que no puede usar valores numricos para columnas ENUM o SET del modo en que puede hacerlo con comandos INSERT . Todos los valores ENUM y SET deben especificarse como cadenas. Cuando acaba el comando LOAD DATA INFILE, retorna una cadena de informacin con el siguiente formato:
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
Si usa la API de C, puede obtener informacin acerca del comando mediante la funcin mysql_info(). Consulte Seccin 24.2.3.32, mysql_info(). Las advertencias se producen bajo las mismas circunstancias que cuando los valores se insertan mediante el comando INSERT (consulte Seccin 13.2.4, Sintaxis de INSERT), excepto que LOAD DATA INFILE tambin genera advertencias cuando hay muy pocos o demasiados campos en el registro de entrada. Las advertencias no se almacenan en ningn lugar; el nmero de las mismas puede usarse slo como indicacin de si todo ha ido bien. En MySQL 5.0, puede usar SHOW WARNINGS para obtener una lista de las primeras max_error_count advertencias como informacin acerca de qu ha fallado. Consulte Seccin 13.5.4.22, Sintaxis de SHOW WARNINGS.
O:
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name SET col_name={expr | DEFAULT}, ...
O:
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] SELECT ...
REPLACE funciona exactamente como INSERT, excepto que si un valor de la tabla tiene el mismo valor que un nuevo registro para un ndice PRIMARY KEY o UNIQUE , el antiguo registro se borra antes de insertar el nuevo. Consulte Seccin 13.2.4, Sintaxis de INSERT. Tenga en cuenta que a menos que la tabla tenga un ndice PRIMARY KEY, o UNIQUE usar un comando REPLACE no tiene sentido. Es equivalente a INSERT, ya que no hay ndice para determinar si un nuevo registro duplica otro. Los valores para todas las columnas se toman de los valores especificados en el comando REPLACE. Cualquier columna no presente adquiere su valor por defecto, como ocurre con INSERT. No puede
664
Sintaxis de SELECT
referirse a valores del registro actual y usarlos en el nuevo registro. Si usa un comando tal como SET col_name = col_name + 1, la referencia al nombre de columna en la parte derecha se trata como DEFAULT(col_name), as que es equivalente a SET col_name = DEFAULT(col_name) + 1. Para ser capaz de usar REPLACE, debe tener los permisos INSERT y DELETE para la tabla. El comando REPLACE retorna un contador con el nmero de registros afectados. Esta es la suma de registros borrados e insertados. Si el contador es 1 para REPLACE de un nico registro, se inserta un registro y no se borra ninguno. Si el contador es mayor que 1, uno o ms registros se borraron antes de insertar el nuevo. Es posible para un nico registro reemplazar ms de un registro antiguo si la tabla contiene mltiples ndices nicos y el nuevo registro duplica valores para distintos registros antiguos en distintos ndices nicos. El contador de registros afectados hace fcil determinar si REPLACE slo aadi un registro o si tambin reemplazo alguno: Compruebe si el contador es 1 (aadido) o mayor (reemplazados). Si usa la API de C, el contador de registros afectados puede obtenerse usando la funcin mysql_affected_rows(). Actualmente, no puede reemplzar en una tabla y seleccionar de la misma en una subconsulta. Aqu sigue en ms detalle el algoritmo usado (tambin se usa con LOAD DATA ... REPLACE): 1. Intenta insertar el nuevo registro en la tabla 2. Mientras falle la insercin debido a error de clave duplicada por clave nica o primaria: a. Borra de la tabla el registro conflictivo que tiene el valor de clave duplicada b. Intenta insertar de nuevo el registro en la tabla
SELECT se usa para recibir registros seleccionados desde una o ms tablas. MySQL 5.0 incluye soporte para comandos UNION y subconsultas. Consulte Seccin 13.2.7.2, Sintaxis de UNION y Seccin 13.2.8, Sintaxis de subconsultas. Cada select_expr indicata una columna que quiere recibir. table_references indicata la tabla o tablas desde la que recibir registros. Su sintaxis se describe en Seccin 13.2.7.1, Sintaxis de JOIN. where_definition consiste en la palabra clave WHERE seguida por una expresin que indica la condicin o condiciones que deben satisfacer los registros para ser seleccionados. SELECT tambin puede usarse para recuperar registros computados sin referencia a ninguna tabla.
665
Sintaxis de SELECT
Por ejemplo:
mysql> SELECT 1 + 1; -> 2
Todas las clusulas usadas deben darse exactamente en el orden mostrado en la descripcin de la sintaxis. Por ejemplo, una clusula HAVING debe ir tras cualquier clusula GROUP BY y antes de cualquier clusula ORDER BY . No se permite usar un alias de columna en una clusula WHERE, ya que el valor de columna puede no estar determinado cuando se ejecuta la clusula WHERE . Consulte Seccin A.5.4, Problemas con alias de columnas. La clusula FROM table_references indica la tabla desde la que recibir registros. Si nombra ms de una tabla, est realizando un join, Para informacin sobre la sintaxis de join, consulte Seccin 13.2.7.1, Sintaxis de JOIN. Para cada tabla especificada, puede opcionalmente especificar un alias.
tbl_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | [FORCE INDEX (key_list)]]
El uso de USE INDEX, IGNORE INDEX, FORCE INDEX para dar al optimizador pistas acerca de cmo escoger los indices se describe en Seccin 13.2.7.1, Sintaxis de JOIN. En MySQL 5.0, puede usar SET max_seeks_for_key=value como alternativa para forzar a MySQL a que realice escaneos de claves en lugar de escaneos de tabla. Puede referirse a una tabla dentro de la base de datos actual como tbl_name (dentro de la base de datos actual) , o como db_name.tbl_name para referirse a una base de datos explcitamente. Puede referirse a una columna como col_name, tbl_name.col_name, o db_name.tbl_name.col_name. No necesita especificar un prefijo tbl_name o db_name.tbl_name para una referencia de columna a no ser que la referencia fuese ambgua. Consulte Seccin 9.2, Nombres de bases de datos, tablas, ndices, columnas y alias para ejemplos de ambigedad que requieran las formas de referencia de columna ms explcitas. En MySQL 5.0, puede especificar DUAL como nombre de tabla falso en siguaciones donde no se referencian tablas:
mysql> SELECT 1 + 1 FROM DUAL; -> 2
DUAL es una caracterstica puramente de compatibilidad. Otros servidores requieren esta sintaxis. Una referencia de tabla puede tener un alias usando tbl_name AS alias_name o tbl_name alias_name:
mysql> -> mysql> -> SELECT t1.name, WHERE t1.name = SELECT t1.name, WHERE t1.name = t2.salary FROM employee AS t1, info AS t2 t2.name; t2.salary FROM employee t1, info t2 t2.name;
En la clusula WHERE , puede usar cualquiera de las funciones que soporta MySQL, escepto para funciones agregadas (resumen). Consulte Captulo 12, Funciones y operadores. Las columnas seleccionadas para la salida pueden ser referidas en clusulas ORDER BY y GROUP BY usando nombres de columnas, alias, o posiciones. Las posiciones de columnas son enteros y comienzan con 1:
mysql> -> mysql> -> SELECT college, region, seed FROM tournament ORDER BY region, seed; SELECT college, region AS r, seed AS s FROM tournament ORDER BY r, s;
666
Sintaxis de SELECT
Para ordenar en orden inverso, aada la palabra clave DESC (descendiente) al nombre de la columna en la clusula ORDER BY por la que est ordenando. Por defecto es orden ascendente; puede especificarse explcitamente usando la palabra clave ASC. El uso de posiciones de columna est obsoleto ya que la sintaxis se ha eliminado del estndar SQL. Si usa GROUP BY, los registros de salida se ordenan segn las columnas GROUP BY como si tuviera un ORDER BY para las mismas columnas. MySQL 5.0 extiende la clusula GROUP BY para que pueda especificar ASC y DESC tras las columnas nombradas en la clusula:
SELECT a, COUNT(b) FROM test_table GROUP BY a DESC
MySQL extiende el uso de GROUP BY para permitir seleccionar campos que no se mencionan en la clusula GROUP BY . Si no obtiene los resultados que espera de la consulta, por favor lea la descripcin de GROUP BY en Seccin 12.10, Funciones y modificadores para clusulas GROUP BY. En MySQL 5.0, GROUP BY permite un modificador WITH ROLLUP . Consulte Seccin 12.10.2, Modificadores de GROUP BY. La clusula HAVING se aplica casi al final, justo antes de que los elementos se enven al cliente, sin optimizacin. (LIMIT se aplica tras HAVING.) Antes de MySQL 5.0.2, una clusula HAVING poda referirse a cualquier columna o alias nombrado en una select_expr en la lista SELECT o en subconsultas externas, y para funciones agregadas. Sin embargo, el estndar SQL requiere que HAVING debe referirse slo a columnas en la clusula GROUP BY o columnas usadas en funciones agregadas. Para acomodar ambos estndars SQL y el comportamiento especfico de MySQL en que es capaz de referirse a columnas en la lista SELECT , MySQL 5.0.2 y posteior permite a HAVING referirse a columnas en la lista SELECT , en la clusula GROUP BY , en subconsultas externas y en funciones agregadas. Por ejemplo, el siguiente comando funciona en MySQL 5.0.2 pero produce un error en versiones aneriores:
mysql> SELECT COUNT(*) FROM t GROUP BY col1 HAVING col1 = 2;
Si la clusula HAVING se refiere a una columna ambgua, se muestra una advertencia. En el siguiente comando, col2 es ambguo porque se usa tanto para un alias como para un nombre de columna:
mysql> SELECT COUNT(col1) AS col2 FROM t GROUP BY col2 HAVING col2 = 2;
Se da preferencia al comportamiento SQL estndar, as que si un nombre de columna HAVING se usa en un GROUP BY y como alias de columna en la lista de columnas de salida, se da preferencia a la columna en GROUP BY . No use HAVING para elementos que deban estar en la clusula WHERE . Por ejemplo, no escriba lo siguiente:
mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;
La clusula HAVING puede referirse a funciones de agregacin, algo que no puede hacer la clusula WHERE:
mysql> SELECT user, MAX(salary) FROM users -> GROUP BY user HAVING MAX(salary)>10;
667
Sintaxis de SELECT
La clusula LIMIT puede usarse para restringir el nmero de registros retornados por el comando SELECT. LIMIT tiene uno o dos argumentos numricos, que deben ser enteros positivos (incluyendo cero). Con dos argumentos, el primer argumento especifica el desplazamiento del primer registro a retornar. El desplazamiento del registro inicial es 0 (no 1):
mysql> SELECT * FROM table LIMIT 5,10; # Retrieve rows 6-15
Por compatibilidad con PostgreSQL, MySQL tambin soporta la sintaxis LIMIT row_count OFFSET offset. Para recibir todos los registros de un desplazamiento hasta el final del conjunto de resultados, puede usar algn nmero grande para el segundo parmetro. Ete comando recibe todos los registros desde el 96th hasta el ltimo:
mysql> SELECT * FROM table LIMIT 95,18446744073709551615;
Con un argumento, el valor especifica el nmero de registros a retornar desde el comienzo del conjunto de resultados:
mysql> SELECT * FROM table LIMIT 5; # Retrieve first 5 rows
En otras palabras, LIMIT n es equivalente a LIMIT 0,n. La forma SELECT ... INTO OUTFILE 'file_name' de SELECT escribe los registros seleccionados en un fichero. El fichero se crea en el equipo servidor, as que debe tener el permiso FILE para usar esta sintaxis. El fichero no puede existir, que entre otras cosas evita destruir ficheros cruciales tales como /etc/passwd y tablas de la base de datos. El comando SELECT ... INTO OUTFILE existe principalmente para dejarle volcar una tabla rpidamente en la mquina servidor. Si quiere crear el fichero resultante en un equipo cliente distinto al equipo servidor, no puede usar SELECT ... INTO OUTFILE. En tal caso, debera usar algn comando como mysql -e "SELECT ..." > file_name en el equipo cliente para generar el fichero. SELECT ... INTO OUTFILE es el complemento de LOAD DATA INFILE; la sintaxis para la parte export_options del comando consiste en las mismas clusulas FIELDS y LINES usadas con el comando LOAD DATA INFILE . Consulte Seccin 13.2.5, Sintaxis de LOAD DATA INFILE. FIELDS ESCAPED BY controla cmo escribir caracteres especiales. Si el carcter FIELDS ESCAPED BY no est vaco, se usa como prefijo para los siguientes caracteres en la salida: El carcter FIELDS ESCAPED BY El carcter FIELDS [OPTIONALLY] ENCLOSED BY El primer carcter de FIELDS TERMINATED BY y LINES TERMINATED BY ASCII 0 (que se escribe siguiendo el carcter de escape ASCII '0', no un byte con valor cero) Si el carcter FIELDS ESCAPED BY est vaco, no hay ningn carcter de escape y NULL se muestra por salida como NULL, no \N. Probablemente no es buena idea especificar un carcter de escape vaco, particularmente si los valores de los campos de sus datos contienen cualqiuera de los caracteres en la lista dada. La razn de lo anterior es que debe escapar cualquier carcter FIELDS TERMINATED BY, ENCLOSED BY, ESCAPED BY, o LINES TERMINATED BY para ser capaz de volver a leer el fichero correctamente. ASCII NUL se escapa para hacer ms fcil visualizarlo con algunos visores. El fichero resultante no tiene que estar conforme a la sintaxis SQL, as que nada ms debe escaparse.
668
Sintaxis de SELECT
Este es un ejemplo que produce un fichero en formato de valores separados por comas usado por varios programas:
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM test_table;
Si usa INTO DUMPFILE en lugar de INTO OUTFILE, MySQL escribe slo un registro en el fichero, sin ninguna terminacin de lnea o columna y sin realizar ningn proceso de escape. Esto es til si quiere almacenar un valor BLOB en un fichero. Nota: Cualquier fichero creado por INTO OUTFILE o INTO DUMPFILE es modificable por todos los usuarios en el equipo servidor. La razn es que el servidor MySQL no puede crear un fichero con un propietario distinto al usuario que est en ejecucin (nunca debe ejecutar mysqld como root por esta y otras razones). El fichero debe ser modificable por todo el mundo para que pueda maminpular sus contenidos. Una clusula PROCEDURE nombra a un procedimiento que debe procesar los datos en el conjunto de resultados. Para un ejemplo, consulte Seccin 27.3.1, Procedimiento Analyse. Si usa FOR UPDATE en un motor de almacenamiento que usa bloqueo de pginas o registros, los registros examinados por la consulta se bloquean para escritura hasta el final de la transaccin actual. Usar LOCK IN SHARE MODE crea un bloqueo compartido que evita a otras transacciones actualizar o borrar los registros examinados. Consulte Seccin 15.10.5, Bloquear lecturas SELECT ... FOR UPDATE y SELECT ... LOCK IN SHARE MODE. Tras la palabra clave SELECT , puede usar un nmero de opciones que afectan la operacin del comando. Las opciones ALL, DISTINCT, and DISTINCTROW especifican si deben retornarse los registros duplicados. Si no se da ninguna de estas opciones, por defecto es ALL (se retornan todos los registros coincidentes). DISTINCT y DISTINCTROW son sinnimos y especifican que los registros duplicados en el conjunto de resultados deben borrarse. HIGH_PRIORITY, STRAIGHT_JOIN, y opciones que comiencen con SQL_ son extensiones de MySQL al estndar SQL. HIGH_PRIORITY da a SELECT prioridad ms alta que un comando que actualice una tabla. Debe usar esto slo para consultas que son muy rpidas y deben realizarse una vez. Una consulta SELECT HIGH_PRIORITY que se realiza mientras la tabla est bloqueada para lectura se ejectua incluso si hay un comando de actualizacin esperando a que se libere la tabla. HIGH_PRIORITY no puede usarse con comandos SELECT que sean parte de una UNION. STRAIGHT_JOIN fuerza al optimizador a hacer un join de las tablas en el orden en que se listan en la clusula FROM . Puede usarlo para acelerar una consulta si el optimizador hace un join con las tablas en orden no ptimo. Consulte Seccin 7.2.1, Sintaxis de EXPLAIN (Obtener informacin acerca de un SELECT). STRAIGHT_JOIN tambin puede usarse en la lista table_references . Consulte Seccin 13.2.7.1, Sintaxis de JOIN. SQL_BIG_RESULT puede usarse con GROUP BY o DISTINCT para decir al optimizador que el conjunto de resultados tiene muchos registros. En este caso, MySQL usa directamente tablas temporales en disco si son necesarias con una clave en los elementos GROUP BY . SQL_BUFFER_RESULT fuerza a que el resultado se ponga en una tabla temporal . Esto ayuda a MySQL a liberar los bloqueos de tabla rpidamente y ayuda en casos en que tarda mucho tiempo en enviar el resultado al cliente. SQL_SMALL_RESULT puede usarse con GROUP BY o DISTINCT para decir al optimizador que el conjunto de resultados es pequeo. En este caso, MySQL usa tablas temporales rpidas para
669
Sintaxis de SELECT
almacenar la tabla resultante en lugar de usar ordenacin. En MySQL 5.0, esto no har falta normalmente. SQL_CALC_FOUND_ROWS le dice a MySQL que calcule cuntos registros habrn en el conjunto de resultados, sin tener en cuenta ninguna clusula LIMIT. El nmero de registros pueden encontrarse con SELECT FOUND_ROWS(). Consulte Seccin 12.9.3, Funciones de informacin. SQL_CACHE le dice a MySQL que almacene el resultado de la consulta en la cach de consultas si est usando un valor de query_cache_type de 2 o DEMAND. Para una consulta que use UNION o subconsultas, esta opcin afecta a cualquier SELECT en la consulta. Consulte Seccin 5.12, La cach de consultas de MySQL. SQL_NO_CACHE le dice a MySQL que no almacene los resultados de consulta en la cach de consultas. Consulte Seccin 5.12, La cach de consultas de MySQL. Para una consulta que use UNION o subconsultas esta opcin afecta a cualquier SELECT en la consulta.
Generalmente no debera tener ninguna condicin en la parte ON que se usa para restringir qu registros desea en el conjunto de resultados, pero en su lugar especificar esas condiciones en la clusula WHERE . Hay excepciones a esta regla. La sintaxis { OJ ... LEFT OUTER JOIN ...} mostrada en la lista precedente existe slo por compatibilidad con ODBC. Puede poner un alias en una referencia de tabla usando tbl_name AS alias_name o tbl_name 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;
El condicional ON es cualquier expresin condicional de la forma que puede usarse en una clusula WHERE . Si no hay ningn registro coincidiente para la tabla de la derecha en la parte ON o USING en un LEFT JOIN, se usa un registro con todos las columnas a NULL para la tabla de la derecha. Puede usar este hecho para encontrar registros en una tabla que no tengan contraparte en otra tabla:
mysql> SELECT table1.* FROM table1
670
Sintaxis de SELECT
-> ->
Este ejemplo encuentra todos los registros en table1 con un valor id no presente en table2 (esto es, todos los registros en table1 sin registro correspondiente en table2). Esto asume que table2.id se declara NOT NULL. Consulte Seccin 7.2.9, Cmo optimiza MySQL los LEFT JOIN y RIGHT JOIN. La clusula USING (column_list) muestra una lista de columnas que deben existir en ambas tablas. Las siguientes dos clusulas son semnticamente idnticas:
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
El NATURAL [LEFT] JOIN de dos tablas se define semnticamente equivalente a un INNER JOIN o LEFT JOIN con una clusula USING que nombra todas las columnas que existen en ambas tablas. INNER JOIN y , (coma) son semnticamente equivalentes en la ausencia de una condicicn de join: ambos producen un producto Cartesiano entre las tablas especificadas (esto es, cada registro en la primera tabla se junta con cada registro en la segunda tabla). RIGHT JOIN funciona anlogamente a LEFT JOIN. Para mantener el cdigo portable entre bases de datos, se recomienda que use LEFT JOIN en lugar de RIGHT JOIN. STRAIGHT_JOIN es idntico a JOIN, excepto que la tabla de la izquierda se lee siempre antes que la de la derecha. Esto puede usarse para aqullos casos (escasos) en que el optimizador de join pone las tablas en orden incorrecto. Puede proporcionar pistas de qu ndice debe usar MySQL cuando recibe informacin de una tabla. Especificando USE INDEX (key_list), puede decirle a MySQL que use slo uno de los posibles ndices para encontrar registros en la tabla. La sintaxis alternativa IGNORE INDEX (key_list) puede usarse para decir a MySQL que no use algn ndice particular. Estos trucos son tiles si EXPLAIN muestra que MySQL est usando el ndice incorrecto de la lista de posibles ndices. Tambin puede usar FORCE INDEX, que acta como USE INDEX (key_list) pero con la adicin que un escaneo de tabla se asume como operacin muy cara. En otras palabras, un escaneo de tabla se usa slo si no hay forma de usar uno de los ndices dados para encontrar registros en la tabla. USE KEY, IGNORE KEY, y FORCE KEY son sinnimos de USE INDEX, IGNORE INDEX, y FORCE INDEX. Nota: USE INDEX, IGNORE INDEX, y FORCE INDEX slo afecta los ndices usados cuando MySQL decide cmo encontrar registros en la tabla y cmo hacer el join. No afecta si un ndice est en uso cuando se resuelve unORDER BY o GROUP BY. Algunos ejemplos de join:
mysql> mysql> mysql> mysql> -> mysql> -> mysql> -> SELECT * FROM table1,table2 WHERE table1.id=table2.id; SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id; SELECT * FROM table1 LEFT JOIN table2 USING (id); SELECT * 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;
Consulte Seccin 7.2.9, Cmo optimiza MySQL los LEFT JOIN y RIGHT JOIN.
Sintaxis de SELECT
SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]
UNION se usa para combinar el resultado de un nmero de comandos SELECT en un conjunto de resultados. Las columnas seleccionadas lisatadas en posiciones correspondientes de cada comando SELECT deben tener el mismo tipo. (Por ejemplo, la primera columna seleccionada por el primer comando debe tener el mismo tipo que la primer columna seleccionada por otros comandos.) Los nombres de columna usados por el primer comando SELECT se usan como nombres de columna para los resultados retornados. Los comandos SELECT son comandos select normales, pero con las siguientes restricciones: Slo el ltimo comando SELECT puede usar INTO OUTFILE. HIGH_PRIORITY no puede usarse con comandos SELECT que sean parte de una UNION. Si lo especifica para el primer SELECT, no tiene efecto. Si lo especifica para cualquier SELECT posterior, aparece un error de sintaxis. Si no usa la palabra clave ALL para UNION, todos los registros retornados son nicos, como si hubiera hecho un DISTINCT para el conjunto de resultados total. Si especifica ALL, obtiene todos los registros coincidentes de todos los comandos SELECT usados. La palabra clave DISTINCT es una palabra opcional que no tiene efecto, pero se permite en la sintaxis como requiere el estndar SQL . (En MySQL, DISTINCT representa el comportamiento por defecto de una union.) En MySQL 5.0, puede mezclar UNION ALL y UNION DISTINCT en la misma consulta. Tipos de UNION mezclados se tratan de forma que una unin DISTINCT sobreescribe cualquier unin ALL a su izquierda. Una unin DISTINCT puede producirse explcitamente usando UNION DISTINCT o implcitamente usando UNION sin palabra clave DISTINCT o ALL a continuacin. Si quiere usar una clusula ORDER BY o LIMIT para ordenar o limitar el resultado UNION entero, ponga entre parntesis los comandos SELECT individuales y ponga el ORDER BY o LIMIT tras el ltimo. El siguiente ejemplo usa ambas clusulas:
(SELECT a FROM tbl_name WHERE a=10 AND B=1) UNION (SELECT a FROM tbl_name WHERE a=11 AND B=2) ORDER BY a LIMIT 10;
Este tipo de ORDER BY no puede usar referencias de columnas que incluyan un nombre de columna (esto es, nombres en formato tbl_name.col_name ). En su lugar, proporcione un alias de columna al primer comando SELECT y refirase al alias en el ORDER BY, o a la columna en el ORDER BY usando su posicin de columna. (Un alias es preferible porque el uso de la posicin de la columna est obsoleto.) Para aplicar ORDER BY o LIMIT a un SELECT individual, ponga la clusula dentro de los parntesis alrededor del SELECT:
(SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION (SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
Los ORDER BY para comandos SELECT individuales entre parntesis tienen efecto slo al combinarlos con LIMIT. De otro modo, el ORDER BY se optimiza a parte. En MySQL 5.0, los tipos y longitudes de las columnas en el conjunto de resultados de una UNION tienen en cuenta los valores recibidos por todos los comandos SELECT. Por ejemplo, considere lo siguiente:
672
Sintaxis de subconsultas
mysql> SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10); +---------------+ | REPEAT('a',1) | +---------------+ | a | | bbbbbbbbbb | +---------------+
(En alguna versin anterior de MySQL, el segundo registro se habra truncado a una longitud de 1.)
En este ejemplo, SELECT * FROM t1 ... es la consulta externa (o comando externo), y (SELECT column1 FROM t2) es la subconsulta. Decimos que la subconsulta est anidada dentro de la consulta exterior, y de hecho, es posible anidar subconsultas dentro de otras subconsultas hasta una profundidad considerable. Una subconsulta debe siempre aparecer entre parntesis. Las principales ventajas de subconsultas son: Permiten consultas estructuradas de forma que es posible aislar cada parte de un comando. Proporcionan un modo alternativo de realizar operaciones que de otro modo necesitaran joins y uniones complejos. Son, en la opinin de mucha gente, lebles. De hecho, fue la innovacin de las subconsultas lo que dio a la gente la idea original de llamar a SQL Structured Query Language. Aqu hay un comando de ejemplo que muestra los puntos principales de la sintaxis de subconsultas como especifica el estndar SQL y soporta 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)));
Una subconsulta puede retornar un escalar (un valor nico), un registro, una columna o una tabla (uno o ms registros de una o ms columnas). stas se llaman consultas de escalar, columna, registro y tabla. Las subconsultas que retornan una clase particular de resultado a menudo pueden usarse slo en ciertos contextos, como se describe en las siguientes secciones. Hay pocas restricciones sobre los tipos de comandos en que pueden usarse las subconsultas. Una subconsulta puede contener cualquiera de las palabras claves o clusulas que puede contener un SELECT ordinario: DISTINCT, GROUP BY, ORDER BY, LIMIT, joins, trucos de ndices, constructores UNION , comentarios, funciones, y as. Una restriccin es que el comando exterior de una subconsulta debe ser: SELECT, INSERT, UPDATE, DELETE, SET, o DO. Otra restriccin es que actualmente no puede modificar una tabla y seleccionar de la misma tabla en la subconsulta. Esto se aplica a comandos tales como DELETE, INSERT, REPLACE, y UPDATE. Una discusin ms comprensible de las restricciones en las subconsultas se da en Apndice H, Restricciones en caractersticas de MySQL.
673
Sintaxis de subconsultas
La subconsulta en este SELECT retorna un valor nico ('abcde') que tiene un tipo de datos CHAR, una longitud de 5, un conjunto de caracteres y una colacin iguales a la que haba por defecto cuando se realiz el CREATE TABLE , y una indicacin que el valor en la columna puede ser NULL. De hecho, casi todas las consultas pueden ser NULL. Si la tabla usada en este ejemplo estuviese vaca, la tabla de la subconsulta sera NULL. Hay algunos contextos en que una subconsulta escalar no se puede usar. Si un comando permite slo un valor literal, no puede usar una subconsulta. Por ejemplo, LIMIT necesita argumentos enteros, y LOAD DATA necesita una cadena con un nombre de fichero. No puede usar subconsultas para proporcionar estos valores. Cuando vea los ejemplos en las siguientes secciones que contengan el constructor (SELECT column1 FROM t1), imagine que su prpio cdigo contiene construcciones mucho ms diversas y complejas. Por ejemplo, suponga que hacemos dos tablas:
CREATE INSERT CREATE INSERT TABLE t1 (s1 INT); INTO t1 VALUES (1); TABLE t2 (s1 INT); INTO t2 VALUES (2);
El resultado es 2 ya que hay un registro en t2 que contiene una columna s1 con un valor de 2. Una subconsulta escalar puede ser parte de una expresin. No olvide los parntesis, incluso si la subconsulta es un operando que proporciona un argumento para una funcin. Por ejemplo:
SELECT UPPER((SELECT s1 FROM t1)) FROM t2;
Por ejemplo:
... 'a' = (SELECT column1 FROM t1)
Tiempo atrs el nico sitio legal para una subconsulta era la parte derecha de la comparacin, y puede encontrar algunos SGBDs que insistan en ello. He aqu un ejemplo de una comparacin comn de subconsultas que no puede hacerse mediante un join. Encuentra todos los valores en la tabla t1 que son iguales a un valor mximo en la tabla t2:
SELECT column1 FROM t1
674
Sintaxis de subconsultas
Aqu hay otro ejemplo, que de nuevo es imposible de hacer con un join ya que involucra agregacin para una de las tablas. Encuentra todos los registros en la tabla t1 que contengan un valor que ocurre dos veces en una columna dada:
SELECT * FROM t1 AS t WHERE 2 = (SELECT COUNT(*) FROM t1 WHERE t1.id = t.id);
Para una comparacin realizada con uno de estos operadores, la subconsulta debe retornar un escalar, con la excepcin que = puede usarse con subconsultas de registro. Consulte Seccin 13.2.8.5, Subconsultas de registro.
La palabra clave ANY , que debe seguir a un operador de comparacin, significa return TRUE si la comparacin es TRUE para ANY (cualquiera) de los valores en la columna que retorna la subconsulta. Por ejemplo:
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
Suponga que hay un registro en una tabla t1 que contiene (10). La expresin es TRUE si la tabla t2 contiene (21,14,7) ya que hay un valor 7 en t2 que es menor que 10. La expresin es FALSE si la tabla t2 contiene (20,10), o si la tabla t2 est vaca. La expresin es UNKNOWN si la tabla t2 contiene (NULL,NULL,NULL). La palabra IN es un alias para = ANY. Por lo tanto, estos dos comandos son lo mismo:
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);
Sin embargo, NOT IN no es un alias para <> ANY, sino para <> ALL. Consulte Seccin 13.2.8.4, Subconsultas con ALL. La palabra SOME es un alias para ANY. Por lo tanto, estos dos comandos son el mismo:
SELECT s1 FROM t1 WHERE s1 <> ANY (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);
El uso de la palabra SOME es raro, pero este ejemplo muestra cmo puede ser til. Para la mayora de gente, la frase en ingls a is not equal to any b significa there is no b which is equal to a, pero eso no es lo que quiere decir la sintaxis SQL. La sintaxis significa there is some b to which a is not equal. Usando <> SOME en su lugar ayuda a asegurar que todo el mundo entiende el significado de la consulta.
La palabra ALL, que debe seguir a un operador de comparacin, significa return TRUE si la comparacin es TRUE para ALL todos los valores en la columna que retorna la subconsulta. Por ejemplo:
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);
Suponga que hay un registro en la tabla t1 que contiene (10). La expresin es TRUE si la tabla t2 contiene (-5,0,+5) ya que 10 es mayor que los otros tres valores en t2. La expresin es FALSE si
675
Sintaxis de subconsultas
la tabla t2 contiene (12,6,NULL,-100) ya que hay un nico valor 12 en la tabla t2 mayor que 10. La expresin es UNKNOWN si la tabla t2 contiene (0,NULL,1). Finalmente, si la tabla t2 est vaca, el resultado es TRUE. Puede pensar que el resultado debera ser UNKNOWN, pero lo sentimos, es TRUE. As, aunque extrao, el siguiente comando es TRUE cuando la tabla t2 est vaca:
SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);
En general, las tablas con valores NULL y las tablas vacas son casos extremos. Al escribir cdigo para subconsultas, siempre considere si ha tenido en cuenta estas dos posibilidades. NOT IN es un alias para <> ALL. Por lo tanto, estos dos comandos son equivalentes:
SELECT s1 FROM t1 WHERE s1 <> ALL (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);
Las consultas aqu son ambas TRUE si la tabla t2 tiene un registro en que column1 = 1 y column2 = 2. Las expresiones (1,2) y ROW(1,2) a veces se llaman constructores de registros. Ambos son equivalentes. Tambin son legales en otros contextos. Por ejemplo, los siguientes dos comandos son semnticamente equivalentes (aunque actualmente slo puede optimizarse el segundo):
SELECT * FROM t1 WHERE (column1,column2) = (1,1); SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
El uso normal de constructores de registros, sin embargo, es para comparaciones con subconsultas que retornan dos o ms columnas. Por ejemplo, la siguiente consulta responde a la peticin, encuentra todos los registros en la tabla t1 que tambin existen en la tabla t2:
SELECT column1,column2,column3 FROM t1 WHERE (column1,column2,column3) IN (SELECT column1,column2,column3 FROM t2);
Tradicionalmente, una subconsulta EXISTS comienza con SELECT *, pero puede comenzar con SELECT 5 o SELECT col1 o nada. MySQL ignora la lista SELECT en tales subconsultas, as que no hace distincin.
676
Sintaxis de subconsultas
Para el ejemplo precedente, si t2 contiene algn registro, incluso registros slo con valores NULL entonces la condicin EXISTS es TRUE. Este es un ejemplo poco probable, ya que prcticamente siempre una subconsulta [NOT] EXISTS contiene correlaciones. Aqu hay algunos ejemplos ms realistas: Qu clase de tienda hay en una o ms ciudades?
SELECT DISTINCT store_type FROM Stores WHERE EXISTS (SELECT * FROM Cities_Stores WHERE Cities_Stores.store_type = Stores.store_type);
El ltimo ejemplo es un doblemente anidado NOT EXISTS . Esto es, tiene una clusula NOT EXISTS dentro de otra NOT EXISTS. Formalmente, responde a la pregunta existe una ciudad con una tienda que no est en Stores? Sin embargo, es ms fcil decir que un NOT EXISTS responde a la pregunta es x TRUE para todo y?
Tenga en cuenta que la subconsulta contiene una referencia a una columna de t1, incluso aunque la clusula FROM de la subconsulta no menciona una tabla t1. Por lo tanto, MySQL busca fuera de la subconsulta y encuentra t1 en la consulta externa. Suponga que la tabla t1 contiene un registro en que column1 = 5 y column2 = 6; mientras, la tabla t2 contiene un registro en que column1 = 5 y column2 = 7. La expresin ... WHERE column1 = ANY (SELECT column1 FROM t2) sera TRUE, pero en este ejemplo, la clusula WHERE dentro de la subconsulta es FALSE (ya que (5,6) no es igual a (5,7)), as que la subconsulta como un todo es FALSE. Regla de visibilidad: MySQL evala desde dentro hacia fuera. Por ejemplo:
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));
En este comando, x.column2 debe ser una columna en la tabla t2 ya que SELECT column1 FROM t2 AS x ... renombra t2. No hay una columna en la tabla t1 porque SELECT column1 FROM t1 ... es una consulta externa que est demasiado afuera. Para subconsultas en clusulas HAVING u ORDER BY , MySQL busca nombres de columna en la lista de seleccin exterior. Para ciertos casos, una subconsulta correlacionada es ptima. Por ejemplo:
val IN (SELECT key_val FROM tbl_name WHERE correlated_condition)
677
Sintaxis de subconsultas
De otro modo, son ineficientes y lentas. Reescribir la consulta como un join puede mejorar el rendimiento. Las subconsultas correlacionadas no pueden referirse a los resultados de funciones agregadas de la consulta exterior.
La clusula [AS] name es obligatoria, ya que cada tabla en la clusula FROM debe tener un nombre. Cualquier columna en la lista selecta de la subquery debe tener nombre nico. Puede encontrar esta sintaxis descrita en este manual, dnde se usa el trmino tablas derivadas. Asuma que tiene la tabla:
CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);
Aqu se muestra cmo usar una subconsulta en la clusula FROM usando la tabla de ejemplo:
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;
Resultado: 2, '2', 4.0. Aqu hay otro ejemplo: suponga que quiere conocer la media de un conjunto de sumas para una tabla agrupada. Esto no funcionara:
SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1;
Tenga en cuenta que el nombre de columna usado dentro de la subconsultas (sum_column1) se reconoce en la consulta exterior. Las subconsultas en la clusula FROM pueden retornar un escalar, columna, registro o tabla. De momento, las subconsultas en la clusula FROM no pueden ser subconsultas correladas. Las subconsultas en la clusula FROM se ejecutan incluso para el comando EXPLAIN (esto es, se construyen las tablas temporales derivadas). Esto ocurre porque las consultas de niveles superiores necesitan informacin acerca de todas las tablas durante la fase de optimizacin.
678
Sintaxis de subconsultas
Se permite usar una subconsulta que retorne mltiples columnas, si el propsito es la comparacin. Consulte Seccin 13.2.8.5, Subconsultas de registro. Sin embargo, en otros contextos, la subconsulta debe ser un operando escalar. Nmero incorrecto de registros de la subconsulta:
ERROR 1242 (ER_SUBSELECT_NO_1_ROW) SQLSTATE = 21000 Message = "Subquery returns more than 1 row"
Este error ocurre de comandos en que la subconsulta retorna ms de un registro. Considere el siguiente ejemplo:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
Si SELECT column1 FROM t2 retorna slo un registro la consulta anterior funcionar. Si la subconsulta retorna ms de un registro, ocurre el error 1242 . En ese caso, la consulta debe reescribirse como:
SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2);
Puede usar una subconsulta para asignaciones dentro del comando UPDATE, ya que las subconsultas son legales en los comandos UPDATE y DELETE as como en los SELECT. Sin embargo, no puede usar la misma tabla (en este caso la tabla t1) para la clusula FROM de la subconsulta y el objetivo a actualizar. Para motores transaccionales, el fallo de una subconsulta provoca que falle el comando entero. Para motores no transaccionales, las modificaciones de datos hechas antes de encontrar el error se preservan.
En lugar de:
SELECT DISTINCT t1.column1 FROM t1, t2 WHERE t1.column1 = t2.column1;
679
Sintaxis de subconsultas
Algunas subconsultas pueden transformarse en joins por compatibilidad con versiones anteriores de MySQL que no soportan subconsultas. Sin embargo, en algunos casos, incluso en MySQL 5.0, convertir una subconsulta en un join puede mejorar el rendimiento. Consulte Seccin 13.2.8.11, Reescribir subconsultas como joins en versiones de MySQL anteriores. Mueva las clusulas desde fuera hacia dentro en la subconsulta. Por ejemplo , use esta consulta:
SELECT * FROM t1 WHERE s1 IN (SELECT s1 FROM t1 UNION ALL SELECT s1 FROM t2);
En lugar de:
SELECT * FROM t1 WHERE s1 IN (SELECT s1 FROM t1) OR s1 IN (SELECT s1 FROM t2);
En lugar de:
SELECT (SELECT column1 FROM t1) + 5 FROM t2;
Use una subconsulta de registro en lugar de una subconsulta correlacionada . Por ejemplo, use:
SELECT * FROM t1 WHERE (column1,column2) IN (SELECT column1,column2 FROM t2);
En lugar de:
SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t2.column1=t1.column1 AND t2.column2=t1.column2);
Use NOT (a = ANY (...)) en lugar de a <> ALL (...). Use x = ANY (table containing (1,2)) en lugar de x=1 OR x=2. Use = ANY en lugar de EXISTS. Para subconsultas no correlacionadas que siempre retornan un registro, IN siempre es ms lento que =. Por ejemplo, use esta consulta:
SELECT * FROM t1 WHERE t1.col_name = (SELECT a FROM t2 WHERE b = some_const);
En lugar de:
SELECT * FROM t1 WHERE t1.col_name IN (SELECT a FROM t2 WHERE b = some_const);
Estos trucos pueden hacer que los programas vayan ms rpidos o lentos. Usar recursos MySQL como la funcin BENCHMARK() es una buena idea para ver cules funcionan. Algunas optimizaciones que realiza MySQL son: MySQL ejecuta subconsultas no correlacionadas slo una vez. Use EXPLAIN para asegurar que una subconsulta dada realmente no est correlacionada. MySQL reescribe subconsultas IN, ALL, ANY, y SOME para aprovechar que las columnas de la lista de select de la subconsulta est indexada. MySQL reemplaza subconsultas de la siguiente forma con una funcin de bsqueda de ndice, que EXPLAIN describe como tipo especial de join (unique_subquery o index_subquery):
... IN (SELECT indexed_column FROM single_table ...)
680
Sintaxis de TRUNCATE
MySQL mejora expresiones de la siguiente forma con una expresin que involucre MIN() o MAX(), a no ser que hayan involucrados valores NULL o conjuntos vacos:
value {ALL|ANY|SOME} {> | < | >= | <=} (non-correlated subquery)
Hay un captulo titulado Cmo transforma las subconsultas MySQL en el manual MySQL Internals Manual. Puede obtener este documento descargando el paquete fuente MySQL y buscando un fichero llamado internals.texi en el directorio Docs .
Las consultas:
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);
Un LEFT [OUTER] JOIN puede ser ms rpido que la subconsulta equivalente ya que el servidor puede ser capaz de optimizarlo mejor este es un hecho no especfico de MySQL Server . Antes de SQL-92, los outer joins no existan, as que las subconsultas eran el nico modo de hacer ciertas cosas. Hoy, MySQL Server y otros sistemas de bases de datos ofrecen un mplio rango de tipos de outer join. MySQL Server soporta comandos DELETE para mltiples tablas que pueden usarse para borrar registros basndose en la informacin de una tabla o de varias al mismo tiempo. Los comandos UPDATE para mltiples tablas tambin se soportan en MySQL 5.0.
TRUNCATE TABLE vaca una tabla completamente. Lgicamente, esto es equivalente a un comando DELETE que borre todos los registros, pero hay diferencias prcticas bajo ciertas circunstncias. Para InnoDB antes de la versin 5.0.3, TRUNCATE TABLE se mapea a DELETE, as que no hay diferencia. A partir de MySQL/InnoDB-5.0.3, est disponible TRUNCATE TABLE muy rpido. La operacin se mapea a DELETE si hay restricciones de clave fornea que referencien la tabla.
681
Sintaxis de UPDATE
Para otros motores, TRUNCATE TABLE difiere de DELETE FROM en los siguientes puntos en MySQL 5.0: Las operaciones de truncado destruyen y recrean la tabla, que es mucho ms rpido que borrar registros uno a uno. Las operaciones de truncado no son transaccionales; ocurre un error al intentar un truncado durante una transaccin o un bloqueo de tabla. No se retorna el nmero de registros borrados. Mientras el fichero de definicin de la tabla tbl_name.frm sea vlido, la tabla puede recrearse como una vaca con TRUNCATE TABLE, incluso si los ficheros de datos o de ndice se han corrompido. El tratador de tablas no recuerda el ltimo valor AUTO_INCREMENT usado, pero empieza a contar desde el principio. Esto es cierto incluso para MyISAM y InnoDB, que normalmente no resan valores de secuencia. TRUNCATE TABLE es una extensin de Oracle SQL adoptada en MySQL.
El comando UPDATE actualiza columnas en registros de tabla existentes con nuevos valores. La clusula SET indica qu columna modificar y los valores que puede recibir. La clusula WHERE , si se da, especifica qu registros deben actualizarse. De otro modo, se actualizan todos los registros. Si la clusula ORDER BY se especifica, los registros se actualizan en el orden que se especifica. La clusula LIMIT es el lmite de registros a actualizar. El comando UPDATE soporta los siguientes modificadores: Si usa la palabra clave LOW_PRIORITY , la ejecucin de UPDATE se retrasa hasta que no haya otros clientes leyendo de la tabla. Si usa la palabra clave IGNORE, el comando de actualizacin no aborta incluso si ocurren errores durante la actualizacin. Los registros que presenten conflictos de clave duplicada no se actualizan. Los registros cuyas columnas se actualizan a valores que provocaran errores de conversin de datos se actualizan al valor vlido ms prximo. Si accede a una columna de tbl_name en una expresin, UPDATE usa el valora ctual de la columna. Por ejemplo, el siguiente comando pone la columna age a uno ms que su valor actual:
mysql> UPDATE persondata SET age=age+1;
Las asignaciones UPDATE se avalna de izquierda a derecha. Por ejemplo, el siguiente comando dobla la columna age y luego la incrementa:
mysql> UPDATE persondata SET age=age*2, age=age+1;
Si pone en una columna el valor que tiene actualmente, MySQL se da cuenta y no la actualiza.
682
Si actualiza una columna declarada como NOT NULL con un valor NULL, la columna recibe el valor por defecto apropiado para el tipo de la columna y se incrementa el contador de advertencias. El valor por defecto es 0 para tipos numricos, la cadena vaca ('') para tipos de cadena, y el valor cero para valores de fecha y hora. UPDATE retorna el nmero de registros que se cambian. En MySQL 5.0, la funcin mysql_info() de la API de C retorna el nmero de registros coincidentes actualizados y el nmero de advertencias que ocurren durante el UPDATE. Puede usar LIMIT row_count para restringir el alcance del UPDATE. Una clusula LIMIT es una restriccin de registros coincidentes. El comando para en cuanto encuentra row_count registos que satisfagan la clusula WHERE , tanto si han sido cambiados como si no. Si un comando UPDATE incluye una clusula ORDER BY, los registros se actualizan en el orden especificado por la clusula. Puede realizar operaciones UPDATE que cubran varias tablas. La parte table_references lista las tablas involucradas en el join. Su sintaxis se describe mpliamente en Seccin 13.2.7.1, Sintaxis de JOIN. Aqu hay un ejemplo:
UPDATE items,month SET items.price=month.price WHERE items.id=month.id;
Este ejemplo muestra un inner join usando el operador coma, pero los comandos UPDATE de mltiples tablas pueden usar cualquier tipo de join permitido en comandos SELECT tales como LEFT JOIN. Nota: No puede usar ORDER BY o LIMIT con un UPDATE de mltiples tablas. En MySQL 5.0, necesita el permiso UPDATE slo para columnas referenciadas en un UPDATE de mltiples tablas que se actualizan realmente. Necesita slo el permiso SELECT para algunas columnas que se leen pero no se modifican. Si usa un comando UPDATE de mltiples tablas que involucren tablas InnoDB con restricciones de claves forneas, el optimizador de MySQL puede procesar tablas en un orden distinto al de la relacin padre/hijo. En este caso, el comando fall y hace un roll back. En su lugar, actualice una nica tabla y confen en las capacidades de ON UPDATE que proporciona InnoDB para que el resto de tablas se modifiquen acrdemente. Consulte Seccin 15.6.4, Restricciones (constraints) FOREIGN KEY. Actualmente, no puede actualizar una tabla y seleccionar de la misma en una subconsulta.
DESCRIBE proporciona informacin acerca de columnas en una tabla. Es una abreviacin de SHOW COLUMNS FROM. Desde MySQL 5.0.1, estos comandos tambin muestran informacin para vistas. Consulte Seccin 13.5.4.3, Sintaxis de SHOW COLUMNS. col_name puede ser un nombre de columna, o una cadena con los caracteres de SQL '%' y '_' para obtener salida slo para las columnas con nombres que coincidan con la cadena. No hay necesidad de delimitar la cadena con comillas a no ser que contenga espacios u otros caracteres especiales.
mysql> DESCRIBE city; +------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+----------+------+-----+---------+----------------+ | Id | int(11) | | PRI | NULL | auto_increment | | Name | char(35) | | | | |
683
Sintaxis de USE
| Country | char(3) | | UNI | | | | District | char(20) | YES | MUL | | | | Population | int(11) | | | 0 | | +------------+----------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
La columna Null indica si pueden almacenarse los valores NULL , mostrando YES cuando se permiten valores NULL. La columna Key indica si el campo est indexado. Un valor de PRI indica que el campo es parte de una clave primaria de tabla. UNI indica que el campo es parte de un ndice UNIQUE. El valor MUL indica que se permiten mltiples ocurrencias de un valor dado dentro del campo. Un campo puede designarse como MUL incluso si se usa un ndice UNIQUE si se permiten valores NULL , ya que mltiples registros en un ndice UNIQUE pueden tener un valor NULL si la columna no se declara NOT NULL. Otra causa para MUL en un ndice UNIQUE es cuando dos columnas de un ndice UNIQUE compuesto; mientras la combinacin de las columnas sea nica, cada columna puede tener mltiples ocurrencias de un valor dado. Tenga en cuenta que en un ndice compuesto slo el campo de ms a la izquierda del ndice tiene una entrada en la columna Key . La columna Default indica el valor por defecto asignado al campo. La columna Extra contiene cualquier informacin adicional disponible acerca de un campo dado. En nuestro ejemplo la columna Extra indica que la columna Id se cre con la palabra clave AUTO_INCREMENT . Si los tipos de columna son distintos a los esperados segn el comando CREATE TABLE , tenga en cuenta que a veces MySQL cambia los tipos de columa. Consulte Seccin 13.1.5.1, Cambios tcitos en la especificacin de columnas. El comando DESCRIBE se proporciona por compatibilidad con Oracle. Los comandos SHOW CREATE TABLE y SHOW TABLE STATUS proporcionan informacin acerca de tablas . Consulte Seccin 13.5.4, Sintaxis de SHOW.
El comando USE db_name le dice a MySQL que use la base de datos db_name como la base de datos por defecto para los comandos siguientes. Sigue siendo la base de datos por defecto hasta el final de la sesin o hasta que se realiza otro comando USE :
mysql> mysql> mysql> mysql> USE db1; SELECT COUNT(*) FROM mytable; USE db2; SELECT COUNT(*) FROM mytable; # selects from db1.mytable # selects from db2.mytable
Hacer una base de datos particular la actual signfica que el comando USE no le imposibilita a acceder a tablas en otras bases de datos. El siguiente ejemplo accede a la tabla author desde la base de datos db1 y a la tabla editor desde la base de datos db2:
mysql> USE db1; mysql> SELECT author_name,editor_name FROM author,db2.editor -> WHERE author.editor_id = db2.editor.editor_id;
Por defecto, MySQL se ejecuta con el modo autocommit activado. Esto significa que en cuanto ejecute un comando que actualice (modifique) una tabla, MySQL almacena la actualizacin en disco. Si usa tablas transaccionales (como InnoDB o BDB), puede desactivar el modo autocommit con el siguiente comando:
SET AUTOCOMMIT=0;
Tras deshabilitar el modo autocommit poniendo la variable AUTOCOMMIT a cero, debe usar COMMIT para almacenar los cambios en disco o ROLLBACK si quiere ignorar los cambios hechos desde el comienzo de la transaccin. Si quiere deshabilitar el modo autocommit para una serie nica de comandos, puede usar el comando START TRANSACTION:
START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
Con START TRANSACTION, autocommit permanece deshabilitado hasta el final de la transaccin con COMMIT o ROLLBACK. El modo autocommit vuelve a su estado prvio. BEGIN y BEGIN WORK se soportan como alias para START TRANSACTION para iniciar una transaccin. START TRANSACTION es sintaxis SQL estndar y es la forma recomendada para iniciar una transaccin ad-hoc . El comando BEGIN difiere del uso de la palabra clave BEGIN que comienza un comando compuesto BEGIN ... END. El ltimo no comienza una transaccin. Consulte Seccin 19.2.7, Sentencia compuesta BEGIN ... END. Puede comenzar una transaccin as:
START TRANSACTION WITH CONSISTENT SNAPSHOT;
La clusula WITH CONSISTENT SNAPSHOT comienza una lectura consistente para motores de almacenamiento capaces de ello. Actualmente, esto se aplica slo a InnoDB. El efecto es el mismo que realizar un START TRANSACTION seguido por un SELECT desde cualquier tabla InnoDB . Consulte Seccin 15.10.4, Lecturas consistentes que no bloquean. Comenzar una transaccin provoca que se realice un UNLOCK TABLES implcito. Tenga en cuenta que si no usa tablas transaccionales, cualquier cambio se almacena de golpe, a pesar del estado del modo autocommit . Si realiza un comando ROLLBACK tras actualizar una tabla no transaccional dentro de una transaccin, ocurre una advertencia ER_WARNING_NOT_COMPLETE_ROLLBACK. Los cambios en tablas transaccionales se deshacen, pero no los cambios en tablas no transaccionales. Cada transaccin se almacena en el log binario en un trozo, hasta COMMIT. Las transacciones que se deshacen no se loguean. (Excecin: Las modificaciones a tablas no transaccionales no pueden deshacerse. Si una transaccin que se deshace incluye modificaciones a tablas no transaccionales, la transaccin entera se loguea con un comando ROLLBACK al final para asegurar que las modificaciones a estas tablas se replican.) Consulte Seccin 5.10.3, El registro binario (Binary Log). Puede cambiar el nivel de aislamiento para transacciones con SET TRANSACTION ISOLATION LEVEL. Consulte Seccin 13.4.6, Sintaxis de SET TRANSACTION. Deshacer puede ser una operacin lenta que puede ocurrir sin que el usuario lo haya pedido explcitamente (por ejemplo, cuando ocurre un error). Debido a ello, SHOW PROCESSLIST en MySQL 5.0 muestra Rolling back en la columna Statepara la conexin durante rollbacks implcitos y explcitos (comando SQL ROLLBACK).
685
UNLOCK TABLES tambin realiza un commit de una transaccin si hay cualquier tabla bloqueada. Las transacciones no pueden anidarse. Esto es una consecuencia del COMMIT implcito realizado por cualquier transaccin actual cuando realiza un comando START TRANSACTION o uno de sus sinnimos.
En MySQL 5.0, InnoDB soporta los comandos SQL SAVEPOINT y ROLLBACK TO SAVEPOINT. El comando SAVEPOINT crea un punto dentro de una transaccin con un nombre identifier. Si la transaccin actual tiene un punto con el mismo nombre, el antiguo se borra y se crea el nuevo. El comando ROLLBACK TO SAVEPOINT deshace una transaccin hasta el punto nombrado. Las modificaciones que la transaccin actual hace al registro tras el punto se deshacen en el rollback, pero InnoDB no libera los bloqueos de registro que se almacenaron en memoria tras el punto . (Tenga en cuenta que para un nuevo registro insertado, la informacin de bloqueo se realiza a partir del ID de transaccin almacenado en el registro; el bloqueo no se almacena separadamente en memoria. En este caso, el bloqueo de registro se libera al deshacerse todo.) Los puntos creados tras el punto nombrado se borran. Si un comando retorna el siguiente error, significa que no existe ningn punto con el nombre especificado:
ERROR 1181: Got error 153 during ROLLBACK
Todos los puntos de la transaccin actual se borran si ejecuta un COMMIT, o un ROLLBACK que no nombre ningn punto.
686
UNLOCK TABLES
LOCK TABLES bloquea tablas para el flujo actual. Si alguna de las tablas la bloquea otro flujo, bloquea hasta que pueden adquirirse todos los bloqueos. UNLOCK TABLES libera cualquier bloqueo realizado por el flujo actual. Todas las tablas bloqueadas por el flujo actual se liberan implcitamente cuando el flujo reliza otro LOCK TABLES, o cuando la conexin con el servidor se cierra. Un bloqueo de tabla protege slo contra lecturas inapropiadas o escrituras de otros clientes. El cliente que tenga el bloqueo, incluso un bloqueo de lectura, puede realizar operaciones a nivel de tabla tales como DROP TABLE. Tenga en cuenta lo siguiente a pesar del uso de LOCK TABLES con tablas transaccionales: LOCK TABLES no es una operacin transaccional y hace un commit implcito de cualquier transaccin activa antes de tratar de bloquear las tablas. Tambin, comenzar una transaccin (por ejemplo, con START TRANSACTION) realiza un UNLOCK TABLES implcito. (Consulte Seccin 13.4.3, Sentencias que causan una ejecucin (commit) implcita.) La forma correcta de usar LOCK TABLES con tablas transaccionales,como InnoDB, es poner AUTOCOMMIT = 0 y no llamar a UNLOCK TABLES hasta que hace un commit de la transaccin explcitamente. Cuando llama a LOCK TABLES, InnoDB internamente realiza su propio bloqueo de tabla, y MySQL realiza su propio bloqueo de tabla. InnoDB libera su bloqueo de tabla en el siguiente commit, pero para que MySQL libere su bloqueo de tabla, debe llamar a UNLOCK TABLES. No debe tener AUTOCOMMIT = 1, porque entonces InnoDB libera su bloqueo de tabla inmediatamente tras la llamada de LOCK TABLES, y los deadlocks pueden ocurrir fcilmente. (Tenga en cuenta que en MySQL 5.0, no adquirimos el bloqueo de tabla InnoDB en absoluto si AUTOCOMMIT=1, para ayudar a aplicaciones antiguas a envitar deadlocks.) ROLLBACK no libera bloqueos de tablas no transaccionales de MySQL. Para usar LOCK TABLES en MySQL 5.0, debe tener el permiso LOCK TABLES y el permiso SELECT para las tablas involucradas. La razn principal para usar LOCK TABLES es para emular transacciones o para obtener ms velocidad al actualizar tablas. Esto se explica con ms detalle posteriormente. Si un flujo obtiene un bloqueo READ en una tabla, ese flujo (y todos los otros) slo pueden leer de la tabla. Si un flujo obtiene un bloqueo WRITE en una tabla, slo el flujo con el bloqueo puede escribir a la tabla. El resto de flujos se bloquean hasta que se libera el bloqueo. La diferencia entre READ LOCAL y READ es que READ LOCAL permite comandos INSERT no conflictivos (inserciones concurrentes) se ejecuten mientras se mantiene el bloqueo. Sin embargo, esto no puede usarse si va a manipular los ficheros de base de datos fuera de MySQL mientras mantiene el bloqueo. Para tablas InnoDB , READ LOCAL esencialmente no hace nada: No bloquea la tabla. Para tablas InnoDB , el uso de READ LOCAL est obsoleto ya que una SELECT consistente hace lo mismo, y no se necesitan bloqueos. Cuando usa LOCK TABLES, debe bloquear todas las tablas que va a usar en sus consultas. Mientras los bloqueos obtenidos con un comando LOCK TABLES estn en efecto, no puede acceder a ninguna tabla que no estuviera bloqueada por el comando. Adems, no puede usar una tabla bloqueada varias veces en una consulta --- use alias para ello. Tenga en cuenta que en este caso, debe tener un bloqueo separado para cada alias.
mysql> LOCK TABLE t WRITE, t AS t1 WRITE; mysql> INSERT INTO t SELECT * FROM t; ERROR 1100: Table 't' was not locked with LOCK TABLES mysql> INSERT INTO t SELECT * FROM t AS t1;
Si sus consultas se refieren a una tabla que use un alias, debe bloquear la tabla que usa el mismo alias. No funciona bloquear la tabla sin especificar el alias:
mysql> LOCK TABLE t READ;
687
mysql> SELECT * FROM t AS myalias; ERROR 1100: Table 'myalias' was not locked with LOCK TABLES
Si bloquea una tabla usando un alias, debe referirse a ella en sus consultas usando este alias:
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;
WRITE bloquea normalmente teniendo una prioridad superior que READ al bloquear para asegurar que las actualizaciones se procesan en cuanto se puede. Esto significa que si un flujo obtiene un bloqueo READ y luego otro flujo pide un bloqueo WRITE , las peticiones de bloqueo READ posteriores esperan hasta que el flujo WRITE quita el bloqueo. Puede usar bloqueos LOW_PRIORITY WRITE para permitir a otros flujos que obtengan bloqueos READ mientras el flujo est en espera para el bloqueo WRITE. Debe usar bloqueos LOW_PRIORITY WRITE slo si est seguro que habr un momento sin flujos con bloqueos READ . LOCK TABLES funciona como sigue: 1. Ordena todas las tablas a ser bloqueadas en un orden definido internamente. Desde el punto de vista del usuario, este orden es indefinido. 2. Si una tabla se bloquea con bloqueo de lectura y escritura, pone el bloqueo de escritura antes del de lectura. 3. Bloquea una tabla a la vez hasta que la sesin obtiene todos los bloqueos. Esta poltica asegura un bloqueo de tablas libre de deadlocks. Sin embargo hay otros puntos que debe tener en cuenta respecto a esta poltica: Si est usando un bloqueo LOW_PRIORITY WRITE para una tabla, slo significa que MySQL espera para este bloqueo hasta que no haya flujos que quieren un bloqueo READ . Cuando el flujo ha obtenido el bloqueo WRITE y est esperando para obtener un bloqueo para la siguiente tabla en la lista, todos los otros flujos esperan hasta que el bloqueo WRITE se libera. Si esto es un problema con su aplicacin, debe considerar convertir algunas de sus tablas a transaccionales. Puede usar KILL para terminar un flujo que est esperando para un bloqueo de tabla. Consulte Seccin 13.5.5.3, Sintaxis de KILL. Tenga en cuenta que no debe bloquear ninguna tabla que est usando con INSERT DELAYED ya que en tal caso el INSERT lo realiza un flujo separado. Normalmente, no tiene que bloquear tablas, ya que todos los comandos UPDATE son atmicos, ningn otro flujo puede interferir con ningn otro que est ejecutando comandos SQL . Hay algunos casos en que no debe bloquear tablas de ningn modo: Si va a ejecutar varias operaciones en un conjunto de tablas MyISAM , es mucho ms rpido bloquear las tablas que va a usar. Bloquear tablas MyISAM acelera la insercin, las actualizaciones, y los borrados. Por contra, ningn flujo puede actualizar una tabla con un bloqueo READ (incluyendo el que tiene el bloqueo) y ningn flujo puede acceder a una tabla con un bloqueo WRITE distinto al que tiene el bloqueo. La razn que algunas operaciones MyISAM sean ms rpidas bajo LOCK TABLES es que MySQL no vuelca la cach de claves para la tabla bloqueada hasta que se llama a UNLOCK TABLES. Normalmente, la cach de claves se vuelca tras cada comando SQL. Si usa un motor de almacenamiento en MySQL que no soporta transacciones, debe usar LOCK TABLES si quiere asegurarse que ningn otro flujo se ejecute entre un SELECT y un UPDATE. El ejemplo mostrado necesita LOCK TABLES para ejecutarse sin problemas:
mysql> LOCK TABLES trans READ, customer WRITE;
688
mysql> SELECT SUM(value) FROM trans WHERE customer_id=some_id; mysql> UPDATE customer -> SET total_value=sum_from_previous_statement -> WHERE customer_id=some_id; mysql> UNLOCK TABLES;
Sin LOCK TABLES, es posible que otro flujo pueda insertar un nuevo registro en la tabla trans entre la ejecucin del comando SELECT y UPDATE. Puede evitar usar LOCK TABLES en varios casos usando actualizaciones relativas (UPDATE customer SET value=value+new_value) o la funcin LAST_INSERT_ID() , Consulte Seccin 1.7.5.3, Transacciones y operaciones atmicas. Puede evitar bloquear tablas en algunos casos usando las funciones de bloqueo de nivel de usuario GET_LOCK() y RELEASE_LOCK(). Estos bloqueos se guardan en una tabla hash en el servidor e implementa pthread_mutex_lock() y pthread_mutex_unlock() para alta velocidad. Consulte Seccin 12.9.4, Funciones varias. Consulte Seccin 7.3.1, Mtodos de bloqueo, para ms informacin acerca de la poltica de bloqueo. Puede bloquear todas las tablas en todas las bases de datos con bloqueos de lectura con el comando FLUSH TABLES WITH READ LOCK . Consulte Seccin 13.5.5.2, Sintaxis de FLUSH. Esta es una forma muy conveniente para obtener copias de seguridad si tiene un sistema de ficheros como Veritas que puede obtener el estado en un punto temporal. Nota: Si usa ALTER TABLE en una tabla bloqueada, puede desbloquearse. Consulte Seccin A.7.1, Problemas con ALTER TABLE.
Este comando prepara el nivel de aislamiento de transaccin para la siguiente transaccin, globalmente, o para la sesin actual. El comportamiento por defecto de SET TRANSACTION es poner el nivel de aislammiento para la siguiente transaccin (que no ha empezado todava). Si usa lka palabra clave GLOBAL el comando pone el nivel de aislamiento de transaccin por defecto globalmente para todas las transacciones creadas desde ese momento. Las conexiones existentes no se ven afectadas. Necesita el permiso SUPER para hacerlo. Usar la palabra clave SESSION determina el nivel de transaccin para todas las transacciones futuras realizadas en la conexin actual. Para descripciones del nivel de aislamiento de cada transaccin InnoDB, consulte Seccin 15.10.3, InnoDB y TRANSACTION ISOLATION LEVEL. InnoDB soporta cada uno de estos niveles en MySQL 5.0. El nivel por defecto es REPEATABLE READ. Puede inicializar el nivel de aislamiento global por defecto para mysqld con la opcin -transaction-isolation . Consulte Seccin 5.3.1, Opciones del comando mysqld.
El comando CREATE USER se aadi en MySQL 5.0.2. Este comando crea nuevas cuentas MySQL. Para usarlas, debe tener el permiso global CREATE USER o el permiso INSERT para la base de datos
689
mysql . Para cada cuenta, CREATE USER crea un nuevo registro en la tabla mysql.user que no tiene permisos. Un error ocurre si la cuenta ya existe. La cuenta puede tener una contrasea con la clusula opcional IDENTIFIED BY. El valor user y la contrasea se dan del mismo modo que para el comando GRANT. En particular, para especificar la contrasea en texto plano, omita la palabra clave PASSWORD. Para especificar la contrasea como el valor hasheado retornado por la funcin PASSWORD() , incluya la palabra clave PASSWORD. Consulte Seccin 13.5.1.3, Sintaxis de GRANT y REVOKE.
El comando DROP USER borra una o ms cuentas MySQL . Para usarlo, debe tener el permiso global CREATE USER o el permiso DELETE para la base de datos mysql . Cada cuenta se nombra usando el mismo formato que para GRANT o REVOKE; por ejemplo, 'jeffrey'@'localhost'. Las partes de usuario y equipo del nombre de cuenta se corresponden a las columnas User y Host del registro de la tabla user para la cuenta. DROP USER como est en MySQL 5.0.0 borra slo cuentas que no tienen permisos. En MySQL 5.0.2, se modific para eliminar permisos de cuenta tambin. Esto significa que el procedimiento para borrar una cuenta depende en su versin de MySQL. Desde MySQL 5.0.2, puede borrar una cuenta y sus permisos como sigue:
DROP USER user;
El comando borra registros de permisos para la cuenta de todas las tablas de permisos. En MySQL 5.0.0 y 5.0.1, DROP USER borra slo cuentas MySQL que no tienen permisos. En estas versiones MySQL slo sirve para borrar cada registro de cuenta de la tabla user . Para borrar una cuenta MySQL completamente (incluyendo todos sus permisos), debe usar el siguiente procedimiento, realizando estos pasos en el orden mostrado: 1. Use SHOW GRANTS para determinar los permisos que tiene la cuenta. Consulte Seccin 13.5.4.10, Sintaxis de SHOW GRANTS. 2. Use REVOKE para revocar los permisos mostrados por SHOW GRANTS. Esto borra registros para la cuenta de todas las tablas de permisos excepto la tabla user , y revoca cualquier permiso global listado en la tabla user . Consulte Seccin 13.5.1.3, Sintaxis de GRANT y REVOKE. 3. Borre la cuenta usando DROP USER para borrar el registro de la tabla user . DROP USER no cierra automticamente ninguna sesin de usuario. En lugar de ello, en el evento que un usuario con una sesin abierta se elimina, el comando no tiene efecto hasta que se cierra la sesin de usuario. Una vez se ha cerrado, el usuario se borra, y el prximo usuario de logueo del usuario fallar. Esto es por diseo.
690
| FUNCTION | PROCEDURE with_option = GRANT OPTION | MAX_QUERIES_PER_HOUR count | MAX_UPDATES_PER_HOUR count | MAX_CONNECTIONS_PER_HOUR count | MAX_USER_CONNECTIONS count REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] {tbl_name | * | *.* | db_name.*} FROM user [, user] ... REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
Los comandos GRANT y REVOKE permiten a los adminitradores de sistemas crear cuentas de usuario MySQL y darles permisos y quitarlos de las cuentas. La informacin de cuenta de MySQL se almacena en las tablas de la base de datos mysql . Esta base de datos y el sistema de control de acceso se discuten extensivamente en Captulo 5, Administracin de bases de datos, que puede consultar para ms detalles. Si las tablas de permisos tienen registros de permisos que contienen nombres de tablas o bases de datos con maysculas y minsculas y la variable de sistema lower_case_table_names est activa, REVOKE no puede usarse para quitar los permisos. Es necesario manipular las tablas de permisos directamente. (GRANT no crear estos registros cuando est activo lower_case_table_names , pero tales registros pueden haberse creado prviamente a activar la variable.) Los permisos pueden darse en varios niveles: Nivel global Los permisos globales se aplican a todas las bases de datos de un servidor dado. Estos permisos se almacenan en la tabla mysql.user. GRANT ALL ON *.* y REVOKE ALL ON *.* otorgan y quitan slo permisos globales. Nivel de base de datos Los permisos de base de datos se aplican a todos los objetos en una base de datos dada. Estos permisos se almacenan en las tablas mysql.db y mysql.host . GRANT ALL ON db_name.* y REVOKE ALL ON db_name.* otorgan y quitan slo permisos de bases de datos. Nivel de tabla Los permisos de tabla se aplican a todas las columnas en una tabla dada. Estos permisos se almacenan en la tabla mysql.tables_priv . GRANT ALL ON db_name.tbl_name y REVOKE ALL ON db_name.tbl_name otorgan y quian permisos slo de tabla. Nivel de columna Los permisos de columna se aplican a columnas en una tabla dada. Estos permisos se almacenan en la tabla mysql.columns_priv . Usando REVOKE, debe especificar las mismas columnas que se otorgaron los permisos. Nivel de rutina Los permisos CREATE ROUTINE, ALTER ROUTINE, EXECUTE, y GRANT se aplican a rutinas almacenadas. Pueden darse a niveles global y de base de datos. Adems, excepto para CREATE ROUTINE, estos permisos pueden darse en nivel de rutinas para rutinas individuales y se almacenan en la tabla mysql.procs_priv . La clusula object_type se aadi en MySQL 5.0.6. Debe especificarse como TABLE, FUNCTION, o PROCEDURE cuando el siguiente objeto es una tabla, una funcin almacenada, o un procedimiento
691
almacenado. Para usar esta clusula cuando actualice de una versin anterior de MySQL a la 5.0.6, debe actualizar las tablas de permisos. Consulte Seccin 2.10.2, Aumentar la versin de las tablas de privilegios. Para usar GRANT o REVOKE, debe tener el permiso GRANT OPTION , y debe tener los permisos que est dando o quitando. Para hacer fcil de quitar todos los permisos, MySQL 5.0 tiene la siguiente sintaxis, que borra todos los permisos globales, de nivel de base de datos y de nivel de tabla para los usuarios nombrados:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
Para usar esta sintaxis REVOKE , debe tener el permiso CREATE USER global o el permiso UPDATE para la base de datos mysql . Para los comandos GRANT y REVOKE , priv_type pueden especificarse como cualquiera de los siguientes: Permiso ALL [PRIVILEGES] ALTER ALTER ROUTINE CREATE CREATE ROUTINE CREATE TEMPORARY TABLES CREATE USER CREATE VIEW DELETE DROP EXECUTE FILE INDEX INSERT LOCK TABLES PROCESS REFERENCES RELOAD REPLICATION CLIENT REPLICATION SLAVE SELECT SHOW DATABASES SHOW VIEW SHUTDOWN Significado Da todos los permisos simples excepto GRANT OPTION Permite el uso de ALTER TABLE Modifica o borra rutinas almacenadas Permite el uso de CREATE TABLE Crea rutinas almacenadas Permite el uso de CREATE TEMPORARY TABLE Permite el uso de CREATE USER, DROP USER, RENAME USER, y REVOKE ALL PRIVILEGES. Permite el uso de CREATE VIEW Permite el uso de DELETE Permite el uso de DROP TABLE Permite al usuario ejecutar rutinas almacenadas Permite el uso de SELECT ... INTO OUTFILE y LOAD DATA INFILE Permite el uso de CREATE INDEX y DROP INDEX Permite el uso de INSERT Permite el uso de LOCK TABLES en tablas para las que tenga el permiso SELECT Permite el uso de SHOW FULL PROCESSLIST No implementado Permite el uso de FLUSH Permite al usuario preguntar dnde estn los servidores maestro o esclavo Necesario para los esclavos de replicacin (para leer eventos del log binario desde el maestro) Permite el uso de SELECT SHOW DATABASES muestra todas las bases de datos Permite el uso de SHOW CREATE VIEW Permite el uso de mysqladmin shutdown
692
SUPER
Permite el uso de comandos CHANGE MASTER, KILL, PURGE MASTER LOGS, and SET GLOBAL , el comando mysqladmin debug le permite conectar (una vez) incluso si se llega a max_connections Permite el uso de UPDATE Sinnimo de no privileges Permite dar permisos
El permiso EXECUTE no es operacional hasta MySQL 5.0.3. CREATE VIEW y SHOW VIEW se aadieron en MySQL 5.0.1. CREATE USER, CREATE ROUTINE, y ALTER ROUTINE se aadieron en MySQL 5.0.3. Para usar estos permisos al actualizar desde una versin anterior de MySQL que no los tenga, debe actualizar primero las tablas de permisos, como se describe en Seccin 2.10.2, Aumentar la versin de las tablas de privilegios. El permiso REFERENCES actualmente no se usa. USAGE puede especificarse cuando quiere crear un usuario sin permisos. Use SHOW GRANTS para determinar qu permisos tiene la cuenta. Consulte Seccin 13.5.4.10, Sintaxis de SHOW GRANTS. Puede asignar permisos globales usando sintaxis ON *.* o permisos a nivel de base de datos usando la sintaxis ON db_name.*. Si especifica ON * y tiene seleccionada una base de datos por defecto, los permisos se dan en esa base de datos. (Atencin: Si especifica ON * y no ha seleccionado una base de datos por defecto, los permisos dados son globales.) Los permisos FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN, y SUPER son permisos administrativos que slo pueden darse globalmente (usando sintaxis ON *.* ). Otros permisos pueden darse globalmente o a niveles ms especficos. Los nicos valores priv_type que puede especificar para una tabla son SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT OPTION, INDEX, y ALTER. Los nicos valores priv_type que puede especificar para una columna (cuando usa la clusula column_list ) son SELECT, INSERT, y UPDATE. Los nicos valores priv_type que puede especificar a nivel de rutina son ALTER ROUTINE, EXECUTE, y GRANT OPTION. CREATE ROUTINE no es un permiso de nivel de rutina porque debe tener este permiso para ser capaz de crear una rutina en primer lugar. Para los niveles global, base de datos, tabla y rutina, GRANT ALL asigna slo los permisos que existen en el nivel que est otorgndolos. Por ejemplo, si usa GRANT ALL ON db_name.*, este es un comando de nivel de base de datos, as que ninguno de los permisos nicamente globales tales como FILE se otorgan. MySQL le permite dar permisos incluso en objetos de bases de datos que no existen. En tales casos, los permisos a dar deben incluir el permiso CREATE . Este es el comportamiento diseado, y se pretende permitir al administrador de la base de datos perparar cuentas de usuario y permisos para objetos de base de datos que se crearn posteriormente. MySQL no elimina automticamente nign permiso si borra una tabla o base de datos . Si borra un rutina, se quita cualquier permiso dado a nivel de rutina para la misma. Nota: los carcters comodn '_' y '%' se permiten al especificar nombres de base de datos en comandos GRANT que otorgan permisos a nivel global o de base de datos. Esto significa, por ejemplo, que si quiere usar un carcter '_' como parte de un nombre de base de datos, debe especificarlo como '\_' en el comando GRANT , para evitar que el usuario sea capaz de acceder a bases de datos
693
adicionales que coincidan con el patrn de los comodines, por ejemplo GRANT ... ON `foo \_bar`.* TO .... Para acomodar los permisos a los usuarios de equipos arbitrrios, MySQL soporta especificar el valor user con la forma user_name@host_name. Si un valor user_name o host_name es legal como identificador sin poner entre comillas, no necesita hacerlo. Sin embargo, las comillas son necesarias para especificar una cadena user_name conteniendo caracteres especiales (tales como '-'), o una cadena host_name conteniendo caracteres especiales o comodn (tales como '%'); por ejemplo, 'test-user'@'test-hostname'. Entrecomille el nombre de usuario y de equipo separadamente. Puede especificar caracteres comodn en el nombre de equipo. Por ejemplo, user_name@'%.loc.gov' se aplica a user_name para cualquier equipo en el dominio loc.gov , y user_name@'144.155.166.%' se aplica a user_name para cualquier equipo en la clase subred clase C 144.155.166 . La forma simple user_name es sinnimo de user_name@'%'. MySQL no soporta comodines en el nombre de usuario. Los usuarios annimos se definien insertando entradas con User='' en la tabla mysql.user o creando un usuario con un nombre vaco con el comando GRANT :
mysql> GRANT ALL ON test.* TO ''@'localhost' ...
Al especificar valores delimitados, use comillas simples para delimitar los nombres de bases de datos, tabla, columna y de rutina ('`'). Para los nombres de equipo, nombres de usuario, y contraseas como cadenas, use apstrofes ('''). Advertencia: Si permite conectar con el servidor a usuarios annimos, debe dar permisos a todos los usuarios locales como user_name@localhost. De otro modo, la cuenta de usuario annimo para localhost en la tabla mysql.user (creada durante la instalacin de MySQL) se usa cuando los usuarioa con nombre intentan loguear con el servidor MySQL desde la mquina local. Puede determinar si esto se aplica a su sistema ejecutando la siguiente consulta, que lista cualquier usuario annimo:
mysql> SELECT Host, User FROM mysql.user WHERE User='';
Si quiere borrar la cuenta annima local para evitar el problema descrito, use estos comandos:
mysql> DELETE FROM mysql.user WHERE Host='localhost' AND User=''; mysql> FLUSH PRIVILEGES;
GRANT soporta nombres de equipo de hasta 60 caracteres. Los nombres de bases de datos, tablas, columnas y rutinas pueden tener hasta 64 caracteres. Los nombres de usuario pueden tener hasta 16 caracteres. Los nombres de usuario pueden tener hasta 16 caracteres. Estos lmites estn harcodeados en el software MySQL y no pueden cambiarse alterando las tablas de permisos . Los permisos para una tabla o columna se forman de forma aditiva como una OR lgica de los permisos en cada uno de los cuatro niveles de permisos. Por ejemplo, si la tabla mysql.user especifica que un usuario tiene un permiso SELECT global, el permiso no puede denegarse mediante una entrada en el nivel de base de datos, tabla o columna. Los permisos de una columna pueden calcularse como sigue:
global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges
En la mayora de casos, puede dar derechoa a un usuario en slo uno de los niveles de permisos, as que la vida normalmente no es tan complicada. Los detalles de este procedimiento de chequeo de permisos se presentan en Seccin 5.6, El sistema de privilegios de acceso de MySQL.
694
Si otorga permisos para una combinacin usuario/equipo que no existe en la tabla mysql.user se aade una entrada que permite all hasta que se borra con un comando DELETE. En otras palabras, GRANT puede crear entradas user pero REVOKE no los borra; debe hacerlo explcitamente usando DROP USER o DELETE. Si se crea un nuevo usuario o si tiene permisos globales para otorgar permisos, la contrasea de usuario se cambia con la contrasea especificada por la clusula IDENTIFIED BY , si se da una. Si el usuario ya tiene una contrasea, esta se reemplaza por la nueva. Atencin: Si crea un nuevo usuario pero no especifica una clusula IDENTIFIED BY, el usuario no tiene contrasea. Esto es muy poco seguro. Desde MySQL 5.0.2, puede activar el modo SQL NO_AUTO_CREATE_USER para evitar que GRANT cree un nuevo usuario si lo hiciese de otro modo, a no ser que IDENTIFIED BY se de para proporcionar la nueva contrasea de usuario. Las contraseas pueden ponerse con el comando SET PASSWORD . Consulte Seccin 13.5.1.5, Sintaxis de SET PASSWORD. En la clusula IDENTIFIED BY , la contrasea debe darse como el valor de contrasea literal. No es necesario usar la funcin PASSWORD() como lo es para el comando SET PASSWORD . Por ejemplo:
GRANT ... IDENTIFIED BY 'mypass';
Si no quiere enviar la contrasea en texto plano y conoce el valor haseado que PASSWORD() retornara para la contrasea, puede especificar el valor hasheado precedido por la palabra clave PASSWORD:
GRANT ... IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';
En un programa C , puede obtener el valor haseado usando la funcin make_scrambled_password() de la API de C. Si da permisos para una base de datos, se crea una entrada en la tabla mysql.db si es necesario. Si todos los permisos para la base de datos se eliminan con REVOKE, esta entrada se borra. Si un usuario no tiene permisos para una tabla, el nombre de tabla no se muestra cuando el usuario pide una lista de talbas (por ejemplo, con el comando SHOW TABLES ). El permiso SHOW DATABASES le permite a la cuenta ver nombres de bases de datos realizando el comando SHOW DATABASE . Las cuentas que no tienen este permiso slo ven las bases de datos para las que tienen algn permiso, y no pueden usar el comando para nada si el servidor se arranca con la opcin --skip-show-database. La clusula WITH GRANT OPTION le da al usuario la habilidad para dar a otros usuarios cualquier permiso que tenga el usuario en el nivel de permiso especificado. Debe tener cuidado de a quin da el permiso GRANT OPTION, ya que dos usuarios con permisos distintos pueden ser capaces de juntar permisos! No puede dar a otro usuario un permiso que no tenga usted mismo; el permiso GRANT OPTION le permite asignar slo los permisos que tenga usted. Tenga en cuenta que cuando le da a un usuario el permiso GRANT OPTION a un nivel de permisos particular, cualquier permiso que tenga el usuario (o que se de en el futuro!) a este nivel tambin son otorgables por este usuario. Suponga que le da a un usuario el permisos INSERT en una base de datos. Si otorga el permiso SELECT en la base de datos y especifica WITH GRANT OPTION, el usuario puede quitar no slo el permiso SELECT sino tambin INSERT. Si luego otorga el permiso UPDATE al usuario en la base de datos, el usuario puede quitar INSERT, SELECT, y UPDATE. No debe otorgar permisos ALTER a un usuario normal. Si lo hace, el usuario puede intentar engaar al sistema de permisos renombrando tablas!
695
Las opciones MAX_QUERIES_PER_HOUR count, MAX_UPDATES_PER_HOUR count, y MAX_CONNECTIONS_PER_HOUR count limitan el nmero de consultas, actualizaciones, y logueos que puede realizar un usuario durante cualquier perdo de una hora. Si count es 0 (por defecto), esto significa que no hay limitacin para ese usuario. La MAX_USER_CONNECTIONS count opcin, implementada en MySQL 5.0.3, limita el mximo nmero de conexiones simultneas que la cuenta puede hacer. Si count es 0 (por defecto), la max_user_connections variable de sistema determina el nmero de conexiones simultneas para la cuenta. Nota: para especificar cualquiera de estas opciones de limitacin de recursos para un usuario existente sin afectar a los permisos existentes, use GRANT USAGE ON *.* ... WITH MAX_.... Consulte Seccin 5.7.4, Limitar recursos de cuentas. MySQL puede chequear atributos certificados X509 adems que la autenticacin usual que se basa en el nombre de usuario y contrasea. Para especificar opciones relacionadas con SSL para la cuenta MySQL, use la clusula REQUIRE del comando GRANT . (Para informacin de transfondo sobre el uso de SSL con MySQL, consulte Seccin 5.7.7, Usar conexiones seguras.) Hay distintas posibilidades para limitar tipos de conexin para una cuenta: Si una cuenta no tiene requerimientos de SSL o X509, se permiten conexiones sin cifrar si la contrasea y nombre de usuario son vlidos. Sin embargo, las conexiones no cifradas pueden usarse en las opciones de cliente, si el cliente tiene los ficheros clave y de certificado apropiados. La opcin REQUIRE SSL le dice al servidor que permita slo conexiones SSL cifradas para la cuenta. Tenga en cuenta que esta opcin puede omitirse si hay algunos registros de control de acceso que permitan conexiones no SSL.
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' -> IDENTIFIED BY 'goodsecret' REQUIRE SSL;
REQUIRE X509 significa que el cliente debe tener un certificado vlido pero que el certificador exacto y el asunto no importan. El nico requerimiento que debe ser posible de verificar es la firma con uno de las AC certificadas.
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' -> IDENTIFIED BY 'goodsecret' REQUIRE X509;
REQUIRE ISSUER 'issuer' crea una restriccin de intentos de conexin en que el cliente debe presentar un certificado X509 vlido presentado por la AC issuer. Si el cliente presenta un certificado vlido pero de otra AC, el servidor rehsa la conexin. El uso de certificados X509 siempre implica encripcin, por lo que la opcin SSL no es necesaria.
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@example.com';
Tenga en cuenta que el valor ISSUER debe entrarse como una cadena nica. REQUIRE SUBJECT 'subject' crea la restriccin en los intentos de conexin de que el cliente debe presentar un certificado X509 vlido con el asunto subject. Si el cliente presenta un certificado vlido pero con un asunto distinto, el servidor rehsa la conexin.
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';
Tenga en cuenta que el valor SUBJECT debe entrarse como una nica cadena. 696
REQUIRE CIPHER 'cipher' se necesita para asegurar que se usan cifradores suficientemente fuertes y longitudes de claves acordes. SSL por s mismo puede ser dbil si se usan algoritmos antiguos con claves de cifrado cortas. Con esta opcin, puede especificar el mtodo de cifrado exacto para permitir una conexin.
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' -> IDENTIFIED BY 'goodsecret' -> REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
Las opciones SUBJECT, ISSUER, y CIPHER pueden combinarse en la clusula REQUIRE as:
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';
Tenga en cuenta que los valores SUBJECT y ISSUER deben entrarse como una nica cadena. En MySQL 5.0, la palabra clave AND es opcional entre las opciones REQUIRE . El orden de las opciones no importa, pero no puede especificarse ninguna opcin dos veces. Cuando mysqld arranca, todos los permisos se leen en memoria. Para ms detalles, consulte Seccin 5.6.7, Cundo tienen efecto los camios de privilegios. Tenga en cuenta que si usa permisos de tablas o de columnas para un usuario, el servidor examina los permisos de tablas y usuarios para todos los usuarios y esto ralentiza MySQL ligeramente. De forma similar, si limita el nmero de consultas, actualizaciones o conexiones para cualquier usuario, el servidor debe monitorizar estos valores. Las mayores diferencias entre las versiones de GRANT de MySQL y SQL estndar son: En MySQL, los permisos se asocian con una combinacin de nombre de usuario/equipo y no slo con el usuario. SQL estndar no tienen permisos globales o a nivel de base de datos, ni soporta todos los tipos de permisos que soporta MySQL . MySQL no soporta los permisos de SQL estndar TRIGGER o UNDER. Los permisos de SQL estndar se estructuran de forma jerrquica. Si borra un usuario, todos los permisos que tuviera el usuario se eliminan. Esto es cierto a partir de MySQL 5.0.2 y si usa DROP USER. Antes de 5.0.2, los permisos otorgados no se eliminaban automticamente; deba hacerlo a mano. Consulte Seccin 13.5.1.2, Sintaxis de DROP USER. En SQL estndar, cuando borra una tabla, todos los permisos para la tabla se eliminan. Con SQL estndar, cuando quita un permiso, todos los permisos otorgados basados en ese permiso tambin se eliminaban. En MySQL, los permisos slo pueden borrarse con comandos REVOKE explcitos o manipulando las tablas de permisos de MySQL. En MySQL, es posible tener el permiso INSERT slo para algunas de las columnas en la tabla. En este caso, todava puede ejecutar comandos INSERT en la tabla mientras omita esas columnas para las que no tiene el permiso INSERT . Las columnas omitidas obtienen su valor por defecto implcito si no est activado el modo SQL estricto. En modo estricto, el comando se rehsa si algunas de las columnas omitidas no tienen valor por defecto. Seccin 5.3.2, El modo SQL del servidor discute acerca del modo estricto. Seccin 13.1.5, Sintaxis de CREATE TABLE disctue acerca de los valores por defecto implcitos. Las columnas para las que no tiene el permiso INSERT se ponen a su valor por defecto. SQL estndar requiere que tenga el permiso INSERT en todas las columnas.
697
En MySQL, si tiene el permiso INSERT slo en alguna de las columnas de la tabla, puede ejecutar comandos INSERT mientras omita las columnas para las que no tiene el permiso de su comando INSERT; tales columnas obtendrn su valor por defecto. En modo estricto (cuando sql_mode="traditional"), si alguna de las columnas omitidas no tiene valor por defecto, el comando INSERT se rehsa.
El comando RENAME USER renombra cuentas de usuario MySQL existentes. Para usarlo, debe tener el permiso CREATE USER global o el permiso UPDATE para la base de datos mysql . Ocurre un error si cualquier de las antiguas cuentas no existe o cualquiera de las nuevas ya existe. Los valores old_user y new_user se dan igual que para el comando GRANT . El comando RENAME USER se aadi en MySQL 5.0.2.
El comando SET PASSWORD asigna una contrasea a una cuenta de usuario MySQL existente. La primera sintaxis asigna la contrasea para el usuario actual. Cualquier cliente que se conecte al servidor usando una cuenta no annima puede cambiar la contrasea para la misma. La segunda sintaxis asigna una contrasea para una cuenta especfica en el servidor actual. Slo los clientes con el permiso UPDATE para la base de datos mysql pueden hacerlo. El valor user debe darse en formato user_name@host_name donde user_name y host_name son exactamente los mismos que cuando se listan en las columnas User y Host de la tabla mysql.user . Por ejemplo, si tiene una entrada en las columnas User y Host con los valores 'bob' y '%.loc.gov', escribira el comando as:
mysql> SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass');
Nota: Si se est conectando a un servidor MySQL 4.1 o posterior usando programas clientes anteriores a la 4.1, no use los comandos SET PASSWORD o UPDATE precedentes sin leer Seccin 5.6.9, Hashing de contraseas en MySQL 4.1 primero. El formato de contrasea cambi en MySQL 4.1, y bajo ciertas circunstncias, puede que no sea capaz de conectar al servidor. En MySQL 5.0, puede ver su entrada de autenticacin user@host ejecutando SELECT CURRENT_USER().
Este comando analiza y almacena la distribucin de clave para una tabla. Durante el anlisis, la tabla se bloquea con un bloqueo de lectura. En MySQL 5.0, funciona en tablas MyISAM, BDB, y InnoDB . Para tablas MyISAM , este comando es equivalente a usar myisamchk -a.
698
MySQL usa la distribucin de claves almacenada para decidir el orden en que las tablas deben hacer los joins cuando realiza uno en algo que no sea una constante. El comando retorna una tabla con las siguientes columnas: Columna Tabla Op Msg_type Msg_text Valor Nombre de tabla Siempre analyze Es status, error, info, o warning Mensaje
Puede chequear la distribucin de claves almacenada con el comando SHOW INDEX . Consulte Seccin 13.5.4.11, Sintaxis de SHOW INDEX. Si la tabla no ha cambiado desde el ltimo comando ANALYZE TABLE , la tabla no se vuelve a analizar. En MySQL 5.0, los comandos ANALYZE TABLE se escriben en el log binario a no ser que la palabra clave NO_WRITE_TO_BINLOG opcional (o su alias LOCAL) se use.
Nota: Este comando est obsoleto. Estamos trabajano en un mejor sustituto para este que proporcionar capacidades de copia de seguridad en lnea. De momento, el script mysqlhotcopy puede usarse. BACKUP TABLE copia al directorio de base de datos el mnimo nmero de ficheros de tablas necesarias para restaurar la tabla, tras volcar cualquier cambios almacenados en el buffer a disco. El comando funciona slo para tablas MyISAM . Copia los ficheros de definicin .frm y de datos .MYD . El fichero ndice .MYI puede reconstruirse desde estos otros. El directorio debe especificarse con la ruta entera. Antes de usar este comando consulte Seccin 5.8.1, Copias de seguridad de bases de datos. Durante la copia de seguridad, se realiza un bloqueo de lectura para cada tabla, uno cada vez, mientras se hace la copia. Si quier hacer una copia de seguridad de varias tablas como una muestra (evitando que ninguna de ellas se cambie durante la operacin de la copia de seguridad), debe realizar un comando LOCK TABLES para obtener un bloqueo de lectura para cada tabla en el grupo. El comando retorna una tabla con las siguientes columnas: Columna Tabla Op Msg_type Msg_text Valor Nombre de tabla Siempre backup Es status, error, info, o warning Mensaje
Chequea una tabla o tablas para errores. CHECK TABLE funciona para tablas MyISAM y InnoDB . Para tablas MyISAM , la estadstica de clave se actualiza.
699
Desde MySQL 5.0.2, CHECK TABLE puede comprobar las vistas en busca de problemas tales como tablas que se referencian en la definicin de la vista que ya no existe. El comando CHECK TABLE retorna una tabla con las siguientes columnas: Columna Tabla Op Msg_type Msg_text Valor Nombre de tabla Siempre check Es status, error, info, o warning Mensaje
Tenga en cuenta que el comando puede producir varios registros para informacin de cada tabla chequeada. El ltimo registro tiene un valor Msg_type de status y Msg_text normalmente debe ser OK. Si no obtiene OK, o Table is already up to date debe realizar una reparacin de la tabla. Consulte Seccin 5.8.3, Mantenimiento de tablas y recuperacin de un fallo catastrfico (crash). Table is already up to date significa que el motor de almacenamiento para la tabla indicada indica que no hay necesidad de chequear la tabla. Las distintas opciones de chequeo que pueden darse se muestran en la siguiente tabla. Estas opciones se aplican slo para tablas MyISAM y se ignoran en tablas InnoDB y vistas. Tipo QUICK FAST CHANGED MEDIUM Significado No escanea los registros para chequear enlaces incorrectos. Slo chequea tablas que no se han cerrado correctamente. Slo las tablas chequeadas que se han cambiado desde el litmo chequeo o no se han cerrado correctamente. Escanea registros para verificar que los enlaces borrados estn bien. Tambin calcula el checksum de la clave para los registros y lo verifica con el checksum calculado para las claves. Realiza una bsqueda completa para todas las claves para cada registro. Se asegura que la tabla es consistente 100%, pero tarda mucho tiempo!
EXTENDED
Si ninguna de las opciones QUICK, MEDIUM, o EXTENDED se especifica, el tipo de chequeo por defecto para tablas de formato dinmico MyISAM es MEDIUM. Esto es lo mismo que ejecutar myisamchk --medium-check tbl_name en la tabla. El tipo de chequeo por defecto tambin es MEDIUM para tablas MyISAM de formato esttico, a no ser que se especifique CHANGED o FAST. En tal caso, por defecto es QUICK. El escaneo de registro se evita para CHANGED y FAST porque los registros estn corruptos muy raramente. Puede combinar opciones de chequeo, como en el siguiente ejemplo, que realiza un chequeo rpido de la tabla para ver si se cerr correctamente:
CHECK TABLE test_table FAST QUICK;
Nota: En algunos casos, CHECK TABLE cambia la tabla. Esto ocurre si la tabla se marca como corrupted o not closed properly pero CHECK TABLE no encuentra ningn problema en la tabla. En este caso, CHECK TABLE marca la tabla como correcta. Si una tabla est corrupta, es ms probable que el problema est en el ndice y no en la parte de datos. Todos los tipos de chequeo chequean los ndices profundamente y deberan encontrar la mayora de errores. Si quiere chequear una tabla que asume como correcta, no debe usar opciones de chequeo o la opcin QUICK. sta debe usarse cuando tiene prisa y puede permitirse el pequeo riesgo que QUICK no encuentre un error en el fichero de datos. (En la mayora de casos, MySQL debera encontrar, bajo
700
uso normal, cualquier error en el fichero de datos. Si esto ocurre, la tabla se marca como corrupted y no puede usarse hasta que se repare.) FAST y CHANGED estn pensados para usar desde un script (por ejemplo, para ejecutarse desde cron) si quiere chequear sus tablas de vez en cuando. En la mayora de casos, FAST se prefiere en lugar de CHANGED. (El nico caso en que no es el mtodo preferido es cuando sospecha que ha encontrado un bug en el cdigo MyISAM .) EXTENDED debe usarse slo despus de ejecutar un chequeo normal pero todava obtiene errores extraos de la tabla cuando MySQL intenta actualizar un registro o encuentra un registro mediante la clave. (Esto es muy improbable si un chequeo normal ha tenido xito.) Algunos problemas reportados por CHECK TABLE no pueden corregirse automticamente: Found row where the auto_increment column has the value 0. Esto significa que tiene un registro en la tabla donde la columna AUTO_INCREMENT contiene un valor de ndice de 0. (Es posible crear un registro donde la columna AUTO_INCREMENT es 0 poneindo la columna explcitamente a 0 con un comando UPDATE .) Esto no es un error por si mismo, pero puede causar problemas si decide volcar la tabla y restaurarla o realizar un ALTER TABLE en la tabla. En este caso, la columna AUTO_INCREMENT cambia los valores segn las reglas de las columnas AUTO_INCREMENT , que pueden causar problemas tales como errores de clave duplicada. Para evitar las advertencias, smplemente ejecute un comando UPDATE para poner en la columna un valor distinto a 0.
Reporta un checksum de tabla. Si QUICK se especifica, el checksum de la tabla se reporta si est disponible, o NULL en otro caso. Esto es muy rpido. Un checksum en vivo est permitido especificando la opcin de tabla CHECKSUM=1 , actualmente slo soportado por tablas MyISAM . Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE. En modo EXTENDED la tabla completa se lee registro a registro y se calcula el checksum. Esto puede ser muy lento para tablas grandes. Por defecto, si no se especifica ni QUICK ni EXTENDED , MySQL retorna un checksum en vivo si el motor de tabla lo soporta y escanea la tabla de otro modo. CHECKSUM TABLE retorna NULL para tablas no existentes. Desde MySQL 5.0.3, se genera una advertencia para esta condicin.
OPTIMIZE TABLE debe usarse si ha borrado una gran parte de la tabla o si ha hecho varios cambios en una tabla con registros de longitud variable (tablas que tienen columnas VARCHAR, BLOB, o TEXT ). Los registros borrados se mantienen en una lista enlazada y operaciones INSERT posteriores resan posiciones de antiguos registros. Puede usar OPTIMIZE TABLE para reclamar el usuario no usado y para defragmentar el fichero de datos. En la mayora de inicializaciones, no necesita ejecutar OPTIMIZE TABLE para nada. Incluso si hace muchas actualizaciones a registros de longitud variables, no es probable que necesite hacerlo ms de una vez a la semana o mes y slo en ciertas tablas.
701
Actualmente, OPTIMIZE TABLE funciona slo en tablas MyISAM, BDB y InnoDB . Para tablas MyISAM , OPTIMIZE TABLE funciona como sigue: 1. Si la tabla ha borrado o dividido registros, repare la tabla. 2. Si las pginas ndice no estn ordenadas, ordnelas. 3. Si las estadsticas no estn actualizadas (y la reparacin no puede hacerse ordenando el ndice), actualcelas. Para tablas BDB , OPTIMIZE TABLE es mapea como ANALYZE TABLE. Para tablas InnoDB , se mapea con ALTER TABLE, que reconstruye la tabla. Reconstruye las estadsticas actualizadas de ndice y libera espacio no usado en el ndice clusterizado. Consulte Seccin 13.5.2.1, Sintaxis de ANALYZE TABLE. Puede hacer que OPTIMIZE TABLE funcione con otros tipos de tabla arrancando mysqld con la opcin --skip-new o --safe-mode ; en este caso OPTIMIZE TABLE se mapea con ALTER TABLE. Tenga en ceunta que MySQL bloquea la tabla mientras se ejecuta OPTIMIZE TABLE . En MySQL 5.0, los comandos OPTIMIZE TABLE se escriben en el log binario a no ser que la palabra NO_WRITE_TO_BINLOG opcional(o su alias LOCAL) se use. Esto se hace para que los comandos OPTIMIZE TABLE se usen en MySQL server actuando como maestro de replicacin se replique por defecto en el esclavo de replicacin.
REPAIR TABLE repara una tabla posiblemente corrupta. Por defecto, tiene el mismo efecto que myisamchk --recover tbl_name. REPAIR TABLE funciona slo en tablas MyISAM. Normalmente nunca debe ejecutar este comando. Sin embargo, si hay un desastre, REPAIR TABLE puede recuperar todos los datos de una tabla MyISAM . Si sus tablas se corrompen a menudo, debe intentar encontrar la razn de lo que lo causa, para eliminar la necesidad de usar REPAIR TABLE. Consulte Seccin A.4.2, Qu hacer si MySQL sigue fallando (crashing). Consulte Seccin 14.1.4, Problemas en tablas MyISAM. El comando retorna una tabla con las siguientes columnas: Columna Tabla Op Msg_type Msg_text Valor Nombre de tabla Siempre es repair Es status, error, info, o warning Mensaje
El comando REPAIR TABLE puede producir muchos registros de informacin para cada tabla reparada. El ltimo registro tiene un valor Msg_type de status y Msg_test normalmente debe ser OK. Si no obtiene OK, debe intentar reparar la tabla con myisamchk --safe-recover, ya que REPAIR TABLE no implementa todas las opciones de myisamchk. Plaenamos hacerlo ms flexible en el futuro. Si se da QUICK , REPAIR TABLE intenta reparar slo el rbol ndice. Este tipo de reparacin es como lo que hace myisamchk --recover --quick. Si usa EXTENDED, MySQL crea el ndice registro a registro en lugar de crear un ndice a la vez ordenando. Este tipo de reparacin es como el hecho por myisamchk --safe-recover.
702
Sintaxis de SET
Tambin hay un modo USE_FRM disponible en MySQL 5.0 para REPAIR TABLE. Use esto si el fichero ndice .MYI no existe o su cabecera est corrupta. En este modo, MySQL recrea el fichero .MYI usando informacin desde el fichero .frm . Este tipo de reparacin no puede hacerse con myisamchk. Nota: Use este modo slo si no puede usar modos REPAIR normalmente. La cabecera .MYI contiene informacin importante de metadatos (en particular, los valores actuales AUTO_INCREMENT y Delete link) que se pierden en REPAIR ... USE_FRM. No use USE_FRM si la tabla est comprimida, ya que esta informacin se almacena en el fichero .MYI . En MySQL 5.0, los comandos REPAIR TABLE se escriben en el log binario a no ser que la palabra opcional NO_WRITE_TO_BINLOG (o su alias LOCAL) se use. Atencin: Si el servidor muere durante una operacin REPAIR TABLE, es esencial tras restaurarla que inmediatamente ejecute otro comando REPAIR TABLE para la tabla antes de realizar cualquier otra operacin en ella. (Siempre es una buena idea empezar haciendo una copia de seguridad.) En el peor caso, puede tener un nuevo fichero ndice limpio sin informacin acerca del fichero de datos, y luego la siguiente operacin que realice puede sobreescribir el fichero de datos. Este es un escenario improbable pero posible.
Restaura la tabla o tablas de una copia de seguridad que se hizo con BACKUP TABLE. Las tablas existentes no se sobreescriben; si trata restaurar una tabla existente, obtiene un error. Pero como BACKUP TABLE, RESTORE TABLE actualmente funciona slo para tablas MyISAM . El directorio debe especificarse como una ruta completa. La copia de seguridad para cada tabla consiste en su fichero de formato .frm y fichero de datos .MYD . La operacin de restauracin restaura aquellos ficheros, luego los usa para reconstruir el fichero ndice .MYI. La restauracin tarda ms tiempo que la copia de seguridad debido a la necesidad de reescribir los ndices. Mientras ms ndices tenga la tabla, ms tarda. El comando retorna una tabla con las siguientes columnas: Columna Tabla Op Msg_type Msg_text Valor Nombre de tabla Siempre restore Es status, error, info, o warning Mensaje
SET inicializa distintos tipos de variables que afectan la operacin del servidor o de su cliente. Puede usarse para asignar valores a las variables de usuario o de sistema. El comando SET PASSWORD para asignar contraseas de cuenta se describen en Seccin 13.5.1.5, Sintaxis de SET PASSWORD. La mayora del sistema puede cambiarse en tiempo de ejecucin. Las variables de sistema que pueden describirse dinmicamente se describen en Seccin 5.3.3.1, Variables de sistema dinmicas. Nota: Las versiones antiguas de MySQL empleaban SET OPTION para este comando, pero su uso est obsoleto en favor de SET.
703
Sintaxis de SET
El siguiente ejemplo muestra las distintas sintaxis que puede usar para cambiar las variables. Una variable de usuario se escribe como @var_name y puede cambiarse como sigue:
SET @var_name = expr;
Ms informacin sobre variables de usuario se da en Seccin 9.3, Variables de usuario. Se puede referir a las variables de sistema en comandos SET como var_name. El nombre puede ir precedido opcionalmente por GLOBAL o @@global. para indicar explcitamente que la variable es global, o por SESSION, @@session., o @@ para indicar que es una variable de sesin. LOCAL y @@local. son sinnimos para SESSION y @@session.. Si no hay modificador presente, SET asigna un valor a la variable de sesin. La sintaxis @@var_name para variables de sistema se soporta para hacer la sintaxis de MySQL compatible con otros sistemas de base de datos. Si cambia varias variables de sistema en el mismo comando, la ltima opcin GLOBAL o SESSION usada se usa para variables que no tienen modo especificado.
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 cambia una variable de sistema usando SESSION (por defecto), el valor queda en efecto hasta que la sesin actual finaliza o hasta que cambia la variable con un valor distinto. Si cambia la variable de sistema usando GLOBAL, que requiere el permiso SUPER , el valor se recuerda y se usa para nuevas conexiones hasta que el servidor se reinicia. Si quiere hacer un cambio de variable permanente, debe ponerlo en un fichero de opciones. Consulte Seccin 4.3.2, Usar ficheros de opciones. Para evitar uso incorrecto, MySQL produce un error si usa SET GLOBAL con una variable que slo puede ser usada con SET SESSION o si no especifica GLOBAL (o @@) cuando cambie una variable global. Si quiere cambiar una variable SESSION al valor GLOBAL o un valor GLOBAL al valor de compilacin de MySQL por defecto, puede hacerlo con DEFAULT. Por ejemplo, los siguientes dos comandos son idnticos en cambiar los valores de sesin o max_join_size al valor global:
SET max_join_size=DEFAULT; SET @@session.max_join_size=@@global.max_join_size;
Puede obtener una lista de la mayora de variables de sistema con SHOW VARIABLES. (Consulte Seccin 13.5.4.21, Sintaxis de SHOW VARIABLES.) Para obtener un nombre de variable especfico, use una clusula LIKE commo se muestra:
SHOW VARIABLES LIKE 'max_join_size'; SHOW GLOBAL VARIABLES LIKE 'max_join_size';
Para obtener una lista de variables cuyos nombres coinciden con un patrn, use el comodn '%':
SHOW VARIABLES LIKE 'have%'; SHOW GLOBAL VARIABLES LIKE 'have%';
El comodn puede usarse en cualquier posicin dentro del patrn para coincidir. Puede obtener el valor de un valor especfico usando la sintaxis @@[global.|local.]var_name con SELECT:
SELECT @@max_join_size, @@global.max_join_size;
Cuando recibe una variable con SELECT @@var_name (esto es,no especifica global., session., o local.), MySQL retorna el valor SESSION si existe y el valor GLOBAL en otro caso.
704
Sintaxis de SET
La siguiente lista describe variables que tienen sintaxis no estndar o que no se describe en la lista de variables de sistema que se encuentra en Seccin 5.3.3, Variables de sistema del servidor. Aunque estas variables no se muestran con SHOW VARIABLES, puede obtener sus valores con SELECT (con la excepcin de CHARACTER SET y SET NAMES). Por ejemplo:
mysql> SELECT @@AUTOCOMMIT; +--------------+ | @@autocommit | +--------------+ | 1 | +--------------+
AUTOCOMMIT = {0 | 1} Pone el modo autocommit . Con valor 1, todos los cambios de una tabla toman efecto inmediatamente. Si se pone a 0, debe usar COMMIT para aceptar una transaccin o ROLLBACK para cancelarla. Si cambia el modo AUTOCOMMIT de 0 a 1, MySQL realiza un COMMIT automtico de cualquier transaccin abierta . Otra forma de comenzar una transaccin es usar un comando START TRANSACTION o BEGIN. Consulte Seccin 13.4.1, Sintaxis de START TRANSACTION, COMMIT y ROLLBACK. BIG_TABLES = {0 | 1} Si se pone a 1, todas las tablas temporales se almacenan en disco en lugar que en memoria. Esto es un poco lento, pero el error The table tbl_name is full no ocurre para operaciones SELECT que requieran una tabla temporal grande. El valor por defecto para una nueva conexin es 0 (use tablas temporales en memoria). Normalmente, nunca debera necesitar usar esta variable, ya que MySQL 5.0 convierte automticamente tablas en memoria a tablas en disco como se requiere. (Nota: Esta variable se llamaba prviamente SQL_BIG_TABLES.) CHARACTER SET {charset_name | DEFAULT} Esto mapea todas las cadenas desde y hacia el cliente con el mapeo dado. Puede aadir nuevos mapeos editando sql/convert.cc en la distribucin fuente MySQL. En MySQL 5.0, SET CHARACTER SET cambia tres variables de sistema character_set_client y character_set_results se actualizan con el conjunto de caracteres dado, y character_set_connection al valor de character_set_database. El mapeo por defecto puede restaurarse usando el valor DEFAULT. Tenga en cuenta que la sintaxis para SET CHARACTER SET difiere de la de la mayora de otras opciones. FOREIGN_KEY_CHECKS = {0 | 1} Con valor de 1 (por defecto), las claves forneas para tablas InnoDB se chequean. Si se pone a 0, se ignoran. Deshabilitar el chequeo de clave fornea puede ser til para recargar tablas InnoDB en un orden distinto que el requerido por sus relaciones padre/hijo, Consulte Seccin 15.6.4, Restricciones (constraints) FOREIGN KEY. IDENTITY = value La variable es un sinnimo para la variable LAST_INSERT_ID . Existe por compatibilidad con otras bases de datos. Puede leer su valor con SELECT @@IDENTITY, y cambiarlo mediante SET IDENTITY. INSERT_ID = value Cambia el valor a ser usado por los comandos INSERT o ALTER TABLE al insertar un valor AUTO_INCREMENT . Esto se usa principalmente con el lob binario. LAST_INSERT_ID = value 705
Sintaxis de SET
Cambia el valor a ser retornado de LAST_INSERT_ID(). Esto se almacena en el log binario cuando usa LAST_INSERT_ID() en un comando que actualice una tabla. Cambiar esta variable no actualiza el valor retornado por la funcin de la mysql_insert_id() API de C. NAMES {'charset_name' | DEFAULT} SET NAMES cambia tres variables de sesin de sistema character_set_client, character_set_connection, y character_set_results al conjunto de caracteres dado. Cambiar character_set_connection a charset_name tambin cambia collation_connection a la colacin por defecto para charset_name. El mapeo por defecto puede restaurarse usando un valor de DEFAULT. Tenga en cuenta que la sintaxis para SET NAMES difiere de la usada para la mayora de otras opciones. SQL_NOTES = {0 | 1} Con el valor 1 (por defecto), advertencias del nivel Note se registran. Con valor 0, las advertencias Note se suprimen. mysqldump incluye la salida para cambiar esta variable a 0 as que recargar el fichero volcado no produce advertencias para eventos que no afectan a la integridad de la operacin de recarga. SQL_NOTES se aadi en MySQL 5.0.3. SQL_AUTO_IS_NULL = {0 | 1} Con valor 1 (por defecto), puede encontrar el ltimo registro insertado para una tabla que contiene una columna AUTO_INCREMENT usando el siguiente constructor:
WHERE auto_increment_column IS NULL
Este comportamiento lo usan algunos programas ODBC, como Access. SQL_BIG_SELECTS = {0 | 1} Con valor 0, MySQL aborta los comandos SELECT que probablemente tardarn mucho tiempo (esto es, comandos para los que el optimizador estima que el nmero de registros examinados excede el valor de max_join_size). Esto es til cuando un comando WHERE no aconsejable se ejecuta. El valor por defecto para una nueva conexin es 1, que permite todos los comandos SELECT . Si cambia la variable de sistema max_join_size a un valor distinto a DEFAULT, SQL_BIG_SELECTS se pone a 0. SQL_BUFFER_RESULT = {0 | 1} SQL_BUFFER_RESULT fuerza los resultados de los comandos SELECT a poner en tablas temporales. Esto ayuda a MySQL a liberar los bloqueos de tabla rpidamente y pueden ser beneficioso en caso que tarde un largo tiempo para enviar resultados al cliente. SQL_LOG_BIN = {0 | 1} Con valor 0, no se realiza logueo en el log binario para el cliente. El cliente debe tener el permiso SUPER para cambiar esta opcin. SQL_LOG_OFF = {0 | 1} Con valor 1, no se realiza logueo en el log de consultas generales para el cliente. El cliente debe tener el permiso SUPER para cambiar esta opcin. SQL_LOG_UPDATE = {0 | 1} Esta variable est obsoleta, y es mapea a SQL_LOG_BIN.
706
Sintaxis de SHOW
SQL_QUOTE_SHOW_CREATE = {0 | 1} Con valor 1, SHOW CREATE TABLE entrecomilla los nombres de tabla y columnas. Si se pone a 0, se desactiva el entrecomillado. Esta opcin est activada por defecto, as que la replicacin funciona para tablas con nombres de tabla y columna que no lo requieren. Consulte Seccin 13.5.4.5, Sintaxis de SHOW CREATE TABLE. SQL_SAFE_UPDATES = {0 | 1} Con valor 1, MySQL aborta comandos UPDATE o DELETE que no usan una clave en la clusula WHERE o LIMIT . Esto hace posible cazar los comandos UPDATE o DELETE donde las claves no se usan apropiadamente y que probablemente cambiaran o borraran un gran nmero de registros. SQL_SELECT_LIMIT = {value | DEFAULT} El mximo nmero de registros a retornar desde comandos SELECT . El valor por defecto para una nueva conexin es unlimited. Si cambia este lmite, el valor por defecto puede restaurarse usando un valor SQL_SELECT_LIMIT de DEFAULT. Si un SELECT tiene una clusula LIMIT el LIMIT tiene preferencia sobre el valor de SQL_SELECT_LIMIT. SQL_SELECT_LIMIT no se aplica a comandos SELECT ejecutados en rutinas almacenadas. Tampoco se aplica a comandos SELECT que no producen un conjunto de resultados a ser retornado al cliente. Esto incluye comandos SELECT en subconsultas, CREATE TABLE ... SELECT, y INSERT INTO ... SELECT. SQL_WARNINGS = {0 | 1} Esta variable controla si comandos INSERT de un registro producen una cadena de informacin si hay una advertencia. Por defecto es 0. Cambie el valor a 1 para producir una cadena de informacin. TIMESTAMP = {timestamp_value | DEFAULT} Cambia la hora del cliente. Se usar para obtener la fecha y hora original si usa el log binario para restaurar registros. timestamp_value debe ser un Unix epoch timestamp, no un timestamp de MySQL. UNIQUE_CHECKS = {0 | 1} Con valor 1 (por defecto), se realizan chequeos en tablas InnoDB para ndices secundarios. Con valor 0, no se hacen chequeos de valores nicos para entradas de ndices insertados en el bffer de insercin de InnoDB. Si sabe con certeza que sus datos no contienen violaciones de valores nicos, puede ponerlo a 0 para acelerar importaciones de tablas grandes a InnoDB.
707
Sintaxis de SHOW
[FULL] PROCESSLIST [GLOBAL | SESSION] STATUS [LIKE 'pattern'] TABLE STATUS [FROM db_name] [LIKE 'pattern'] [OPEN] TABLES [FROM db_name] [LIKE 'pattern'] TRIGGERS [GLOBAL | SESSION] VARIABLES [LIKE 'pattern'] WARNINGS [LIMIT [offset,] row_count]
El comando SHOW tambin tiene formas que proporcionan informacin acerca de servidores de replicacin maestros y esclavos y se describen en Seccin 13.6, Sentencias de replicacin:
SHOW SHOW SHOW SHOW SHOW BINLOG EVENTS MASTER LOGS MASTER STATUS SLAVE HOSTS SLAVE STATUS
En la sintaxis para un comando SHOW dado incluye una parte LIKE 'pattern' , 'pattern' es una cadena que puede contener los caracteres de SQL '%' y '_' . El patrn es til para restringir la salida del comando para valores coincidentes.
El comando SHOW CHARACTER SET muestra todos los conjuntos de caracteres disponibles. Esto tiene una clusula LIKE opcional que indica qu nombres de conjuntos de caracteres hay coincidentes. Por ejemplo:
mysql> SHOW CHARACTER SET LIKE 'latin%'; +---------+-----------------------------+-------------------+--------+ | 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 | +---------+-----------------------------+-------------------+--------+
La columna Maxlen muestra el mximo nmero de bytes usados para almacenar un carcter.
La salida de SHOW COLLATION incluye todos los conjuntos de caracteres disponibles. Tiene una clusula LIKE opcional cuyo pattern indica qu nombres de colacin coinciden. Por ejemplo:
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 | +-------------------+---------+----+---------+----------+---------+
La columna Default indica si una colacin est por defecto para su conjunto de caracteres. Compiled indica si el conjunto de caracteres est compilado en el servidor. Sortlen est relacionado con la cantidad de memoria requerida para ordenar cadenas expresadas en el conjunto de caracteres.
708
Sintaxis de SHOW
SHOW COLUMNS muestra informacin acerca de las columnas en una tabla dada. Tambin funciona para vistas desde MySQL 5.0.1. Si los tipos de columnas difieren de los que espera basados en su comando CREATE TABLE, tenga en cuenta que MySQL a veces cambia tipos de columnas cuando crea o altera una tabla. Las condiciones en que esto ocurre se describen en Seccin 13.1.5.1, Cambios tcitos en la especificacin de columnas. La palabra clave FULL hace que la salida incluya los permisos que tiene as como cualquier comentario por columna para cada columna. Puede usar db_name.tbl_name como alternativa a la sintaxis tbl_name FROM db_name . En otras palabras, estos dos comandos son equivalentes:
mysql> SHOW COLUMNS FROM mytable FROM mydb; mysql> SHOW COLUMNS FROM mydb.mytable;
SHOW FIELDS es un sinnimo para SHOW COLUMNS. Puede listar las columnas de una tabla con el comando mysqlshow db_name tbl_name . El comando DESCRIBE proporciona informacin similar a SHOW COLUMNS. Consulte Seccin 13.3.1, Sintaxis de DESCRIBE (Informacin acerca de las columnas).
Muestra un comando CREATE DATABASE que crea la base de datos dada. SHOW CREATE SCHEMA puede usarse desde MySQL 5.0.2.
mysql> SHOW CREATE DATABASE test\G *************************** 1. row *************************** Database: test Create Database: CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */
Muestra un comando CREATE TABLE que crea la tabla dada. Desde MySQL 5.0.1, este comando funciona con vistas.
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) ) ENGINE=MyISAM
SHOW CREATE TABLE entrecomilla los nombres de tabla y columna segn el valor de la opcin SQL_QUOTE_SHOW_CREATE . Seccin 13.5.3, Sintaxis de SET.
SHOW DATABASES lista la base de datos en el servidor MySQL . Puede obtener esta lista usando el comando mysqlshow . En MySQL 5.0, ve slo las bases de datos para las que tiene alguna clase de permiso, si no tiene el permiso SHOW DATABASES .
709
Sintaxis de SHOW
Si el servidor se arranc con la opcin --skip-show-database , no puede usar este comando a no ser que tenga el permiso SHOW DATABASES . SHOW SCHEMAS puede usarse desde MySQL 5.0.2
SHOW ENGINE muestra informacin de log o estado acerca de motores de almacenamiento. Los siguientes comandos se soportan actualmente:
SHOW ENGINE BDB LOGS SHOW ENGINE INNODB STATUS
SHOW ENGINE BDB LOGS muestra informacin de estado acerca de ficheros de log BDB existentes. Retorna los siguientes campos: File Ruta completa al fichero de log. Type Tipo del fichero de log (BDB para ficheros de log Berkeley DB). Status Estado del fichero de log (FREE si el fichero puede borrarse, o IN USE si el fichero se necesita en el subsistema de transaccin) SHOW ENGINE INNODB STATUS muestra informacin extendida acerca del estado del comando InnoDB . Sinnimos antiguos (ahora obsoletos) para estos comandos son SHOW [BDB] LOGS y SHOW INNODB STATUS. SHOW ENGINE puede usarse desde MySQL 4.1.2.
SHOW ENGINES muestra su informacin de estado acerca del motor de almacenamiento. Esto es particularmente til para chequear si un motor de almacenamiento se soporta, o para ver si el motr es. SHOW TABLE TYPES es un sinnimo obsoleto.
mysql> SHOW ENGINES\G *************************** 1. row *************************** Engine: MyISAM Support: DEFAULT Comment: Default engine as of MySQL 3.23 with great performance *************************** 2. row *************************** Engine: MEMORY Support: YES Comment: Hash based, stored in memory, useful for temporary tables *************************** 3. row *************************** Engine: HEAP Support: YES Comment: Alias for MEMORY *************************** 4. row *************************** Engine: MERGE Support: YES Comment: Collection of identical MyISAM tables *************************** 5. row ***************************
710
Sintaxis de SHOW
Engine: MRG_MYISAM Support: YES Comment: Alias for MERGE *************************** 6. row *************************** Engine: ISAM Support: NO Comment: Obsolete storage engine, now replaced by MyISAM *************************** 7. row *************************** Engine: MRG_ISAM Support: NO Comment: Obsolete storage engine, now replaced by MERGE *************************** 8. row *************************** Engine: InnoDB Support: YES Comment: Supports transactions, row-level locking, and foreign keys *************************** 9. row *************************** Engine: INNOBASE Support: YES Comment: Alias for INNODB *************************** 10. row *************************** Engine: BDB Support: YES Comment: Supports transactions and page-level locking *************************** 11. row *************************** Engine: BERKELEYDB Support: YES Comment: Alias for BDB *************************** 12. row *************************** Engine: NDBCLUSTER Support: NO Comment: Clustered, fault-tolerant, memory-based tables *************************** 13. row *************************** Engine: NDB Support: NO Comment: Alias for NDBCLUSTER *************************** 14. row *************************** Engine: EXAMPLE Support: NO Comment: Example storage engine *************************** 15. row *************************** Engine: ARCHIVE Support: YES Comment: Archive storage engine *************************** 16. row *************************** Engine: CSV Support: NO Comment: CSV storage engine *************************** 17. row *************************** Engine: FEDERATED Support: YES Comment: Federated MySQL storage engine *************************** 18. row *************************** Engine: BLACKHOLE Support: YES Comment: /dev/null storage engine (anything you write to it disappears)
Un valor Support indica si el motor se soporta, y cul est activo por defecto. Por ejemplo, si el servidor se arranca con la opcin --default-table-type=InnoDB, el valor Support para el registro InnoDB tiene el valor DEFAULT.
Este comando es similar a SHOW WARNINGS, excepto que en lugar de mostrar errores, advertencias, y notas slo muestra errores. La clusula LIMIT tiene la misma sintaxis que para el comando SELECT . Consulte Seccin 13.2.7, Sintaxis de SELECT.
711
Sintaxis de SHOW
El comando SHOW COUNT(*) ERRORS muestra el nmero de errores. Puede recibir este nmero de la variable error_count :
SHOW COUNT(*) ERRORS; SELECT @@error_count;
Este comando lista el comando GRANT que debe realizarse para duplicar los permisos para una cuenta de usuario MySQL.
mysql> SHOW GRANTS FOR 'root'@'localhost'; +---------------------------------------------------------------------+ | Grants for root@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+
Para listar los permisos de la sesin actual, puede usar cualquiera de los siguientes comandos:
SHOW GRANTS; SHOW GRANTS FOR CURRENT_USER; SHOW GRANTS FOR CURRENT_USER();
SHOW INDEX retorna informacin de ndice de tabla en un formato que recuerda la llamada SQLStatistics en ODBC. SHOW INDEX returna los siguientes campso: Table Nombre de tabla. Non_unique 0 si el ndice no puede contener duplicados, 1 si puede. Key_name Nombre del ndice Seq_in_index Nmero de secuencia de columna en el ndice, comenzando con 1. Column_name Nombre de columna.
Collation Cmo se ordena la columna en el ndice. En MySQL, puede tener valores 'A' (Ascendente) o NULL (No ordenado).
712
Sintaxis de SHOW
Cardinality Nmero de valores nicos en el ndice. Se actualiza ejecutando ANALYZE TABLE o myisamchk -a. Cardinality se cuenta basndose en las estadsticas almacenadas como enteros, as que no es necesariamente precisa para tablas pequeas. Mientras ms grande sea, ms grande es la probabilidad que MySQL use el ndice al hacer joins. Sub_part Nmero de caracteres indexados si la columna slo est indexada parcialmente. NULL si la columna entera est indexada. Packed Indica cmo est empaquetada la clave. NULL si no lo est. Null Contiene YES si la columna puede contener NULL. Si no, la columna contiene NO desde MySQL 5.0.3, y '' antes. Index_type Mtodo de ndice usado (BTREE, FULLTEXT, HASH, RTREE). Comment Comentarios varios. Puede usar db_name.tbl_name como alternativa para la sintaxis tbl_name FROM db_name . Estos dos comandos son equivalentes:
mysql> SHOW INDEX FROM mytable FROM mydb; mysql> SHOW INDEX FROM mydb.mytable;
SHOW KEYS es sinnimo para SHOW INDEX. Puede listar los ndices de una tabla con el comando mysqlshow -k db_name tbl_name .
En MySQL 5.0, este es un sinnimo obsoleto para SHOW ENGINE INNODB STATUS. Consulte Seccin 13.5.4.7, Sintaxis de SHOW ENGINE.
En MySQL 5.0, este es un sinnimo obsoleto para SHOW ENGINE BDB LOGS. Consulte Seccin 13.5.4.7, Sintaxis de SHOW ENGINE.
SHOW OPEN TABLES lista las tablas no TEMPORARY abiertas actualmente en la cach de tablas. Consulte Seccin 7.4.8, Cmo abre y cierra tablas MySQL. SHOW OPEN TABLES returna los siguientes campos: Database La base de datos que contiene la tabla.
713
Sintaxis de SHOW
Table Nombre de tabla. In_use Nmero de veces que la tabla est en uso para consultas. Si el contador es cero, la tabla est abierta, pero no est siendo usada. Name_locked Si un nombre de tabla est bloqueado. El bloqueo de nombres se usa para operaciones tales como borrar o renombrar tablas. SHOW OPEN TABLES se aadi en MySQL 3.23.33.
SHOW PRIVILEGES muestra la lista de permisos de sistema que soporta MySQL server. La salida exacta depende de la versin de su servidor.
mysql> SHOW PRIVILEGES\G *************************** 1. row *************************** Privilege: Alter Context: Tables Comment: To alter the table *************************** 2. row *************************** Privilege: Alter routine Context: Functions,Procedures Comment: To alter or drop stored functions/procedures *************************** 3. row *************************** Privilege: Create Context: Databases,Tables,Indexes Comment: To create new databases and tables *************************** 4. row *************************** Privilege: Create routine Context: Functions,Procedures Comment: To use CREATE FUNCTION/PROCEDURE *************************** 5. row *************************** Privilege: Create temporary tables Context: Databases Comment: To use CREATE TEMPORARY TABLE *************************** 6. row *************************** Privilege: Create view Context: Tables Comment: To create new views *************************** 7. row *************************** Privilege: Create user Context: Server Admin Comment: To create new users *************************** 8. row *************************** Privilege: Delete Context: Tables Comment: To delete existing rows *************************** 9. row *************************** Privilege: Drop Context: Databases,Tables Comment: To drop databases, tables, and views *************************** 10. row *************************** Privilege: Execute Context: Functions,Procedures Comment: To execute stored routines *************************** 11. row *************************** Privilege: File Context: File access on server Comment: To read and write files on the server *************************** 12. row ***************************
714
Sintaxis de SHOW
Privilege: Grant option Context: Databases,Tables,Functions,Procedures Comment: To give to other users those privileges you possess *************************** 13. row *************************** Privilege: Index Context: Tables Comment: To create or drop indexes *************************** 14. row *************************** Privilege: Insert Context: Tables Comment: To insert data into tables *************************** 15. row *************************** Privilege: Lock tables Context: Databases Comment: To use LOCK TABLES (together with SELECT privilege) *************************** 16. row *************************** Privilege: Process Context: Server Admin Comment: To view the plain text of currently executing queries *************************** 17. row *************************** Privilege: References Context: Databases,Tables Comment: To have references on tables *************************** 18. row *************************** Privilege: Reload Context: Server Admin Comment: To reload or refresh tables, logs and privileges *************************** 19. row *************************** Privilege: Replication client Context: Server Admin Comment: To ask where the slave or master servers are *************************** 20. row *************************** Privilege: Replication slave Context: Server Admin Comment: To read binary log events from the master *************************** 21. row *************************** Privilege: Select Context: Tables Comment: To retrieve rows from table *************************** 22. row *************************** Privilege: Show databases Context: Server Admin Comment: To see all databases with SHOW DATABASES *************************** 23. row *************************** Privilege: Show view Context: Tables Comment: To see views with SHOW CREATE VIEW *************************** 24. row *************************** Privilege: Shutdown Context: Server Admin Comment: To shut down the server *************************** 25. row *************************** Privilege: Super Context: Server Admin Comment: To use KILL thread, SET GLOBAL, CHANGE MASTER, etc. *************************** 26. row *************************** Privilege: Update Context: Tables Comment: To update existing rows *************************** 27. row *************************** Privilege: Usage Context: Server Admin Comment: No privileges - allow connect only
SHOW PROCESSLIST le muestra qu flujos estn en ejecucin. Puede obtener esta informacin usando el comando mysqladmin processlist . Si tiene el permiso SUPER , puede ver todos los flujos. De otro modo, puede ver slo los propios (esto es, flujos asociados con la cuenta MySQL que
715
Sintaxis de SHOW
est usando). Consulte Seccin 13.5.5.3, Sintaxis de KILL. Si no usa la palabra clave FULL , slo los primeros 100 caracteres de cada consulta se muestran. En MySQL 5.0, el comando reporta el nombre de equipo ara conexiones TCP/IP en formato host_name:client_port para hacer ms fcil determinar qu hace cada cliente. Este comando es til si obtiene el mensaje de error "demasiadas conexiones" para encontrar qu ocurre. MySQL reserva una conexin extra para usar por cuentas con el permiso SUPER, para asegurar que el administrador siempre es capaz de conectar y comprobar el sistema (asumiendo que no da este permiso a todos los usuarios). Algunos estados vistos comnmente en la salida de SHOW PROCESSLIST: Checking table El flujo est realizando un chequeo (automtico) de la tabla. Closing tables Significa que el flujo est volcando los datos que han cambiado de la tabla a disco y cerrando las tablas usadas. Esto debe ser una operacin rpido. Si no lo es, debe verificar que no tiene el disco lleno y que el disco no tiene un uso muy pesado. Connect Out Esclavo conectando con el maestro. Copying to tmp table on disk El conjunto de resultados temporal era mayor que tmp_table_size y el flujo est cambiando la tabla temporal de memoria a disco para ahorrar memoria. Creating tmp table El flujo est creando una tabla temporal para guardar parte del resultado de una consulta. deleting from main table El servidor est ejecutando la primera parte de un borrado de tablas mltiple y borrando slo la primera tabla. deleting from reference tables El servidor est ejecutando la segunda parte de un borrado de tablas mltiples y borrando los registros coincidentes de las otras tablas. Flushing tables El flujo est ejecutando FLUSH TABLES y espera a que todos los flujos cierren sus tablas. Killed Alguien ha enviado un comando KILL al flujo y debera abortar en cuanto chequee el flag kill. El flag se chequea en cada vuelta al bucle principal de MySQL, pero en algunos casos puede tardar algo de tiempo en que muera el flujo. Si el flujo est bloqueado por algn otro flujo, el kill tiene efecto en cuanto el otro flujo libera el bloqueo. Locked La consulta est bloqueada por otra consulta. Sending data 716
Sintaxis de SHOW
El flujo est procesando registros para un comando SELECT y tambin enviando datos al cliente. Sorting for group El flujo est ordenando para un GROUP BY. Sorting for order El flujo est ordenando para un ORDER BY. Opening tables El flujo est intentando abrir una tabla. Esto debera ser un proceso muy rpido, a no ser que algo importante evite la abertura. Por ejemplo, un comando ALTER TABLE o LOCK TABLE puede evitar abrir una tabla hasta que el comando acabe. Removing duplicates La consulta usaba SELECT DISTINCT de forma que MySQL no poda optimizar las distintas operaciones en una fase temprana. Debido a ello, MySQL necesita una fase extra para borrar todos los registros duplicados antes de enviar el resultado al cliente. Reopen table El flujo obtivo un bloqueo para la tabla, pero se dio cuenta tras obtenerlo que la estructura de la tabla cambi. Se libera el bloqueo, cierra la tabla y trata de reabrirla. Repair by sorting El cdigo de reparacin est usando una ordenacin para crear ndices. Repair with keycache El cdigo de reparacin est usando creacin de claves una a una en la cach de claves. Esto es mucho ms lento que Repair by sorting. Searching rows for update El flujo hace una primera fase para encontrar todos los registro coincidentes antes de actualizarlos. Esto debe hacerse si UPDATE est cambiando el ndice que se usa para encontrar los registros implicados. Sleeping El flujo espera que el cliente enve un nuevo comando . System lock El flujo espera obtener un bloqueo de sistema externo para la tabla. Si no est usando mltiples servidors mysqld accediendo a las mismas tablas, puede deshabilitar los bloqueos de sistema con la opcin --skip-external-locking . Upgrading lock El handler INSERT DELAYED trata de obtener un bloqueo para la tabla para insertar registros. Updating El flujo est buscando registros para actualizar. User Lock El flujo espera un GET_LOCK().
717
Sintaxis de SHOW
Waiting for tables El flujo obtuvo una notificacin que la estructura de la tabla cambi y necesita reabrirla. Sin embargo, para ello, debe esperar a que el resto de flujos cierren la tabla en cuestin. Esta notificacin tiene lugar si otro flujo ha usado FLUSH TABLES o uno de los siguientes comandos en la tabla en cuestin: FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, o OPTIMIZE TABLE. waiting for handler insert El handler INSERT DELAYED ha procesado las inserciones pendientes y espera nuevas. La mayora de estados se corresponden a operaciones rpidas. Si un flujo est en alguno de ellos varios segundos, puede existir un problema que necesite investigar. Hay algunos estdos que no se mencionan en la lista precedente, pero varios de ellos son tiles slo para encontrar fallos en el servidor.
SHOW STATUS proporciona informacin de estado del servidor. Esta informacin puede obtenerse usando el comando mysqladmin extended-status . Aqu se muestra una salida parcial. La lista de variables y sus vallires pueden ser distintos para su servidor. El significado de cada variable se da en Seccin 5.3.4, Variables de estado del servidor.
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 | +--------------------------+------------+
Con una clusula LIKE , el comando muestra slo las variables que coinciden con el patrn:
mysql> SHOW STATUS LIKE 'Key%'; +--------------------+----------+ | Variable_name | Value | +--------------------+----------+ | Key_blocks_used | 14955 | | Key_read_requests | 96854827 | | Key_reads | 162040 | | Key_write_requests | 7589728 |
718
Sintaxis de SHOW
Las opciones GLOBAL y SESSION son nuevas en MySQL 5.0.2 Con GLOBAL, obtiene los valores de estado para todas las conexiones a MySQL. Con SESSION, obtiene los valores de estado para la conexin actual. Si no usa estas opciones, por defecto es SESSION. LOCAL es sinnimo de SESSION. Tenga en cuenta que algunas variables de estado slo tienen un valor global. Para ellas obtiene el mismo valor para GLOBAL y SESSION.
SHOW TABLE STATUS funciona como SHOW TABLE, pero proporciona mucha ms informacin acerca de cada tabla. Puede obtener esta lista usando el comando mysqlshow --status db_name . Desde MySQL 5.0.1, este comando tambin muestra informacin sobre vistas. SHOW TABLE STATUS returna los siguientes campos: Name Nombre de tabla. Engine Motor para la tabla. Antes de MySQL 4.1.2, este valor se llama Type. Consulte Captulo 14, Motores de almacenamiento de MySQL y tipos de tablas. Version Nmero de versin del fichero .frm de la tabla. Row_format Formato de almacenamiento de registros (Fixed, Dynamic, Compressed, Redundant, Compact). Desde MySQL/InnoDB 5.0.3, el formato de tablas InnoDB se reporta como Redundant o Compact. Antes de 5.0.3, las tablas InnoDB siempre estn en formato Redundant . Rows Nmero de registros. Algunos motores como MyISAM, guardan el nmero exacto. Para otros motores, como InnoDB, este valor es una aproximacin y puede variar del valor real hasta de un 40 a 50%. En tales casos, use SELECT COUNT(*) para obtener el nmero real de registros. El valor Rows es NULL para tablas en la base de datos INFORMATION_SCHEMA . Avg_row_length Longitud de registro media. Data_length Tamao del fichero de datos. Max_data_length Mxima longitud del fichero d edatos. Este es el nmero total de bytes de datos que pueden almacenarse en la tabla dado el tamao de puntero de datos usado. Index_length
719
Sintaxis de SHOW
Tamao de fichero ndice. Data_free Nmero de bytes reservados no usados. Auto_increment Siguiente valor AUTO_INCREMENT . Create_time Cundo se cre la tabla . Update_time Cundo se actualiz por ltima vez el fichero de datos. Check_time Cundo se cheque la tabla por ltima vez. Collation Conjunto de caracteres y colacin de la tabla. Checksum Valor de checksum en vivo (si hay). Create_options Opciones extra usadas con CREATE TABLE. Comment Comentario usado al crear la tabla (o informacin de porqu MySQL no puede acceder a la informacin de tabla). En el comentario de tabla, las tablas InnoDB reportan el espacio libre del espacio de tabla al que pertenece la tabla. Para una tabla localizada en el espacio compartido, este es el espacio libre del espacio de tabla compartido. Si usa mltiples espacios y la tabla tiene el suyo, el espacio libre es slo para esa tabla. Para tablas MEMORY (HEAP) los valores Data_length, Max_data_length, y Index_length aproximan la cantidad real de memoria reservada. El algoritmo de reserva reserva grandes cantidades de memoria para reducir el nmero de operaciones de reserva. Para vistas, todos los campos mostrados por SHOW TABLE STATUS son NULL excepto que Name indicata el nombre de vista y Comment dice view.
SHOW TABLES lista las tablas no TEMPORARY en una base de datos dada. Puede obtener esta lista usando el comando mysqlshow db_name . Antes de MySQL 5.0.1, la salida de SHOW TABLES contiene una nica columna de nombres de tabla. Desde MySQL 5.0.1, este comando lista cualquier vista en la base de datos. Desde MySQL 5.0.2, se soporta el modificador FULL de forma que SHOW FULL TABLES muestra una segunda columna de salida. Los valores para la segunda columna son BASE TABLE para una tabla VIEW para una vista.
720
Sintaxis de SHOW
Nota: Si no tiene permisos para una tabla, la tabla no se muestra en la salida de SHOW TABLES o mysqlshow db_name.
SHOW TRIGGERS lista los disparadores definidos en el MySQL server. Se implement en MySQL 5.0.10. Para el disparadores ins_sum como se define en Seccin 20.3, Utilizacin de disparadores, la salida de este comando es la que se muestra:
mysql> SHOW TRIGGERS LIKE 'acc%'; +---------+--------+---------+-------------------------------+--------+---------+ | Trigger | Event | Table | Statement | Timing | Created | +---------+--------+---------+-------------------------------+--------+---------+ | ins_sum | INSERT | account | SET @sum = @sum + NEW.amount | BEFORE | NULL | +---------+--------+---------+-------------------------------+--------+---------+
Nota: Cuando use una clusula LIKE con SHOW TRIGGERS, la expresin a cumplir (expr) se compara con el nombre de la tabla en que se declara el disparador, y no con el nombre del disparador:
mysql> SHOW TRIGGERS LIKE 'ins%'; Empty set (0.01 sec)
Aqu se muestra una breve explicacin de las columnas de la salida de este comando: Trigger: Nombre del disparador. Event: Evento que invoca el disparador. Debe ser 'INSERT', 'UPDATE', o 'DELETE'. Table: La tabla para la que se define el disparador. Statement: Comando a ejecutar cuando se invoca el disparador. Es lo mismo que el texto mostrado en la columna ACTION_STATEMENT de INFORMATION_SCHEMA.TRIGGERS. Timing: Puede ser 'BEFORE' o 'AFTER'. Created: Actualmente el valor de esta columna siempre es NULL. Debe tener el permiso SUPER para ejecutar SHOW TRIGGERS. Consulte Seccin 22.1.16, La tabla INFORMATION_SCHEMA TRIGGERS.
SHOW VARIABLES muestra los valores de algunas variables de sistema de MySQL. Esta informacin puede obtenerse usando el comando mysqladmin variables . Con la opcin GLOBAL, obtiene los valores que se usan para nuevas conexiones de MySQL. Con SESSION, obtiene los valores que hay en efecto para la conexin actual. Si no usa estas opciones, por defecto es SESSION. LOCAL es sinnimo de SESSION. Si los valores por defecto no son adecuados, puede cambiar la mayora de variables usando opciones de lnea de comandos cuando mysqld arranca o en tiempo de ejecucin con el comando SET . Consulte Seccin 5.3.1, Opciones del comando mysqld y Seccin 13.5.3, Sintaxis de SET.
721
Sintaxis de SHOW
La salida parcial se muestra aqu. La lista de variables y sus valores pueden ser distintos para su servidor. El significado de cada variable se da en Seccin 5.3.3, Variables de sistema del servidor. Informacin acerca de cmo adecuarlos se proporciona en Seccin 7.5.2, Afinar parmetros del servidor.
mysql> SHOW VARIABLES; +---------------------------------+---------------------------------------------------------+ | Variable_name | Value | +---------------------------------+---------------------------------------------------------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | | automatic_sp_privileges | ON | | back_log | 50 | | basedir | / | | bdb_cache_size | 8388600 | | bdb_home | /var/lib/mysql/ | | bdb_log_buffer_size | 32768 | ... ... ... | 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 | ... ... ... | time_zone | SYSTEM | | timed_mutexes | OFF | | tmp_table_size | 33554432 | | tmpdir | | | transaction_alloc_block_size | 8192 | | transaction_prealloc_size | 4096 | | tx_isolation | REPEATABLE-READ | | updatable_views_with_limit | YES | | version | 5.0.7-beta-Max | | version_bdb | Sleepycat Software: Berkeley DB 4.1.24: (June 11, 2005) | | version_comment | MySQL Community Edition - Max (GPL) | | version_compile_machine | i686 | | version_compile_os | pc-linux-gnu | | wait_timeout | 28800 | +---------------------------------+---------------------------------------------------------+
Con una clusula LIKE , el comando muestra slo las variables que coinciden con el patrn:
mysql> SHOW VARIABLES LIKE 'have%'; +-----------------------+----------+ | Variable_name | Value | +-----------------------+----------+ | have_archive | NO | | have_bdb | YES | | have_blackhole_engine | YES | | have_compress | YES | | have_crypt | YES | | have_csv | YES | | have_example_engine | YES | | have_federated_engine | YES | | have_geometry | YES | | have_innodb | YES | | have_isam | NO | | have_ndbcluster | DISABLED | | have_openssl | NO | | have_query_cache | YES | | have_raid | NO | | have_rtree_keys | YES | | have_symlink | YES | +-----------------------+----------+
722
Sintaxis de SHOW
SHOW WARNINGS muestra los mensajes de error, advertencia y notas retornadas por el ltimo comando que haya generado algn mensaje, o nada si el ltimo mensaje que haya usado una tabla no haya generado mensajes. Un comando relacionado, SHOW ERRORS, slo muestra los errores. Consulte Seccin 13.5.4.9, Sintaxis de SHOW ERRORS. La lista de mensajes se resetea para cada nuevo comando que use una tabla. El comando SHOW COUNT(*) WARNINGS muestra el nmero total de errores, advertencias y notas. Puede recibir este nmero de la variable warning_count :
SHOW COUNT(*) WARNINGS; SELECT @@warning_count;
El valor de warning_count puede ser mayor que el nmero de mensajes mostrados por SHOW WARNINGS si la variable de sistema max_error_count tiene un valor tan pequeo que no se almacenen todos los mensajes. Se muestra posteriormente un ejemplo de cmo puede pasar esto. La clusula LIMIT tiene la misma sintaxis que para el comando SELECT . Consulte Seccin 13.2.7, Sintaxis de SELECT. El servidor MySQL devuelve el nmero total de errores, advertencias, y notas que hayan resultado desde el ltimo comando. Si usa la API de C, este valor puede obtenerse llamando a mysql_warning_count(). Consulte Seccin 24.2.3.63, mysql_warning_count(). Las advertencias se generan para comandos tales como LOAD DATA INFILE y comandos DML tales como INSERT, UPDATE, CREATE TABLE, y ALTER TABLE. El siguiente comando DROP TABLE provoca una nota:
mysql> DROP TABLE IF EXISTS no_such_table; mysql> SHOW WARNINGS; +-------+------+-------------------------------+ | Level | Code | Message | +-------+------+-------------------------------+ | Note | 1051 | Unknown table 'no_such_table' | +-------+------+-------------------------------+
Aqu hay un ejemplo simple que muesta una advertencia de sintaxis para CREATE TABLE y advertencias de conversiones para INSERT:
mysql> CREATE TABLE t1 (a TINYINT NOT NULL, b CHAR(4)) TYPE=MyISAM; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Warning Code: 1287 Message: 'TYPE=storage_engine' is deprecated, use 'ENGINE=storage_engine' instead 1 row in set (0.00 sec) mysql> INSERT INTO t1 VALUES(10,'mysql'),(NULL,'test'), -> (300,'Open Source'); Query OK, 3 rows affected, 4 warnings (0.01 sec) Records: 3 Duplicates: 0 Warnings: 4 mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Warning Code: 1265 Message: Data truncated for column 'b' at row 1 *************************** 2. row *************************** Level: Warning Code: 1263 Message: Data truncated, NULL supplied to NOT NULL column 'a' at row 2 *************************** 3. row ***************************
723
Level: Warning Code: 1264 Message: Data truncated, out of range for column 'a' at row 3 *************************** 4. row *************************** Level: Warning Code: 1265 Message: Data truncated for column 'b' at row 3 4 rows in set (0.00 sec)
El mximo nmero de errores, advertencias y notas a almacenar se controla mediante la variable de sistema max_error_count. Por defecto, su valor es 64. Para cambiar el nmero de mensajes que quiere almacenar, cambie el valor de max_error_count. En el siguiente ejemplo, el comando ALTER TABLE produce tres mensajes de advertencia, pero slo se almacena uno porque max_error_count vale 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> SELECT @@warning_count; +-----------------+ | @@warning_count | +-----------------+ | 3 | +-----------------+ 1 row in set (0.01 sec) mysql> SHOW WARNINGS; +---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1263 | Data truncated for column 'b' at row 1 | +---------+------+----------------------------------------+ 1 row in set (0.00 sec)
Para deshabilitar las advertencias, ponga max_error_count a 0. En este caso, warning_count indica cuntas advertencias ocurren, pero ninguno de los mensajes se almacenan. Desde MySQL 5.0.3, puede poner la variable de sesin SQL_NOTES a 0 para que las advertencias del nivel Note no se guarden.
El comando CACHE INDEX asigna ndices de tabla a una cach de clave especfica. Se usa slo para tablas MyISAM . El siguiente comando asigna ndices de las tablas t1, t2, y t3 a la cach de claves llamada hot_cache:
724
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 sintaxis de CACHE INDEX le permite especifcar que slo deben asignarse ndicess particulares de una tabla a la cach. Sin embargo, la implementacin actual asigna todos los ndices de la tabla a la cach, as que no hay razn para especificar nada ms que el nombre de tabla. La cach de clave referenciada en un comando CACHE INDEX puede crearse cambiando su tamao con un comando que asigne un valor al parmetro o en la configuracin del parmetro del servidor. Por ejemplo:
mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
Puede accederse a los parmetros de la cach de claves como miembros de una variable de sistema estructurada. Consulte Seccin 9.4.1, Variables estructuradas de sistema. Una cach de claves debe existir antes de asignarle ndices:
mysql> CACHE INDEX t1 IN non_existent_cache; ERROR 1284 (HY000): Unknown key cache 'non_existent_cache'
Por defecto, los ndices de tabla se asignan a la cach de claves principal (por defecto) creada en el arranque del servidor. Cuando se destruye una cach de ndices, todos los ndices asignados a la misma se asignan de nuevo a la cach por defecto. Las asignaciones de ndices afectan al servidor globalmente: Si un cliente asigna un ndice a una cach dada, esta cach se usa para todas las consultas que tengan que ver con el ndice, sin importar qu cliente realiza las consultas.
Debe usar el comando FLUSH si quiere limpiar algunas de las cachs internas que usa MySQL . Para ejecutar FLUSH, debe tener el permiso RELOAD . flush_option puede ser cualquiera de los siguientes valores: HOSTS Vaca las tablas de la cach de equipos. Debe volcar las tablas de equipos si algunos de sus equipos cambia el nmero IP o si obtiene el mensaje de error Host ... is blocked. Cuando ocurren sucesivamente ms de max_connect_errors errores para un equipo dado mientras conecta con el servidor MySQL , MySQL asume que hay algo incorrecto y bloquea el equipo de ms peticiones de conexin. Volcar las tablas de equipos le permite al equipo intentar conectar de nuevo. Consulte Seccin A.2.5, La mquina 'host_name' est bloqueada. Puede arrancar mysqld con --max_connect_errors=999999999 para evitar este mensaje de error. DES_KEY_FILE Recarga las claves DES del fichero que se especifica con la opcin --des-key-file en tiempo de arranque del servidor. LOGS Cierra y reabre todos los ficheros de log. Si ha especificado un fichero de log de actualizaciones o un fichero de log binario sin una extensin, el nmero de extensin del fichero de log se incrementa en uno respecto al fichero anterior. Si ha usado una extensin del nombre de fichero, MySQL cierra
725
y reabre el fichero de log. En Unix, esto es lo mismo que enviar una seal SIGHUP al servidor mysqld (excepto en algunas versiones Mac OS X 10.3 donde mysqld ignora SIGHUP y SIGQUIT). PRIVILEGES Recarga los permisos de las tablas de permisos en la base de datos mysql . QUERY CACHE Defragmenta cach de consulta para utilizar mejor su memoria. Este comando no borra ninguna consulta de la cach, no como RESET QUERY CACHE. STATUS Resetea la mayora de variables de estado a cero. Esto es algo que debe usar slo al debugar una consulta. Consulte Seccin 1.6.1.3, Cmo informar de bugs y problemas. {TABLE | TABLES} [tbl_name [, tbl_name] ...] Cuando no se nombran tablas, cierra todas las tablas abiertas y fuerza a todas las tablas en uso a que se cierren. Esto tambin vuelca la cach de consultas. Con uno o ms nombres de tabla, vuelca slo las tablas dadas. FLUSH TABLES tambin borra todos los resultados de consultas de la cach de consultas, como el comando RESET QUERY CACHE . TABLES WITH READ LOCK Cierra todas las tablas abiertas y bloquea todas las tablas para todas las bases de datos con una bloqueo de lectura hasta que ejecute UNLOCK TABLES. Esto es una forma muy conveniente de obtener copias de seguridad si tiene un sistema de ficheros como Veritas que puede tomas muestras en puntos de tiempo concretos. USER_RESOURCES Resetea todos los recursos por hora de usuario a cero. Esto le permite a los clientes que hayan alcanzado el lmite de su conexin de hora, de consulta o de actualizacin para reanudar las actividades inmediatamente. FLUSH USER_RESOURCES no se aplica al lmite en conexiones mximas simultneas. Consulte Seccin 13.5.1.3, Sintaxis de GRANT y REVOKE. En MySQL 5.0, los comandos FLUSH se escriben en el lob binario a no ser que la plabra NO_WRITE_TO_BINLOG (o su alias LOCAL) se use. Nota: FLUSH LOGS, FLUSH MASTER, FLUSH SLAVE, y FLUSH TABLES WITH READ LOCK no se loguean en ningn caso porque causaran problemas si se replicasen en un esclavo. Puede acceder a algunos de estos comandos con la utilidad mysqladmin usando los comandos flush-hosts, flush-logs, flush-privileges, flush-status, o flush-tables . Consulte Seccin 13.5.5.5, Sintaxis de RESET para informacin acerca cmo se usa el comando RESET para replicacin.
Cada conexin a mysqld se ejecuta en un flujo separado. Puede ver los flujos en ejecucin con el comando SHOW PROCESSLIST y matar un flujo con el comando KILL thread_id . En MySQL 5.0.0, KILL permite los modificadores opcionales CONNECTION o QUERY: KILL CONNECTION es lo mismo que KILL sin modificadores: termina la conexin asociada con el thread_id dado. KILL QUERY termina el comando que la conexin est ejecutando actualmente, pero deja a la conexin intacta.
726
Si tiene el permiso PROCESS , puede ver todos los flujos, puede matar todos los flujos y comandos. De otro modo, puede ver y matar slo sus propios flujos y comandos. Puede usar los comandos mysqladmin processlist y mysqladmin kill para examinar y matar flujos. Nota: No puede usar KILL con la biblioteca Embedded MySQL Server porque el servidor empotrado se ejecuta dentro del flujo de la aplicacin que lo aloja. No crea ningn flujo de conexin por s solo. Cuando hace un KILL, se activa un flag especfico para el flujo. En la mayora de casos, puede que el flujo tarde algo de tiempo en morir, porque el flag kill se chequea slo cada ciertos intervalos: En SELECT, ORDER BY y GROUP BY , el flag se chequea tras leer un bloque de registros. Si el flag kill est activado, el comando se aborta. Durante ALTER TABLE, el flag kill se chequea antes de que se lea cada bloque de registros de la tabla original. Si el flag kill est activado, el comando se aborta y la tabla temporal se borra. Durante operaciones UPDATE o DELETE , el flag kill se chequea tras cada lectura de bloque y tras cada registro borrado o actualizado. Si el flag kill est activado, el comando se aborta. Tenga en cuenta que si no est usando transacciones, los cambios no se deshacen. GET_LOCK() aborta y retorna NULL. Un flujo INSERT DELAYED rpidamente vuelca (inserta) todos los registros que tiene en memoria y luego termina. Si el flujo est en el handler de bloqueo (estado: Locked), el bloqueo de tabla se aborta rpidamente. Si el flujo est esperando a espacio libre en disco en una llamada de lectura, la escritura se aborta con un mensaje de error "disco lleno". Advertencia: Matar una operacin REPAIR TABLE o OPTIMIZE TABLE en una tabla MyISAM resulta en una tabla que corrupta y no usable. Cualquier lectura o escritura en una tabla as falla hasta que la optimiza o repara de nuevo (sin interrupcin).
El comando LOAD INDEX INTO CACHE en MySQL 5.0 precarga un ndice de tabla en la cach de clave para la que se ha asignado por un comando CACHE INDEX , o en la cach de claves por defecto en otro caso. LOAD INDEX INTO CACHE se usa slo para tablas MyISAM . El modificador IGNORE LEAVES hace que se carguen slo los bloques para los nodos que no sean hojas del ndice. El siguiente comando precarga nodos (bloques ndice) de ndices para las tablas t1 y 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 | +---------+--------------+----------+----------+
727
Sentencias de replicacin
Este comando precarga todos los bloques ndice de t1. Slo precarga bloques para los nodos que no sean hojas de t2. La sintaxis de LOAD INDEX INTO CACHE le permite especificar que slo ndices particulares de una tabla deben precargarse. Sin embargo, la implementacin actual precarga todos los ndices de tabla en la cach, as que no hay razn para especificar nada distinto al nombre de tabla.
El comando RESET se usa para limpiar el estado de varias operaciones de servidor. Acta como una versin ms fuerte del comando FLUSH . Consulte Seccin 13.5.5.2, Sintaxis de FLUSH. Debe tener el permiso RELOAD para ejecutar RESET, reset_option puede ser cualquiera de las siguientes: MASTER Borra todos los logs binarios listados en el fichero ndice, resetea el fichero de ndice de log binario para vaciarlo, y crea un nuevo fichero de log binario. (Conocido como FLUSH MASTER en versiones prvias de MySQL.) Consulte Seccin 13.6.1, Sentencias SQL para el control de servidores maestros. QUERY CACHE Borra todos los resultados de consulta de la cach de consulta. SLAVE Hace que el esclavo olvide su posicin de replicacin en los logs binarios del maestro. Tambin resetea el log retardado borrando cualquier fichero de log retardado y comenzando uno nuevo. Conocido como FLUSH SLAVE en versiones prvias MySQL.) Consulte Seccin 13.6.2, Sentencias SQL para el control de servidores esclavos.
Borra todos los logs binarios listados en el ndice de log prvio al log especificado o fecha. Los logs se borran de la lista guardada en el fichero de ndice de log, as que el log dado pasa a ser el primero. Ejemplo:
PURGE MASTER LOGS TO 'mysql-bin.010'; PURGE MASTER LOGS BEFORE '2003-04-02 22:46:26';
El argumento de BEFORE date puede estar en formato 'YYYY-MM-DD hh:mm:ss' . MASTER y BINARY son sinnimos en MySQL 5.0.
728
Si tiene un esclavo activo que actualmente est leyendo uno de los logs que est intentando borrar, este comando no hace nada y falla con un error. Sin embargo, si un esclavo est dormido y purga los logs que quiere leer, el esclavo no es capaz de replicar cuando se despierta. El comando puede ejecutarse mientras los esclavos se replican. No necesita pararlos. Para purgar logs, siga este procedimiento: 1. En cada servidor esclavo, use SHOW SLAVE STATUS para chequear qu log est leyendo. 2. Obtinga una lista de los logs en el servidor maestro con SHOW MASTER LOGS. 3. Determine el primer log entre todos los esclavos. Este es el log objetivo. Si todos los esclavos estn actualizados, este es el ltimo log de la lista. 4. Haga una copia de seguridad de todos los logs que vaya a borrar. (Este paso es opcional, pero siempre recomendable.) 5. Purgue todos los logs hasta el log objetivo, pero no lo incluya.
Borra todos los logs binarios listados en el fichero ndice, resetea el fichero ndice de lob binario a vaciar, y recrea un nuevo fichero de log binario.
Activa o desactiva el logueo binario para la conexin actual (SQL_LOG_BIN es una variable de sesin) si el cliente conecta usando una cuenta que tenga el permiso SUPER . En MySQL 5.0, el comando se rechaza con un error si el cliente no tiene este permiso.
Muestra los eventos en el log binario. Si no especifica 'log_name', se muestra el primer log binario. La clusula LIMIT tiene la misma sintaxis que para el comando SELECT . Consulte Seccin 13.2.7, Sintaxis de SELECT. Nota: Realizar SHOW BINLOG EVENTS sin clusula LIMIT puede iniciar un proceso muy largo y que consume muchos recursos mientras el servidor vuelca los contenidos completos del log binario (lo que incluye la mayora de las consultas ejecutadas por MySQL) a stdout. Para guardar el log binario en un fichero de texto para analizar posteriormente, use la utilidad mysqlbinlog . Consulte Seccin 8.5, La utilidad mysqlbinlog para registros binarios.
Lista los ficheros del log binario en el servidor. Este comando se usa como parte del procedimiento descrito en Seccin 13.6.1.1, Sintaxis de PURGE MASTER LOGS para determinar qu logs pueden purgarse.
mysql> SHOW BINARY LOGS; +---------------+-----------+ | Log_name | File_size | +---------------+-----------+
729
En MySQL 5.0, SHOW BINARY LOGS, es equivalente a SHOW MASTER LOGS. La columna File_size se muestra desde MySQL 5.0.7.
Proporciona informacin de estado en los ficheros del log binario del maestro de replicacin.
Muestra una lista de esclavos de replicacin registrados actualmente en el maestro. Cualquier esclavo no arrancado con la opcin --report-host=slave_name no es visible en esta lista.
Cambia los parmetros que usa el servidor esclavo para conectar y comunicar con el servidor maestro. MASTER_USER, MASTER_PASSWORD, MASTER_SSL, MASTER_SSL_CA, MASTER_SSL_CAPATH, MASTER_SSL_CERT, y MASTER_SSL_CIPHER proporciona informacin para el esclavo acerca de cmo conectar con su maestro. Las opciones SSL (MASTER_SSL, MASTER_SSL_CA, MASTER_SSL_CAPATH, MASTER_SSL_CERT, MASTER_SSL_KEY, y MASTER_SSL_CIPHER) pueden cambiarse incluso en esclavos que se compilan sin soporte SSL. Se guardan en el fichero master.info, pero se ignorarn hasta que use un servidor que tenga soporte SSL activado. Si no especifica un parmetro dado, mantiene su valor antiguo, excepto cuando se indica en la siguiente discusin. Por ejemplo, si la contrasea para conectar a su maestro MySQL ha cambiado, necesita ejecutar este comando para decir al esclavo la nueva contrasea:
mysql> STOP SLAVE; -- if replication was running mysql> CHANGE MASTER TO MASTER_PASSWORD='new3cret';
730
Aqu no hay necesidad de especificar los parmetros que no cambian (equipo, puerto, usuario, y as). MASTER_HOST y MASTER_PORT son el nombre de equipo (o direccin IP) del equipo maestro y su puerto TCP/IP. Tenga en cuenta que si MASTER_HOST es igual a localhost, entonces, como en otras partes de MySQL, el puerto puede ignorarse (si los ficheros socket Unix pueden usarse, por ejemplo). Si especifica MASTER_HOST o MASTER_PORT, el esclavo asume que el servidor maestro es distinto que antes (incluso si especifica un valor de equipo o de puerto igual que el anterior.) En este caso, los antiguos valores para el log binario del servidor maestro y su posicin no se consideran aplicables por ms tiempo, as que si no especifica MASTER_LOG_FILE y MASTER_LOG_POS en el comando MASTER_LOG_FILE='' y MASTER_LOG_POS=4 se aaden al final. MASTER_LOG_FILE y MASTER_LOG_POS son las coordinadas en que flujo esclavo de entradea/salida debe empezar a leer del maestro la siguiente vez que el flujo arranque. Si especifica alguna de ellas, no puede especificar RELAY_LOG_FILE o RELAY_LOG_POS. Si no se especifica MASTER_LOG_FILE ni MASTER_LOG_POS , el esclavo usa las ltimas coordenadas del flujo SQL del esclavo antes de realizar CHANGE MASTER. Esto asegura que no hay discontinuidad en la replicacin, incluso si el flujo SQL esclavo se compar posteriormente con el flujo esclavo de entrada/salida, cuando smplemente quiere cambiar, digamos, la contrasea a usar. CHANGE MASTER borra todos los ficheros de log retardados y arranca uno nuevo, a no ser que especifique RELAY_LOG_FILE o RELAY_LOG_POS. En tal caso, los logs retardados se guardan; en MySQL 5.0, la variable global relay_log_purge se pone a 0. CHANGE MASTER TO actualiza los contenidos de los ficheros master.info y relay-log.info . CHANGE MASTER es til para inicializar un esclavo cuando tiene una imagen del maestro y ha guardado el log y el desplazamiento correspondientes a la misma. Tras cargar la imagen en el esclavo, puede ejecutar CHANGE MASTER TO MASTER_LOG_FILE='log_name_on_master', MASTER_LOG_POS=log_offset_on_master en el esclavo. Ejemplos:
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, -> MASTER_CONNECT_RETRY=10; mysql> CHANGE MASTER TO -> RELAY_LOG_FILE='slave-relay-bin.006', -> RELAY_LOG_POS=4025;
El primer ejemplo cambia el maestro y las coordenadas del log binario del maestro. Esto se usa cuando quiere preparar el esclavo para replicar el maestro. El segundo ejemplo muestra una operacin que se emplea menos frecuentemente. Si se usa cuando el esclavo tiene logs retardados que quiere ejecutar de nuevo por alguna razn. Para ello, el maestro no necesita ser accesible. Slo necesita usar CHANGE MASTER TO y arrancar el flujo SQL (START SLAVE SQL_THREAD). Incluso puede usar la segunda operacin en una configuracin de no replicacin con un servidor aislado, no esclavo, para recuperacin de fallos posteriores. Suponga que su servidor ha fallado y ha restaurado una copia de seguridad. Quiere volver a ejecutar los logs binarios del servidor (no los logs retardados, sino los logs binarios regulares), llamados (por ejemplo) myhost-bin.*. En primer lugar, haga una copia de seguridad de los logs binarios en un sitio seguro, en caso que no siga exactamente el procedimiento posterior y accidentalmente haga que el servidor purgue los logs binarios. En MySQL
731
5.0, use SET GLOBAL relay_log_purge=0 para seguridad adicional. Cuando arranca el servidor sin la opcin --log-bin , En su lugar, use las opciones --replicate-same-server-id, -relay-log=myhost-bin (para que el servidor crea que los logs binarios regulares son los logs retardados), --skip-slave-start . Cuando el servidor arranca, ejecute estos comandos:
mysql> CHANGE MASTER TO -> RELAY_LOG_FILE='myhost-bin.153', -> RELAY_LOG_POS=410, -> MASTER_HOST='some_dummy_string'; mysql> START SLAVE SQL_THREAD;
El servidor lee y ejecuta sus propios logs binarios, permitiendo recuperacin de fallos. Una vez que finaliza la recuperacin, ejecute STOP SLAVE, pare el servidor, borre master.info y relaylog.info, y reinicie el servidor con sus opciones originales. Actualmente, especificar MASTER_HOST (incluso con un valor de prueba) se necesita para hacer que el servidor piense que es un esclavo. En el futuro, planeamos aadir opciones para evitar estas restricciones menores.
Este comando toma una muesta del maestro y la copia en el esclavo. Actualiza los valores de MASTER_LOG_FILE y MASTER_LOG_POS para que el esclavo comience la replicacin desde la posicin correcta. Cualquier regla de exclusin de tabla y base de datos especificada con las opciones --replicate-*-do-* y --replicate-*-ignore-* se tienen en cuenta. --replicaterewrite-db no se tienen en cuenta. Esto es porque un usuario puede, con esta opcin, configurar un mapeo no nico tal como --replicate-rewrite-db=db1->db3 y --replicate-rewritedb=db2->db3, que puede confundir al esclavo al cargar tablas del maestro. El uso de este comando est sujeto a las siguientes condiciones: Esto slo funciona con tablas MyISAM . Intentos de cargar de una tabla no MyISAM provoca el siguiente error:
ERROR 1189 (08S01): Net error reading from master
Adquiere un bloqueo de lectura global del maestro al tomar la muesta, que evita actualizaciones en el maestro durante la operacin de carga. En el futuro, planeamos hacer este comando compatible con tablas InnoDB y eliminar la necesidad de bloqueo de lectura global usando una copia de seguridad no bloqueante en lnea. Si est cargando tablas grandes, puede tener que incrementar los valores de net_read_timeout y net_write_timeout en los servidores esclavos y maestros. Consulte Seccin 5.3.3, Variables de sistema del servidor. Tenga en cuenta que LOAD DATA FROM MASTER no copia ninguna tabla de la base de datos mysql. Esto hace fcil tener distintos usuarios y permisos en el maestro y el esclavo. El comando LOAD DATA FROM MASTER necesita la cuenta de replicacin que se usa para conectar con el maesto para tener los permisos RELOAD y SUPER en el maestro y el permiso SELECT para todas las tablas maestras que quiera cargar. Todas las tablas del maestro para las que el usuario no tiene el permiso SELECT se ignoran por LOAD DATA FROM MASTER. Esto es porque el maestro las oculta del usuario: LOAD DATA FROM MASTER llama SHOW DATABASES para conocer las bases de datos a cargar por parte del maestro, pero SHOW DATABASES retorna slo bases de datos para las que el usuario tenga algunos permisos. Consulte Seccin 13.5.4.6, Sintaxis de SHOW DATABASES. En la parte del esclavo, el usuario que ejecuta LOAD DATA FROM MASTER debe tener permisos para crear y borrar bases de datos y tablas que se copien.
Transfiere una copia de la tabla desde el maestro al esclavo. Este comando se implementa principalmente para depurar LOAD DATA FROM MASTER. Requiere que la cuenta usada para conectar con el servidor maestro tenga los permisos RELOAD y SUPER en el maestro y el permiso SELECT en la tabla maestra a cargar. En la parte del esclavo, el usuario que ejecuta LOAD TABLE FROM MASTER debe tener permisos para borrar y crear la tabla. Las condiciones para LOAD DATA FROM MASTER se aplican aqu. Por ejemplo, LOAD TABLE FROM MASTER funciona slo en tablas MyISAM. Tambin se aplican las notas sobre timeouts para LOAD DATA FROM MASTER .
Esto es una funcin, no un comando. Se usa para asegurar que el esclavo ha ledo y ejecutado eventos hasta la posicin dada en el log binario del maestro. Consulte Seccin 12.9.4, Funciones varias para una descripcin completa.
Hace que el esclavo olvide su posicin de replicacin en el log binario del maestro. Este comando se debe usar para un inicio limpio: borra los ficheros master.info y relay-log.info , todos los logs retardados, y arranca un nuevo log retardado. Nota: Todos los logs retardados se borran, incluso si no se han ejecutado completamente por parte del flujo SQL esclavo . (Esta es una condicin que es probable que exista en un esclavo de replicacin si ha ejecutado un comando STOP SLAVE o si el esclavo est muy cargado.) La informacin de conexin almacenada en el fichero master.info se resetea inmediatamente usando cualquier valor especificado en las opciones de arranque correspondientes. Esta informacin incluye valores tales como el equipo maestro, puerto, usuario y contrasea del maestro. Si el flujo SQL esclavo est en medio de una operacin de replicar tablas temporales cuando se par, y se ejecuta RESET SLAVE , estas tablas temporales replicadas se borran en el esclavo.
Ignora los siguientes n eventos del maestro. Esto es til para recuperarse de paradas de replicacin provocadas por un comando. Este comando es vlido slo cuando el flujo esclavo no est en ejecucin. De otro modo, produce un error.
Proporciona informacin de estado de parmetros esenciales de los flujos esclavos. Si ejecuta este comando usando el cliente mysql puede usar un terminador de comando \G en lugar de punto y coma para obtener una salida vertical ms legible:
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
733
Master_Log_File: Read_Master_Log_Pos: Relay_Log_File: Relay_Log_Pos: Relay_Master_Log_File: Slave_IO_Running: 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:
0 0 79 552 None 0 No
SHOW SLAVE STATUS retorna los siguientes campos: Slave_IO_State Una copia del campo State se la salida de SHOW PROCESSLIST para el flujo esclavo de entrada/ salida. Le dice si el flujo est tratando de conectar con el maestro, esperando eventos del maestro, reconectando con el maestro, etc. Los estados posibles se listan en Seccin 6.3, Detalles de la implementacin de la replicacin. Consultar este campo es necesario porque, por ejemplo, el flujo puede estar en ejecucin pero intentando conectar con el maestro sin xito; slo este campo le muestra el problema de conexin. El estado del flujo SQL no se copia porque es ms simple. Si est en ejecucin, no hay problema; si no es as, puede encontrar el error en el campo Last_Error (descrito posteriormente). Master_Host Equipo maestro actual Master_User Usuario actual usado para conectar con el maestro. Master_Port Puerto maestro actual. Connect_Retry Valor actual de la opcin --master-connect-retry . Master_Log_File Nombre del fichero de log binario desde el que est leyendo actualmente el flujo de entrada/salida. Read_Master_Log_Pos La posicin hasta la que el flujo de entrada/salida ha ledo en el log binario del maestro. Relay_Log_File Nombre del fichero de log retardado desde el que el flujo SQL est leyendo y ejecutando actualmente.
734
Relay_Log_Pos La posicin hasta la que el flujo SQL ha ledo y ejecutado en el flujo en el log retardado actual. Relay_Master_Log_File Nombre del log binario maestro que contiene la mayora de los eventos recientes ejecutados por el flujo SQL. Slave_IO_Running Si el flujo de entrada/salida est activo. Slave_SQL_Running Si el flujo SQL est activo. Replicate_Do_DB, Replicate_Ignore_DB La lista de bases de datos especificadas con las opciones --replicate-do-db y --replicateignore-db , si se di alguna. Replicate_Do_Table, Replicate_Ignore_Table, Replicate_Wild_Do_Table, Replicate_Wild_Ignore_Table Lista de tablas especificadas con las opciones --replicate-do-table, --replicateignore-table, --replicate-wild-do-table, y --replicate-wild-ignore_table , si se di alguna. Last_Errno, Last_Error Nmero y mensaje de error retornados por la ltima consulta ejecutada. Un nmero de error 0 y mensaje vaco significa no error. Si el valor Last_Error no est vaco, tambin aparece como mensaje en el log de errores del esclavo. Por ejemplo:
Last_Errno: 1051 Last_Error: error 'Unknown table 'z'' on query 'drop table z'
El mensaje indica que la tabla z existi en el maestro y se borr all, pero no existi en el esclavo, as que DROP TABLE fall en el esclavo. (Esto puede ocurrir, por ejemplo, si olvid copiar la tabla en el esclavo al configurar la replicacin.) Skip_Counter El ltimo valor usado para SQL_SLAVE_SKIP_COUNTER. Exec_Master_Log_Pos La posicin del ltimo evento ejecutado por el flujo SQL del log binario del maestro (Relay_Master_Log_File). (Relay_Master_Log_File, Exec_Master_Log_Pos) en el log binario del maestro correspondiente a (Relay_Log_File, Relay_Log_Pos) en el log retardado. Relay_Log_Space Tamao total combinado de todos los logs retardados existentes. Until_Condition, Until_Log_File, Until_Log_Pos Valores especificados en la clusula UNTIL del comando START SLAVE . Until_Condition tiene estos valores:
735
None si no se especific UNTIL Master si el esclavo est leyendo hasta una posicin dada en el log binario del maestro Relay si el esclavo est leyendo hasta una posicin dada en su log retardado Until_Log_File y Until_Log_Pos indica los valors del nombre de fichero y posicin que definen el punto en que el flujo SQL para su ejecucin. Master_SSL_Allowed, Master_SSL_CA_File, Master_SSL_CA_Path, Master_SSL_Cert, Master_SSL_Cipher, Master_SSL_Key Estos campos muestran los parmetros SSL usados por el esclavo para conectar con el maestro, si hay algo. Master_SSL_Allowed tiene estos valores: Yes si se permite conexin SSL con el maestro No si no se permite una conexin SSL con el maestro Ignored se se permite una conexin SSL pero el servidor esclavo no tiene soporte SSL activdo Los valores de los otros campos relacionados con SSL se corresponden con los valores de las opciones --master-ca, --master-capath, --master-cert, --master-cipher, y -master-key . Seconds_Behind_Master Este campo indica el retardo del esclavo. Cuando el flujo SQL esclavo est en ejecucin (procesando actualizaciones), este campo es el nmero de segundos que han pasado desde el momento del evento ms reciente del maestro ejecutado por este flujo. Cuando ese flujo lo atrapa el flujo de entrada/salida esclavo y pasa a espera de ms eventos del flujo de entrada/salida este campo es cero. En resumen, este campo mide en segundos la diferencia temporal entre el flujo SQL esclavo y el flujo de entrada/salida esclavo. Si la conexin de red entre maestro y esclavo es rpida, el flujo de entrada/salida esclavo es muy cercano al maestro, as que este campo es una buena aproximacin de cuanto tarda el flujo SQL esclavo en compararse con el maestro. Si la red es lenta, esta no es una buena aproximacin, el flujo SQL esclavo puede verse atrapado a menudo por un flujo de entrada/salida esclavo lento , as que Seconds_Behind_Master a menudo muestra un valor de 0, incluso si el flujo de entrada/ salida se compara posteriormente con el maestro. En otras palabras, esta columna es til slo para redes rpidas. Esta computacin de diferencia temporal funciona incluso si el esclavo y maestro no tienen relojes idnticos ( la diferencia de tiempo se computa cuando el flujo de entrada/ salida del esclavo arranca, y se asume como que permance constante desde ese momento). Seconds_Behind_Master es NULL (que significa desconocido) si el flujo SQL esclavo no est en ejecucin, o si el flujo de entrada/salida esclavo no est en ejecucin o no conectado con el maestro. Por ejemplo si el flujo de entrada/salida esclavo est durmiendo durante master-connect-retry segundos antes de reconectar, NULL se muestra, ya que el esclavo no puede saber lo que hace el maestro, y as no puede asegurar el retardo. Este campo tiene una limitacin. El timestamp se preserva a travs de la replicacin, lo que significa que, si un maestr M1 es un esclavo de M0, cualquier evento desde el log binario de M1 que se origine al replicar un evento del log binario M0 tiene el timestamp del evento. Esto permite a MySQL replicar TIMESTAMP con xito. Sin embargo, la desventaja para Seconds_Behind_Master es que si M1 tambin recibe actualizaciones directas de los clientes, el valor se desva aleatoriamente, ya que a veces el ltimo evento de M1 es de M0 y otras de actualizacin directa, y por lo tanto es el timestampo ms reciente.
736
START SLAVE sin opciones arranca los flujos esclavos. El flujo de entrada/salida lee consultas del servidor maestro y las almacena en el log retardado. El flujo SQL lee el log retardado y ejecuta las consultas. START SLAVE require el permiso SUPER. Si START SLAVE tiene xito al arrancar los flujos esclavos, retorna sin ningn error. Sin emgargo, incluso en tal caso, puede ser que el flujo esclavo arranqu y luego pare (por ejemplo, porque no puede conectar con el maestro o leer sus logs binarios, o algn otro problema). START SLAVE no le advierte acerca de esto. Debe chequear el log de errores esclavo para mensajes de error generados por los flujos esclavos, o chequear que estn ejecutndos correctamente con SHOW SLAVE STATUS. En MySQL 5.0, puede aadir las opciones IO_THREAD y SQL_THREAD al comando para decir qu flujo arrancar. Una clusula UNTIL puede aadirse para especificar que el esclavo debe arrancar y ejecutar hasta que el flujo SQL llegue a un punto dado en los logs binarios del maestro o en los logs retardados del esclavo. Cuando el flujo SQL llega a ese punto, para. Si la opcin SQL_THREAD se especifica en el comando, arranca slo el flujo SQL. De otro modo, arranca ambos flujos esclavos. Si el flujo SQL est en ejecucin, la clusula UNTIL se ignora y se muestra una advertencia. Para una clusula UNTIL , debe especificar nombre de fichero de log y posicin. No mezcle opciones de maestro y log retardado. Cualquier condicin UNTIL se resetea mediante un comando STOP SLAVE , un comando START SLAVE que no incluya clusula UNTIL , o reinicio de servidor. La clusula UNTIL puede ser til para depurar replicacin, o para que la replicacin proceda justo antes del punto en que quiera evitar tener un esclavo replicando un comando. Por ejemplo, si se ejecuta un comando DROP TABLE no deseado, puede usar UNTIL para decir al esclavo que ejecute hasta ese punto pero no ms. Para encontrar el evento, use mysqlbinlog con los logs maestros o los logs retardados del esclavo, o usando un comando SHOW BINLOG EVENTS . Si est usando UNTIL para tener las consultas replicadas por el proceso esclavo en secciones, se recomienda que arranque el esclavo con la opcin --skip-slave-start para evitar que el flujo SQL se ejecute cuando arranque el servidor. Es probablemente mejor usar esta opcin con un fichero de opciones en lugar que en la lnea de comandos, as que un reinicio inesperado del servidor no hace que se olvide. El comando SHOW SLAVE STATUS incluye campos de salida que muestran los valores actuales de la condicin UNTIL . En versiones prvias de MySQL, este comando se llam SLAVE START cuyo uso todava se acepta en MySQL 5.0 por compatibilidad con versiones anteriores, pero ahora est obsoleto.
Para el flujo esclavo. STOP SLAVE necesita el permiso SUPER . Como START SLAVE, este comando puede usarse con las opciones IO_THREAD y SQL_THREAD para nombrar el flujo o flujos a parar.
737
En versiones prvias de MySQL, este comando se llam SLAVE STOP. Su uso se acepta en MySQL 5.0 por compatibilidad con versiones anteriores, pero ahora est obsoleto.
El comando PREPARE prepara un comando y le asigna un nombre, stmt_name, con el que referirse al comando posteriormente. Los nombres de comando no son sensibles a maysculas. preparable_stmt es una cadena literal o una variable de usuario que contenga el texto del comando. El texto debe representar un comando SQL nico, no varios. Dentro del comando, pueden usarse caracteres '?' como marcadores de parmetros para indicar dnde estarn los valores en la consulta posterior cuando la ejecute. Los caracteres '?' no deben delimitarse con comillas, incluso si pretende ligarlos con valores de cadenas. Si un comando preparado con ese nombre existe, se elimina implcitamente antes que se prepare el nuevo comando. Esto significa que si el nuevo comando contiene un error y no puede preparase, se retorna un error y no existe un comando con el nombre dado. El alcance de los comandos preparados es la sesin de cliente dentro de la que se crea. Otros clintes no pueden verlos.
738
Tras preparar un comando, lo ejecuta con un comando EXECUTE que se refiere al nombre de comando preparado. Si el comando preparado contiene cualquier marcador de parmetro, debe aadir una clusula USING que liste las variables de usuario conteniendo los valores a ligar con los parmetros. Los valores de parmetros pueden proporcionarse slo por variables de usuario, y la clusula USING debe nombrar exactamente tantas variables como el nmero de marcadores de parmetros en el comando. Puede ejecutar un comando preparado dado varias veces, pasando distintas variables al mismo o configurando las variables con distintos valores para cada ejecucin. Para eliminar un comando preparado, use el comando DEALLOCATE PREPARE . Tratar de ejecutar un comando preparado tras borrarlo provoca un error. Si termina una sesin de cliente sin borrar un comando preparado prviamente, el servidor lo borra automticamente. Los siguientes comandos SQL pueden usarse en comandos preparados: CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, y la mayora de comandos SHOW . Otros comandos no se soportan todava. Los siguientes ejemplos muestran dos formas equivalentes de preparar un comando que calcula la hipotenusa de un tringulo dadas las longitudes de los dos catetos. El primer ejemplo muestra cmo crear un comando preparado usando una cadena literal para proporcionar el texto del comando:
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;
El segundo ejemplo es similar, pero proporciona el texto del comando como variable de usuario:
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 sintaxis SQL para comandos preparados no puede usarse anidada. Esto es, un comando pasado a PREPARE no puede ser el mismo un comando PREPARE, EXECUTE, o DEALLOCATE PREPARE . Adems, la sintaxis SQL para comandos preparados es distinta de la usada en llamadas a la API de comandos preparados. Por ejemplo, use la funcin mysql_stmt_prepare() de la API C para preparar un comando PREPARE, EXECUTE, o DEALLOCATE PREPARE . La sintaxis SQL para comandos preparados no puede usarse dentro de procedimientos almacenados y funciones.
739
740
MySQL soporta varios motores de almacenamiento que tratan con distintos tipos de tabla. Los motores de almacenamiento de MySQL incluyen algunos que tratan con tablas transaccionales y otros que no lo hacen: MyISAM trata tablas no transaccionales. Proporciona almacenamiento y recuperacin de datos rpida, as como posibilidad de bsquedas fulltext. MyISAM se soporta en todas las configuraciones MySQL, y es el motor de almacenamiento por defecto a no ser que tenga una configuracin distinta a la que viene por defecto con MySQL. El motor de almacenamiento MEMORY proporciona tablas en memoria. El motor de almacenamiento MERGE permite una coleccin de tablas MyISAM idnticas ser tratadas como una simple tabla. Como MyISAM, los motores de almacenamiento MEMORY y MERGE tratan tablas no transaccionales y ambos se incluyen en MySQL por defecto. Nota: El motor de almacenamiento MEMORY anteriormente se conoca como HEAP. Los motores de almacenamiento InnoDB y BDB proporcionan tablas transaccionales. BDB se incluye en la distribucin binaria MySQL-Max en aquellos sistemas operativos que la soportan. InnoDB tambin se incluye por defecto en todas las distribuciones binarias de MySQL 5.0 . En distribuciones fuente, puede activar o desactivar estos motores de almacenamiento configurando MySQL a su gusto. El motor de almacenamiento EXAMPLE es un motor de almacenamiento "tonto" que no hace nada. Puede crear tablas con este motor, pero no puede almacenar datos ni recuperarlos. El objetivo es que sirva como ejemplo en el cdigo MySQL para ilustrar cmo escribir un motor de almacenamiento. Como tal, su inters primario es para desarrolladores.
741
NDB Cluster es el motor de almacenamiento usado por MySQL Cluster para implementar tablas que se particionan en varias mquinas. Est disponible en distribuciones binarias MySQL-Max 5.0. Este motor de almacenamiento est disponible para Linux, Solaris, y Mac OS X . Aadiremos soporte para este motor de almacenamiento en otras plataformas, incluyendo Windows en prximas versiones. El motor de almacenamiento ARCHIVE se usa para guardar grandes cantidades de datos sin ndices con una huella muy pequea. El motor de almacenamiento CSV guarda datos en ficheros de texto usando formato de valores separados por comas. El motor de almacenamiento FEDERATED se aadi en MySQL 5.0.3. Este motor guarda datos en una base de datos remota. En esta versin slo funciona con MySQL a travs de la API MySQL C Client. En futuras versiones, ser capaz de conectar con otras fuentes de datos usando otros drivers o mtodos de conexin clientes. Este captulo describe cada uno de los motores de almacenamiento MySQL excepto InnoDB y NDB Cluster, que se tratan en Captulo 15, El motor de almacenamiento InnoDB y Captulo 16, MySQL Cluster. Cuando crea una nueva tabla, puede decirle a MySQL qu tipo de tabla crear aadiendo la opcin de tabla ENGINE o TYPE al comando CREATE TABLE :
CREATE TABLE t (i INT) ENGINE = INNODB; CREATE TABLE t (i INT) TYPE = MEMORY;
Aunque se soporta TYPE en MySQL 5.0, ENGINE es el trmino preferido. Si omite la opcin ENGINE o TYPE, se usa el motor de almacenamiento por defecto, que es MyISAM. Puede cambiarlo usando las opciones de arranque --default-storage-engine o --defaulttable-type , o cambiando la variable de sistema storage_engine o table_type . Cuando se instala MySQL en Windows usando el MySQL Configuration Wizard, InnoDB es el motor de almacenamiento por defecto en lugar de MyISAM. Consulte Seccin 2.3.5.1, Introduccin. Para convertir una tabla de un tipo a otro, use un comando ALTER TABLE que indique el nuevo tipo:
ALTER TABLE t ENGINE = MYISAM; ALTER TABLE t TYPE = BDB;
Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE y Seccin 13.1.2, Sintaxis de ALTER TABLE. Si trata de usar un motor de almacenamiento que no est compilado o que est desactivado, MySQL crea una tabla de tipo MyISAM. Este comportamiento es conveniente cuando quiere copiar tablas entre servidores MySQL que soportan distintos motores. (Por ejemplo, en una inicializacin de replicacin, tal vez su maestro suporte un motor de almacenamiento transaccional para ms seguridad, pero los esclavos usan un motor de almacenamiento no transaccional para mayor velocidad.) La sustitucin automtica del tipo MyISAM cuando se especifica un tipo no especificado puede ser confuso para nuevos usuarios. En MySQL 5.0, se genera una advertencia cuando se cambia un tipo de tabla automticamente. MySQL siempre crea un fichero .frm para guardar la definicin de tabla y columnas. El ndice y datos de la tabla puede estar almacenado en uno o ms ficheros, en funcin del tipo de tabla. El servidor crea el fichero .frm por encima del nivel de almacenamiento del motor. Los motores de almacenamiento individuales crean los ficheros adicionales necesarios para las tablas que administran. Una base de datos puede contener tablas de distintos tipos. Las tablas transaccionales (TSTs) tienen varias ventajas sobre las no transaccionales (NTSTs):
742
Ms seguras. Incluso si MySQL cae o tiene problemas de hardware, puede recuperar los datos, mediante recuperacin automtica o desde una copia de seguridad ms el log de transacciones. Puede combinar varios comandos y aceptarlos todos al mismo tiempo con el comando COMMIT (si autocommit est desactivado). Puede ejecutar ROLLBACK para ignorar los cambios (si autocommit est desactivado). Si falla una actualizacin, todos los cambios se deshacen. (Con tablas no transaccionales, todos los cambios son permanentes.) Motores de almacenamiento transaccionales pueden proporcionar mejor concurrencia para tablas que tienen varias actualizaciones concurrentes con lecturas. En MySQL 5.0, InnoDB usa valores de configuracin por defecto si no los especifica. Consulte Seccin 15.3, Configuracin de InnoDB. Tablas no transaccionales tienen varias ventajas al no tener una sobrecarga transaccional: Ms rpidas Menor requerimiento de espacio. Menos memoria para actualizaciones Puede combinar tablas transaccionales y no transaccionales en el mismo comando para obtener lo mejor de ambos mundos. Sin embargo, en una transaccion con autocommit desactivado, los cambios de tablas no transaccionales son permanentes inmediatamente y no pueden deshacerse.
(Nota: Antiguas versiones de MySQL usaban TYPE en lugar de ENGINE (por ejemplo: TYPE = MYISAM). MySQL 5.0 soporta esta sintaxis para compatibilidad con versiones anteriores pero TYPE est obsoleto y ahora se usa ENGINE .) Normalmente, la opcin ENGINE no es necesaria; MyISAM es el motor de almacenamiento por defecto a no ser que se cambie. Puede chequear o reparar tablas MyISAM con la utilidad myisamchk . Consulte Seccin 5.8.3.7, Usar myisamchk para recuperacin de desastres. Puede comprimir tablas MyISAM con myisampack para que ocupen mucho menos espacio. Consulte Seccin 8.2, myisampack, el generador de tablas comprimidas de slo lectura de MySQL. Las siguientes son algunas caractersticas del motor de almacenamiento MyISAM : Todos los datos se almacenan con el byte menor primero. Esto hace que sean independientes de la mquina y el sistema operativo. El nico requerimiento para portabilidad binaria es que la mquina use enteros con signo en complemento a dos (como todas las mquinas en los ltimos 20 aos) y formato en coma flotante IEEE (tambin dominante en todas las mquinas). La nica rea de
743
mquinas que pueden no soportar compatibilidad binaria son sistemas empotrados, que a veces tienen procesadores peculiares. No hay penalizacin de velocidad al almacenar el byte menor primero; los bytes en un registro de tabla normalmente no estn alineados y no es un problema leer un byte no alineado en orden normal o inverso. Adems, el cdigo en el servidor que escoge los valroes de las columnas no es crtico respecto a otro cdigo en cuanto a velocidad. Ficheros grandes (hasta longitud de 63 bits) se soportan en sistemas de ficheros y sistemas operativos que soportan ficheros grandes. Registros de tamao dinmico se fragmentan mucho menos cuando se mezclan borrados con actualizaciones e inserciones. Esto se hace combinando automticamente bloques borrados adyacentes y extendiendo bloques si el siguiente bloque se borra. El mximo nmero de ndices por tabla MyISAM en MySQL 5.0 es 64. Esto puede cambiarse recompliando. El mximo nmero de columnas por ndice es 16. La longitud mxima de clave es 1000 bytes. Esto puede cambiarse recompilando. En caso de clave mayor a 250 bytes, se usa un tamao de bloque mayor, de 1024 bytes. Las columnas BLOB y TEXT pueden indexarse. Valores NULL se permiten en columnas indexadas. Esto ocupa 0-1 bytes por clave. Todos los valores de clave numrico se almacenan con el byte mayor primero para mejor compresin de ndice. Cuando se insertan registros en orden (como al usar columnas AUTO_INCREMENT ), el rbol ndice se divide de forma que el nodo mayor slo contenga una clave. Esto mejora la utilizacin de espacio en el rbol ndice. El tratamiento interno de una columna AUTO_INCREMENT por tabla. MyISAM actualiza automticamente esta colunmna para operaciones INSERT y UPDATE . Esto hace las columnas AUTO_INCREMENT ms rpidas (al menos 10%). Los valores iniciales de la secuencia no se resan tras ser borrados. (Cuando una columna AUTO_INCREMENT se define como la ltima columna de un ndice de varias columnas, se resan los valores borrados iniciales de la secuencia.) El valor AUTO_INCREMENT puede cambiarse con ALTER TABLE o myisamchk. Si una tabla no tiene bloques libres en medio del fichero de datos, puede INSERT nuevos registros a la vez que otros flujos leen de la tabla. (Esto se conoce como inserciones concurrentes.) Un bloque libre puede ser resultado de borrar o actualziar registros de longitud dinmica con ms datos que su contenido. Cuando todos los bloques libres se usan (se rellenan), las inserciones futuras vuelven a ser concurrentes. Puede tener el fichero de datos e ndice en directorios distintos para obtener ms velocidad con las opciones DATA DIRECTORY y INDEX DIRECTORY para CREATE TABLE. Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE. Cada columna de carcteres puede tener distintos conjuntos de carcteres. Consulte Captulo 10, Soporte de conjuntos de caracteres. Hay un flag en el fichero ndice MyISAM que indica si la tabla se ha cerrado correctamente. Si mysqld se arranca con la opcin --myisam-recover , Las tablas MyISAM se chequean automticamente al abrirse, y se reparan si la tabla no se cierra correctamente. myisamchk marca las tablas como chequeadas si se ejecuta con la opcin --update-state . myisamchk --fast cheque slo las tablas que no tienen esta marca. myisamchk --analyze almacena estadsticas para partes de las claves, as como para las claves enteras.
744
myisampack puede comprimir columnas BLOB y VARCHAR . MyISAM soporta las siguientes caractersticas: Soporte de un tipo VARCHAR autntico; una columna VARCHAR comienza con la longitud almacenada en dos bytes. Tablas con VARCHAR pueden tener longitud de registro fija o dinmica. VARCHAR y CHAR pueden ser de hasta 64KB. Un ndice hash puede usarse para UNIQUE. Esto le permite tener UNIQUE o cualquier combinacin de columnas en una tabla . (Sin embargo, no puede buscar en un ndice UNIQUE .)
745
Si el servidor encuentra un error, trata de hacer una reparacin de tabla rpida (ordenando y sin recrear el fichero de datos). Si falla la reparacin debido a un error en el fichero de datos (por ejemplo, error de clave duplicada), el servidor lo intenta otra vez, esta vez recreando el fichero de datos. Si sigue fallando, el servidor trata una vez ms con el mtodo de reparacin antiguo (escrito registro a registro sin ordenar). Este mtodo debe ser capaz de reparar cualquier clase de error y tiene requerimientos de espacio bajos. Si la recuperacin no fuera capaz de recuperar todos los registros de un comando prviamente completado y no ha especificado FORCE en la opcin --myisam-recover , la recuperacin automtica aborta con un mensaje de error en el log de errores:
Error: Couldn't repair table: test.g00pages
Tenga en cuenta qui el valor de recuperacin automtico incluye BACKUP, el proceso de recuperacin crea ficheros con nombres de la forma tbl_name-datetime.BAK. Debe tener un script cron que mueva estos ficheros automticamente del directorio de base de datos al dispositivo de copia de seguridad.
746
De los tres formatos de almacenamiento MyISAM, el formato esttico es el ms simple y seguro (menos sujeto a corrupcin). Tambin es el ms rpido de los formatos sobre disco. La velocidad proviene de la facilidad con que se encuentran los registros en el fichero de datos en disco: Cuando se busca un registro basndose en un nmero de registro en el ndice, multiplica el nmero de registro por la longitud de registro. Tambin , al escanear una tabla, es muy fcil leer un nmero constante de registro con cada operacin de lectura de disco. La seguridad se evidencia si su mquina falla mientras el servidor MySQL est escribiendo en un fichero MyISAM de formato fijo. En este caso, myisamchk puede determinar fcilmente dnde comienza cada registro y dnde acaba, as que usualmente puede recuperar todos los registros excepto los parcialmente escritos. Tenga en cuenta que los ndices de tabla MyISAM siempre pueden reconstruirse basados en los registros de datos. Caractersticas generales de tablas de formato esttico: Las columnas CHAR aaden espacios hasta la anchura de columna. Esto tambin es cierto para columnas NUMERIC, y DECIMAL creadas antes de MySQL 5.0.3. Muy rpido. Fcil de cachear. Fcil de reconstruir tras un fallo, ya que los registros se localizan en posiciones fijas. La reorganizacin no es necesaria a no ser que borre un gran nmero de registros y quiera devolver espacio libre al sistema operativo. Para ello, use OPTIMIZE TABLE o myisamchk -r. Usualmente requiere ms espacio de disco que para tablas de formato dinmico.
747
un registro con informacin que alarga la longitud del registro, el registro se fragmenta. En este caso, puede que tenga que ejecutar OPTIMIZE TABLE o myisamchk -r de vez en cuando para mejorar el rendimiento. Use myisamchk -ei para obtener estadsticas de tabla. Ms difcil de reconstruir tras un fallo que las tablas de formato esttico, ya que los registros pueden fragmentarse en varios trozos y puede faltar algn enlace (fragmento). La longitud de registro esperada para registros de longitud dinmica se calcula usando la siguiente expresin:
3 + + + + + (nmero de columnas + 7) / 8 (nmero de columnas de carcteres) (tamao comprimido de columnas de cadenas) (longitud de cadenas) (nmero de columnas NULL + 7) / 8
Hay una penalizacin de 6 bytes para cada enlace. Un registro dinmico se enlaza si una actualizacin provoca aumentar el tamao de un registro. Cada nuevo enlace es al menos de 20 bytes, as que la siguiente ampliacin probablemente ir en el mismo enlace. Si no es as, se crea otro enlace. Puede encontrar el nmero de enlaces usando myisamchk -ed. Pueden eliminarse todos los enlaces con myisamchk -r.
748
Las consultas no obtienen registros en la tabla o retornan datos incompletos. Puede chequear la salud de una tabla MyISAM usando el comando CHECK TABLE , y reparar una tabla MyISAM corrupta con REPAIR TABLE. Cuando mysqld no est en ejecucin, puede chequear o reparar una tabla con el comando myisamchk . Consulte Seccin 13.5.2.3, Sintaxis de CHECK TABLE, Seccin 13.5.2.6, Sintaxis de REPAIR TABLE, and Seccin 5.8.3.1, Sintaxis para invocar myisamchk. Si sus tablas se corrompen frecuentemente, debe tratar de determinar porqu ocurre. Lo ms importante es saber si la tabla se corrompe como resultado de un fallo de servidor. Puede verificarlo fcilmente buscando un mensaje restarted mysqld reciente en el log de errores. Si encuentra dicho mensaje, es probable que la corrupcin de tabla sea resultado de la cada del servidor. De otro modo, la corrupcin pudo haber ocurrido durante operaciones normales. Esto es un bug. Debe tratar de crear un caso de test reproducible que demuestre el problema. Consulte Seccin A.4.2, Qu hacer si MySQL sigue fallando (crashing) y Seccin D.1.6, Crear un caso de prueba tras haber encontrado una tabla corrupta.
Esta advertencia no significa necesariamente que la tabla est corrupta, pero al menos debe chequear la tabla. El contador funciona como se muesta: La primera vez que se actualiza la hora de una tabla en MySQL, se incrementa un contador en la cabecera del fichero ndice. El contador no cambia durante otras actualizaciones. Cuando se cierra la ltima instancia de una tabla (debido a una operacin FLUSH TABLES o porque no hay espacio en la cach de la tabla), el contador se decrementa si la tabla se ha actualizado en cualquier punto. Cuando repara la tabla o chequea la tabla y est correcta, el contador se resetea a cero.
749
Para evitar problemas con interacciones con otros procesos que pueden chequear la tabla, el contador no se decrementea al cerrar si era cero. En otras palabras, el contador puede desincronizarse slo bajo las siguientes condiciones: Las tablas MyISAM se copian sin ejecutar en primer lugar LOCK TABLES y FLUSH TABLES. MySQL falla entre una actualizacin y el cierre final. (Tenga en cuenta que la tabla puede estar ok, ya que MySQL siempre realiza escrituras entre cada comando.) Una tabla se modifica con myisamchk --recover o myisamchk --update-state a la vez que se usa con mysqld. Usando mltiples servidores mysqld usando la tabla y un servidor realiza un REPAIR TABLE o CHECK TABLE en la tabla mientras estaba en uso por otro servidor. En este caso, se puede usar CHECK TABLE, aunque puede obtener una advertencia de otros servidores. Sin embargo, REPAIR TABLE debe evitarse ya que cuando un servidor reemplaza el fichero de datos con uno nuevo, no se enva a los otros servidores. En general, no es buena idea compartir un directorio de datos entre varios servidores. Consulte Seccin 5.11, Ejecutar ms de un servidor MySQL en la misma mquina para ms informaicn.
750
-> ->
Tenga en cuenta que la columna a est indexada en la tabla MERGE , pero no est declarada como PRIMARY KEY como lo est en las tablas MyISAM subyacente. Esto es necesario ya que una tabla MERGE no puede forzar unicidad en un conjunto de tablas subyacentes. Tras crear la tabla MERGE, puede realizar consultas que operen en el grupo de tablas como unidad:
mysql> SELECT * FROM total; +---+---------+ | a | message | +---+---------+ | 1 | Testing | | 2 | table | | 3 | t1 | | 1 | Testing | | 2 | table | | 3 | t2 | +---+---------+
Tenga en cuenta que puede manipular el fichero .MRG directamente desde fuera del servidor MySQL :
shell> cd /mysql-data-directory/current-database shell> ls -1 t1 t2 > total.MRG shell> mysqladmin flush-tables
Para rempaear una tabla MERGE a una coleccin diferente de tablas MyISAM, puede realizar una de las siguientes opciones: DROP la tabla MERGE y recrearla. Use ALTER TABLE tbl_name UNION=(...) para cambiar la lista de tablas subyacentes. Cambie el fichero .MRG y realice un comando FLUSH TABLE para la tabla MERGE y todas las tablas subyacentes para forzar al motor de almacenamiento a leer el nuevo fichero de definicin. Las tablas MERGE pueden ayudarle a arreglar los siguientes problemas: Administrar fcilmente un largo conjunto de tablas. Por ejemplo, puede poner datos de meses distintos en tablas separadas, comprimir algunos de ellos con myisampack, y luego crear una tabla MERGE para usarlas como una. Obtener ms velocidad. Puede dividir una tabla grande de slo lectura basndose en algn criterio, y luego poner las tablas individuales en distintos discos. Una tabla MERGE puede ser mucho ms rpida que usar una tabla grande. Realizar bsquedas ms eficientes. Si conoce exactamente lo que busca, puede buscar en slo una de las tablas divididas y usar una tabla MERGE para las otras. Puede tener distintas tablas MERGE que usen conjuntos no disjuntos de tablas. Realizar reparaciones ms eficientes. Es ms fcil de reparar tablas individuales mapeadas en una tabla MERGE que reparar una nica tabla grande. Mapear instantneamente varias tablas como una. Una tabla MERGE no necesita mantener un ndice propio ya que usa los ndices de las tablas individuales. Como resultado, las colecciones de tablas MERGE son muy rpidas de crear o remapear. (Tenga en cuenta que debe especificar las definiciones de ndices cuando crea una tabla MERGE , incluso cuando no se crean ndices.) Si tiene un conjunto de tablas que une como una tabla grande bajo demanda o batch, debe crear una tabla MERGE sobre ellas bajo demanda. Esto es mucho ms rpido y ahorra mucho espacio de disco. Excede el lmite de tamao del sistema operativo. Cada tabla MyISAM est ligada a este lmite, pero una coleccin de tablas MyISAM no lo est.
751
Puede crear un alias o sinnimo para una tabla MyISAM definiendo una tabla MERGE que mapee a una tabla. No debera haber un impacto de rendimiento realmente impactante al hacer esto (slo un par de llamadas indirectas y llamadas memcpy() para cada lectura). Las desventajas de las tablas MERGE son: Slo puede usar tablas MyISAM idnticas para una tabla MERGE . No puede usar un nmero de caractersticas MyISAM en tablas MERGE . Por ejemplo, no puede crear ndices FULLTEXT en tablas MERGE . (Puede crear ndices FULLTEXT en las tablas MyISAM subyacentes, puero no puede buscar en la tabla MERGE con bsquedas full-text.) Si la tabla MERGE no es temporal, todas las tablas subyacentes MyISAM deben ser permanentes. Si la tabla MERGE es temporal, las tablas MyISAM pueden ser cualquier mezcla de tablas temporales y no temporales. Las tablas MERGE usan ms descriptores de fichero. Si 10 clientes usan una tabla MERGE que mapee a 10 tablas, el servidor usa (10*10) + 10 descriptores de fichero. (10 descriptores de ficheros de datos para cada uno de los 10 clientes, y 10 descriptores de ficheros de ndice compartidos entre los clients.) Las lecturas de claves son ms lentas. Cuando lee una clave, el motor de almacenamiento MERGE necesita leer en todas las tablas subyacentes para chequear cul se parece ms a la clave dada. Si luego lee el siguiente, el motor MERGE necesita buscar en los buffers de lectura para buscar la siguiente clave. Slo cuando se usa un bffer de claves el motor necesita leer el siguiente bloque de claves. Esto hace que las claves MERGE sean mucho ms lentas en bsquedas eq_ref , pero no mucho ms lentas en bsquedas ref . Consulte Seccin 7.2.1, Sintaxis de EXPLAIN (Obtener informacin acerca de un SELECT) para ms informacin sobre eq_ref y ref.
752
TABLE pone los ndices UNIQUE antes de los ndices no nicos para facilitar deteccin rpida de claves duplicadas.) Consecuentemente, las consultas en tablas con tales ndices pueden retornar resultados no esperados. DROP TABLE en una tabla en uso por una tabla MERGE no funciona en Windows ya que el mapeo del motor de almacenamiento MERGE est escondido por la capa superior de MySQL. Desde Windows no se permite el borrado de ficheros abiertos, debe volcar todas las tablas MERGE (con FLUSH TABLES) o borrar la tabla MERGE antes de borrar la tabla.
Como indica su nombre, las tablas MEMORY se almacenan en memoria y usan ndices hash por defecto. Esto las hace muy rpidas, y muy tiles para crear tablas temporales. Sin embargo, cuando se apaga el servidor, todos los datos almacenados en las tablas MEMORY se pierde. Las tablas por s mismas continan existiendo ya que sus definiciones se almacenan en ficheros .frm en disco, pero estn vacas cuando reinicia el servidor. Este ejemplo muestra cmo puede crear, usar , y borrar una tabla MEMORY :
mysql> CREATE TABLE test ENGINE=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;
Las tablas MEMORY tienen las siguientes caractersticas: El espacio para tablas MEMORY se reserva en pequeos bloques. Las tablas usan el 100% del hashing dinmico para insrciones. No se necesita rea de desbordamiento o espacio extra para claves. No se necesita espacio extra para listas libres. Los registros borrados se ponen en una lista encadenada y se resan cuando inserta nuevos datos en la tabla. Las tablas MEMORY no tienen ninguno de los problemas asociados con borrados ms inserciones en tablas hasheadas. Las tablas MEMORY pueden tener hasta 32 ndices por tabla, 16 columnas por ndice y una clave de longitud mxima de 500 bytes. En MySQL 5.0, el motor MEMORY implementa ndices HASH y BTREE . Puede espcificar uno u otro para cada ndice aadiendo una clusula USING tal y como se muestra:
CREATE TABLE (id INT, ENGINE = CREATE TABLE (id INT, ENGINE = lookup INDEX USING HASH (id)) MEMORY; lookup INDEX USING BTREE (id)) MEMORY;
Las caractersticas generales de B-trees e ndices hash se describen en Seccin 7.4.5, Cmo utiliza MySQL los ndices. Puede tener claves no nicas en una tabla MEMORY. (Esta es una caracterstica no comn de implementaciones de ndices hash.)
753
En MySQL 5.0, puede usar INSERT DELAYED con tablas MEMORY . Consulte Seccin 13.2.4.2, Sintaxis de INSERT DELAYED. Si tiene un ndice hash en una tabla MEMORY que tenga un alto ndice de duplicacin de claves (muchas entradas de ndice con el mismo valor), las actualizaciones a la tabla que afecten valores claves y todos los borrados son significativamente ms lentos. El rango de esta ralentizacin es proporcional al rango de duplicacin (o inversamente proporcional al grado cardinalidad). Pude usar un ndice BTREE para evitar este problema. Las tablas MEMORY usan una longitud de registro fija. MEMORY no soporta columnas BLOB o TEXT . MEMORY en MySQL 5.0 incluye soporte para columnas AUTO_INCREMENT e ndices en columnas que contengan valores NULL . Las tablas MEMORY se comparten entre todos los clientes (como cualquier otra tabla no-TEMPORARY). Los contenidos de las tablas MEMORY se almacenan en memora , lo que es una propiedad que las tablas MEMORY comparten con las tablas internas que el servidor va creando al procesar consultas. Sin embargo, los dos tipos de tablas difierne en que las tablas MEMORY no estn sujetas a conversin de almacenamiento, mientras que las tablas internas s: Si una tabla interna llega a ser demasiado grande, el servidor la convierte automticamente a una tabla en disco. El lmite de tamao lo determina la variable de sistema tmp_table_size . Las tablas MEMORY nunca se convieren en tablas de disco. Para segurar que no comete un error accidentalmente, puede cambiar la variable de sistema max_heap_table_size para que imponga un tamao mximo de tablas MEMORY . Para tablas individuales, puede especificar la opcin de tabla MAX_ROWS en el comando CREATE TABLE . El servidor necesita suficiente memoria para mantener todas las tablas MEMORY en uso a la vez. Para liberar memoria usada por una tabla MEMORY cuando no se requiere su contenido, debe ejecutar DELETE FROM o TRUNCATE TABLE, o borrar toda la tabla con DROP TABLE. Si quiere rellenar una tabla MEMORY cuando arranca el servidor MySQL, puede usar la opcin -init-file . Por ejemplo, puede usar comandos como INSERT INTO ... SELECT o LOAD DATA INFILE en este fichero para cargar la tabla de una fuente de datos persistente. Consulte Seccin 5.3.1, Opciones del comando mysqld y Seccin 13.2.5, Sintaxis de LOAD DATA INFILE. Si usa replicacin, las tablas MEMORY del servidor maestro se vacan cuando se apaga y reinicia. Sin embargo, un esclavo no es consciente que se vacan estas tablas, as que retorna contenido desfasado si selecciona datos del mismo. En MySQL 5.0, cuando se usa una tabla MEMORY en el maestro por primera vez desde que arranc el maestro, se escribe un comando DELETE FROM en el log binario del maestro automticamente, resincronizando el maestro y el esclavo otra vez. Tenga en cuenta que incluso con esta estrategia, el esclavo tiene datos desfasados en la tabla en el intervalo entre el reinicio del maestro y el primer uso de la tabla. Sin embargo, si usa la opcin -init-file para rellenar la tabla MEMORY al arrancar el maestro, se asegura que este intervalo sea cero. La memoria necesaria por un registro en una tabla MEMORY se calcula con la siguiente expresin:
SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) * 4) + SUM_OVER_ALL_HASH_KEYS(sizeof(char*) * 2) + ALIGN(length_of_row+1, sizeof(char*))
ALIGN() representa un factor de redondeo para que la longitud del registro sea un mltiplo exacto del tamao del puntero char . sizeof(char*) es 4 en mquinas de 32-bit y 8 en mquinas de 64bit.
754
755
Instalacin de BDB
En este caso, debe recompilar MySQL sin soporte para tablas BDB o arrancar el servidor con la opcin --skip-bdb .
Para ms informacin consulte Seccin 2.7, Instalacin de MySQL en otros sistemas similares a Unix, Seccin 5.1.2, El servidor extendido de MySQL mysqld-max, y Seccin 2.8, Instalacin de MySQL usando una distribucin de cdigo fuente.
756
See Seccin 5.3.1, Opciones del comando mysqld. Si usa la opcin --skip-bdb , MySQL no inicializa la biblioteca Berkeley DB library y esto ahorra mucha memoria. Sin embargo, si usa esta opcin, no puede usar tablas BDB . Si trata de crear una tabla BDB , MySQL crea una tabla MyISAM en su lugar. Normalmente, debe arrancar mysqld sin la opcin --bdb-no-recover si quiere usar tablas BDB . Sin embargo, esto puede causar problemas cuando trata de arrancar mysqld si los ficheros de log de BDB estn corruptos. Consulte Seccin 2.9.2.3, Arrancar y resolver problemas del servidor MySQL. Con la variable bdb_max_lock , puede especificar el mximo nmero de bloqueos que pueden estar activos en una tabla BDB . Por defecto son 10,000. Debe incrementar esto si ocurren errores como el siguiente cuando realiza transacciones largas o cuando mysqld tiene que examinar muchos registros para ejecutar una consulta:
bdb: Lock table is out of available locks Got error 12 from ...
Puede cambiar las variables binlog_cache_size y max_binlog_cache_size si usa transacciones de varios comandos muy largas. Consulte Seccin 5.10.3, El registro binario (Binary Log). Consulte Seccin 5.3.3, Variables de sistema del servidor.
BerkeleyDB es sinnimo de BDB en la opcin ENGINE o TYPE . El motor de almacenamiento BDB proporciona tablas transaccionales. La forma de usar estas tablas depende del modo autocommit: Si est ejecutando con autocommit activado (por defecto), los cambios en las tablas BDB se efectan inmediatamente y no pueden deshacerse. Si est ejecutando con autocommit desactivado, los cambios no son permanentes hasta que ejecuta un comando COMMIT . En lugar de hacer un commit puede ejecutar ROLLBACK para olvidar los cambios. Puede comenzar una transaccin con el comando BEGIN WORK para suspender autocommit, o con SET AUTOCOMMIT=0 para desactivar autocommit explcitamente. Consulte Seccin 13.4.1, Sintaxis de START TRANSACTION, COMMIT y ROLLBACK. El motor de almacenamiento BDB tiene las siguientes caractersticas: En MySQL 5.0, las tablas BDB pueden tener hasta 31 ndices por tabla, 16 columnas por ndice, y un mximo de tamao de clave de 1024 bytes. MySQL necesita una PRIMARY KEY en cada tabla BDB para que cada registro pueda identificarse unvocamente. Si no crea una explcitamente, MySQL crea y mantiene una PRIMARY KEY oculta.
757
La clave oculta tiene una longitud de 5 bytes y se incrementa para cada intento de insercin. Esta clave no aparece en la salida de SHOW CREATE TABLE o DESCRIBE. La PRIMARY KEY es ms rpida que cualquier otro ndice, ya que la PRIMARY KEY se almacena junto con los datos. Los otros ndices se almacenan como los datos claves + la PRIMARY KEY, por lo que es importante mantener la PRIMARY KEY tan pequea como sea posible para ahorrar espacio en disco y tener ms velocidad. Este comportamiento es similar al de InnoDB, donde las claves primarias pequeas ahorran espacio no slo en el ndice primario sino tambin en ndices secundarios. Si todas las columnas a las que accede en una tabla BDB son parte del mismo ndice o parte de la clave primaria, MySQL puede ejcutar la consulta sin tener que acceder al registro. En una tabla MyISAM , esto slo puede hacerse si las columnas son parte del mismo ndice. El escaneo secuencial es ms lento que para tablas MyISAM ya que los datos en tablas BDB se almacena en B-trees y no en un fichero de datos separado. Los valores clave no tienen compresin de prefijo ni sufijo como los valores clave en tablas MyISAM . En otras palabras, la informacin clave ocupa ms espacio en tablas BDB en comparacin con MyISAM . A menudo hay huecos en la tabla BDB que le permiten insertar nuevos registros en medio del rbol ndice. Esto hace que las tablas BDB sean algo ms grandes que las MyISAM. SELECT COUNT(*) FROM tbl_name es lento para tablas BDB , ya que no se mantiene conteo de registros en la tabla. El optimizador necesita saber el nmero aproximado de registros en la tabla. MySQL resuelve esto contando inerciones y manteniendo esto en un segmento separado en cada tabla BDB . Si no realiza muchos comandos DELETE o ROLLBACK , este nmero debe ser lo bastante adecuado para el optimizador MySQL . Sin embargo, MySQL almacena el nmero slo al cerrar, as que puede ser incorrecto si el servidor termina inesperadamente. Puede que no sea fatal incluso si este nmero no es 100% correcto. Puede actualizar el contador de registros usando ANALYZE TABLE o OPTIMIZE TABLE. Consulte Seccin 13.5.2.1, Sintaxis de ANALYZE TABLE y Seccin 13.5.2.5, Sintaxis de OPTIMIZE TABLE. Bloqueo interno en tablas BDB se realiza a nivel de pginas. LOCK TABLES funciona en tablas BDB como con otras tablas. Si no usa LOCK TABLES, MySQL realiza un bloqueo interno de mltiple escritura en la tabla (un bloqueo que no bloquea otros escritores) para asegurar que la tabla est bloqueada apropiadamente si otro flujo realiza un bloqueo de tabla. Para poder deshacer transacciones, el motor de almacenamiento BDB mantiene ficheros de log. Para mximo rendimiento puede usar la opcin --bdb-logdir para guardar los logs BDB en un disco distinto al que tiene las bases de datos. MySQL realiza un checkpoint cada vez que se comienza un nuevo fichero log BDB , y borra cualquier fichero de log BDB no necesario para transacciones actuales. Puede usar FLUSH LOGS en cualquier momento para hacer un checkpoint de tablas Berkeley DB. Para recuperacin de desastres, debe usar copias de seguridad de tablas ms el log binario de MySQL. Consulte Seccin 5.8.1, Copias de seguridad de bases de datos. Atencin: Si borra ficheros de log antiguos que estn en uso, BDB no es capaz de recuperar todo y puede perder datos si algo no va bien. Las aplicaciones deben estar siempre preparadas para tratar casos donde cualquier cambio en una tabla BDB pueda causar un rollback automtico y cualquier lectura puede fallar con un error de deadlock.
758
Si obtiene un disco entero con una tabla BDB , obtiene un error (probablemente error 28) y la transaccin debe deshacerse. Esto contrasta con tablas MyISAM en las que mysqld espera a tener ms espacio libre para continuar.
En este caso, debe borrar todos los logs BDB de su directorio de datos (los fichero con nombres que tienen el formato log.XXXXXXXXXX) y reinicie mysqld. Tambin recomendamos que use
759
mysqldump --opt para volcar las tablas BDB , borre las tablas, y las restaure del fichero de volcado. Si el modo autocommit est desactivado y borra una tabla BDB referenciada por otra transaccin, puede obtener un mensaje de error de la siguiente forma en el log de error MySQL:
001119 23:43:56 001119 23:43:56 bdb: bdb: Missing log fileid entry txn_abort: Log undo failed for LSN: 1 3644744: Invalid
Esto no es fatal, pero hasta arreglar el problema, recomendamos que no borre tablas BDB excepto con el modo autocommit activado. (La forma de arreglarlo no es trivial.)
760
guardan en un formato particular del handler. Para leer registros, el handler debe parsear los datos en columnas. Para escribir registros, los valores de la columna deben convertirse al formato de registro usado por el handler y escribirse en el fichero de datos local. Con el motor MySQL FEDERATED no hay ficheros de datos locales para una tabla (por ejemplo, no hay fichero .MYD ). En su lugar, una base de datos remota almacena los datos que normalmente estaran en la tabla. Esto necesita el uso de la API del cliente MySQL para leer, borrar, actualizar e insertar datos. La recuperacin de datos se inicia via un comando SELECT * FROM tbl_name . Para leer el resultado, los registros se tratan uno a uno usando la funcin de la API C mysql_fetch_row() y luego se convierten desde las columnas del conjunto de resultados SELECT al formato que el handler FEDERATED espera. El flujo bsico es el siguiente: 1. Llamadas SQL efectuadas localmente 2. API del handler MySQL (datos en formato del handler ) 3. API del cliente MySQL (datos convertidos a llamadas SQL ) 4. Base de datos remota -> API del cliente MySQL 5. Convierte el conjunto de resultados al formato del handler 6. API del handler -> registros resultado o conteo de registros afectados a local
La opcin de tabla ENGINE puede nombrar cualquier motor de almacenamiento; la tabla no tiene porqu ser MyISAM . A continuacin, cree una tabla FEDERATED en el servidor local para acceder a la tabla remota:
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 CONNECTION='mysql://root@remote_host:9306/federated/test_table';
La estructura de esta tabla debe ser exactamente la misma que la de la tabla remota, excepto que la opcin de tabla ENGINE debe ser FEDERATED y la opcin de tabla CONNECTION es una cadena de conexin que indica al motor FEDERATED cmo conectar al servidor remoto.
761
El motor FEDERATED crea slo el fichero test_table.frm en la base de datos federated . La informacin del equipo remoto indica el servidor remoto al que se conecta el servidor local, y la informacin de base de datos y tabla indica la tabla remota a usar como fichero de datos. En este ejemplo, el servidor remoto est indicado para ser remote_host corriendo en el puerto 9306, as que puede arrancar ese servidor para que escuche en el puerto 9306. La forma general de la cadena de conexin en la opcin CONNECTION es la siguiente:
scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name
Slo se soporta mysql como scheme en este punto; la contrasea y el nmero de puerto son opcionales. Aqu hay algunas cadenas de conexin de ejemplo:
CONNECTION='mysql://username:password@hostname:port/database/tablename' CONNECTION='mysql://username@hostname/database/tablename' CONNECTION='mysql://username:password@hostname/database/tablename'
El uso de CONNECTION para especificar la cadena de conexin no es ptima y posiblemente cambiar en MySQL 5.1. Tngalo en cuenta al usar tablas FEDERATED, ya que significa que habr que hacer modificaciones cuando ocurra. Como cualquier contrasea usada se almacena en la cadena de conexin como texto plano, puede ser ledo por cualquier usuario que pueda usar SHOW CREATE TABLE o SHOW TABLE STATUS para la tabla FEDERATED , o consultar la tabla TABLES en la base de datos INFORMATION_SCHEMA .
762
Cuando crea una tabla ARCHIVE , el servidor crea un fichero de definicin de tabla en el directorio de base de datos. El fichero comienza con el nombre de tabla y tiene una extensin de .ARZ y .ARM. Un fichero .ARN puede aparecer durante operaciones de optimizacin. El motor ARCHIVE soporta slo INSERT y SELECT. Esto significa que no puede ejecutar DELETE, REPLACE, o update . Un SELECT realiza un escaneo de tabla completo. Los registros se comprimen al insertarse. OPTIMIZE TABLE puede usarse para comprimir la tabla. El motor ARCHIVE usa bloqueo a nivel de registro.
Si examina el fichero test.CSV en el directorio de base de datos creado al ejecutar los comandos precedentes, su contenido debe ser como este:
"1","record one" "2","record two"
763
764
765
Panormica de InnoDB
766
Configuracin de InnoDB
Nota: InnoDB dota a MySQL de un motor de almacenamiento transaccional (conforme a ACID) con capacidades de commit (confirmacin), rollback (cancelacin) y recuperacin de fallas. Esto no es posible si el sistema operativo subyacente y el hardware no funcionan como se requiere. Muchos sistemas operativos o subsistemas de disco podran diferir o reordenar operaciones de escritura a fin de mejorar el rendimiento. En algunos sistemas operativos, la propia llamada del sistema (fsync()), que debera esperar hasta que todos los datos no guardados de un fichero se graben a disco, en realidad puede retornar antes de que los datos se guarden en las tablas de almacenamiento. Debido a esto, una cada del sistema operativo o un corte en el suministro elctrico pueden destruir datos recientemente grabados, o, en el peor de los casos, corromper la base de datos debido a que las operaciones de escritura han sido reordenadas. Si la integridad de los datos es importante, se deberan llevar a cabo algunas pruebas que simulen cadas (pull-the-plug) e interrupciones sbitas, antes de comenzar el uso para produccin. En Mac OS X 10.3 y posteriores, InnoDB emplea un mtodo especial de volcado a fichero llamado fcntl(). Bajo Linux, es aconsejable deshabilitar el write-back cache. En discos duros ATAPI, un comando como hdparm -W0 /dev/hda puede funcionar. Hay que tener en cuenta que algunas unidades o controladores de disco podran estar imposibilitados de desactivar el write-back cache. Nota: Para obtener un buen desempeo, se deberan proveer expresamente los parmetros de InnoDB como se explica en los siguientes ejemplos. Naturalmente, habr que editar la configuracin para acomodarla a los requerimientos del hardware en uso. Para configurar los ficheros de espacio de tablas de InnoDB, debe utilizarse la opcin innodb_data_file_path en la seccin [mysqld] del fichero de opciones my.cnf. En Windows, se puede emplear en su lugar my.ini. El valor de innodb_data_file_path debera ser una lista de una o ms especificaciones de ficheros. Si se incluir ms de un fichero de datos, habr que separarlos con punto y coma (';'):
innodb_data_file_path=espec_fichero_datos1 [;espec_fichero_datos2]...
Por ejemplo, la siguiente es una configuracin que crear explcitamente un espacio de tablas con las mismas caractersticas que el predeterminado:
[mysqld] innodb_data_file_path=ibdata1:10M:autoextend
Esto configura un nico fichero de 10MB llamado ibdata1 el cual es autoextensible. No se suministra la ubicacin del fichero, por lo tanto, el directorio predeterminado es el directorio de datos de MySQL. El tamao del fichero se especifica empleando como sufijo las letras M o G para indicar unidades de MB o GB. A continuacin se configura un espacio de tablas que contiene un fichero de datos de tamao fijo de 50MB llamado ibdata1 y un fichero autoextensible de 50MB llamado ibdata2, ambos en el directorio de datos:
[mysqld] innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
La sintaxis completa para especificar un fichero de datos incluye el nombre del fichero, su tamao, y varios atributos opcionales:
nombre_de_fichero:tamao_de_fichero[:autoextend[:max:tamao_mximo_de_fichero]]
El atributo autoextend y aquellos que lo siguen slo pueden emplearse con el ltimo fichero en la lnea de innodb_data_file_path. Si se especifica la opcin autoextend para el ltimo fichero de datos, InnoDB incrementar el tamao del fichero si se queda sin capacidad para el espacio de tablas. El incremento es de 8MB cada vez.
767
Configuracin de InnoDB
Si se agotara la capacidad del disco, podra desearse agregar otro fichero de datos en otro disco. Las instrucciones para reconfigurar un espacio de tablas existente se encuentran en Seccin 15.7, Aadir y suprimir registros y ficheros de datos InnoDB. InnoDB no detecta el tamao mximo de fichero, por lo tanto, hay que ser cuidadoso en sistemas de ficheros donde el tamao mximo sea de 2GB. Para especificar el tamao mximo de un fichero autoextensible, se emplea el atributo max. La siguiente configuracin le permite a ibdata1 crecer hasta un lmite de 500MB:
[mysqld] innodb_data_file_path=ibdata1:10M:autoextend:max:500M
InnoDB crea los ficheros de espacios de tablas en el directorio de datos de MySQL en forma predeterminada. Para especificar una ubicacin expresamente, se emplea la opcin innodb_data_home_dir. Por ejemplo, para crear dos ficheros llamados ibdata1 e ibdata2 pero crendolos en el directorio /ibdata, InnoDB se configura de este modo:
[mysqld] innodb_data_home_dir = /ibdata innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
Nota: InnoDB no crea directorios, de modo que hay que estar seguro de que el directorio /ibdata existe antes de iniciar el servidor. Esto se aplica tambin a cualquier directorio de ficheros de registro (log) que se configure. Para crear los directorios necesarios se emplea el comando mkdir que existe en Unix y DOS. InnoDB forma el directorio para cada fichero de datos concatenando el valor textual de innodb_data_home_dir con el nombre del fichero, agregando una barra o barra invertida entre ellos si se necesita. Si la opcin innodb_data_home_dir no aparece en my.cnf, el valor predeterminado es el directorio ./, lo cual indica el directorio de datos de MySQL. Si se especifica una cadena vaca en innodb_data_home_dir, se pueden especificar rutas absolutas para los ficheros de datos listados en el valor de innodb_data_file_path. El siguiente ejemplo es equivalente al anterior:
[mysqld] innodb_data_home_dir = innodb_data_file_path=/ibdata/ibdata1:50M;/ibdata/ibdata2:50M:autoextend
Un ejemplo sencillo de my.cnf . Suponiendo que se posee un ordenador con 128MB de RAM y un disco duro, el siguiente ejemplo muestra posibles parmetros de configuracin InnoDB en my.cnf o my.ini incluyendo el atributo autoextend. Este ejemplo satisface las necesidades de la mayora de los usuarios, tanto en Unix como en Windows, que no deseen distribuir los ficheros de datos InnoDB en varios discos. Crea un fichero de datos autoextensible llamado ibdata1 y dos ficheros de registro (log) de InnoDB llamados ib_logfile0 y ib_logfile1 en el directorio de datos de MySQL. Tambin, el fichero de registros archivados de InnoDB ib_arch_log_0000000000 que MySQL crea automticamente, termina ubicado en el directorio de datos.
[mysqld] # Las demas opciones del servidor MySQL pueden escribirse aqu # ... # Los ficheros de datos deben ser capaces de contener datos e ndices # Hay que asegurarse de tener suficiente espacio en disco. innodb_data_file_path = ibdata1:10M:autoextend # # Establecer el tamao del buffer en un 50-80% de la memoria del ordenador set-variable = innodb_buffer_pool_size=70M set-variable = innodb_additional_mem_pool_size=10M # # Establecer el tamao del fichero de registro (log) en un 25% del tamao del buffer set-variable = innodb_log_file_size=20M set-variable = innodb_log_buffer_size=8M
768
Configuracin de InnoDB
# innodb_flush_log_at_trx_commit=1
Hay que asegurarse de que el servidor MySQL tiene los derechos de acceso apropiados para crear ficheros en el directorio de datos. Ms generalmente, el servidor debe tener derechos de acceso a cualquier directorio donde necesite crear ficheros de datos o registro (logs). Notar que los ficheros de datos deben ser menores de 2GB en algunos sistemas de ficheros. El tamao combinado de los ficheros de registro debe ser menor de 4GB. El tamao combinado de los ficheros de datos debe ser de por lo menos 10MB. Cuando se crea un espacio de tablas InnoDB por primera vez, es mejor iniciar el servidor MySQL desde la lnea de comandos. Entonces, InnoDB imprimir en pantalla la informacin acerca de la creacin de bases de datos, de forma que se podr ver lo que est ocurriendo. Por ejemplo, en Windows, si mysqld-max se ubica en C:\mysql\bin, se puede iniciar de este modo:
C:\> C:\mysql\bin\mysqld-max --console
Si no se enva la salida del servidor a la pantalla, se puede ver el fichero de registro de errores del servidor para averiguar lo que InnoDB imprime durante el proceso de inicio. Consulte Seccin 15.5, Crear el espacio de tablas InnoDB para un ejemplo de cmo debera lucir la informacin mostrada por InnoDB. Dnde deben especificarse las opciones en Windows? Las reglas para ficheros de opciones en Windows son las siguientes: Solo debe crearse el fichero my.cnf o my.ini, pero no los dos. El fichero my.cnf debe colocarse en el directorio raz de la unidad C:. El fichero my.ini debera colocarse en el directorio WINDIR; por ejemplo, C:\WINDOWS o C: \WINNT. Puede utilizarse el comando SET en una ventana de consola para mostrar el valor de WINDIR:
C:\> SET WINDIR windir=C:\WINNT
Si el ordenador emplea un gestor de arranque donde la unidad C: no es la unidad de arranque, slo es posible emplear el fichero my.ini. Si se instal MySQL empleando los asistentes de instalacin y configuracin, el fichero my.ini se ubica en el directorio de instalacin de MySQL. Consulte Seccin 2.3.5.14, Dnde est el fichero my.ini. Dnde deben especificarse las opciones en Unix? En Unix, mysqld lee las opciones en los siguientes ficheros, si existen, en el siguiente orden: /etc/my.cnf Opciones globales. $MYSQL_HOME/my.cnf Opciones especficas del servidor. defaults-extra-file El fichero especificado con la opcin --defaults-extra-file. ~/.my.cnf Opciones especficas del usuario.
769
Configuracin de InnoDB
MYSQL_HOME representa una variable de entorno la cual contiene la ruta al directorio que hospeda al fichero especfico de servidor my.cnf. Si se desea estar seguro de que mysqld lee sus opciones nicamente desde un fichero determinado, se puede emplear --defaults-option como la primera opcin en la lnea de comandos cuando se inicia el servidor:
mysqld --defaults-file=ruta_a_my_cnf
Un ejemplo avanzado de my.cnf . Suponiendo que se posee un ordenador Linux con 2GB de RAM y tres discos duros de 60GB (en los directorios /, /dr2 y /dr3). El siguiente ejemplo muestra posibles parmetros de configuracin InnoDB en my.cnf.
[mysqld] # Las demas opciones del servidor MySQL pueden escribirse aqu # ... innodb_data_home_dir = # # Los ficheros de datos deben ser capaces de contener datos e ndices innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend # # Establecer el tamao del buffer en un 50-80% de la memoria del ordenador, # pero hay que asegurarse que en Linux x86 el uso total de memoria es < 2GB innodb_buffer_pool_size=1G innodb_additional_mem_pool_size=20M innodb_log_group_home_dir = /dr3/iblogs # innodb_log_files_in_group = 2 # # Establecer el tamao del fichero de registro (log) en un 25% del tamao del buffer innodb_log_file_size=250M innodb_log_buffer_size=8M # innodb_flush_log_at_trx_commit=1 innodb_lock_wait_timeout=50 # # Quitar marca de comentario a las siguientes lineas si se desea usarlas #innodb_thread_concurrency=5
Ntese que el ejemplo ubica los dos ficheros de datos en discos diferentes. InnoDB llena el espacio de tablas comenzando por el primer fichero de datos. En algunos casos, el rendimiento de la base de datos mejorar si no se colocan todos los datos en el mismo disco fsico. Colocar los ficheros de registro (log) en un disco diferente a los datos, a menudo es beneficioso para el rendimiento. Tambin se pueden utilizar dispositivos en bruto (raw devices) como ficheros de datos InnoDB, lo cual mejorar la velocidad de E/S. Consulte Seccin 15.14.2, Usar dispositivos en bruto (raw devices) para espacios de tablas. Advertencia: En GNU/Linux x86 de 32 bits, se debe tener cuidado con no establecer el uso de memoria en un nmero demasiado alto. glibc le puede permitir al heap de proceso que crezca por sobre la pila de los subprocesos, lo cual har caer el servidor. Es arriesgado que el resultado del siguiente clculo exceda los 2GB:
innodb_buffer_pool_size + key_buffer_size + max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) + max_connections*2MB
Cada hilo emplea una pila (a menudo de 2MB, pero de solamente 256KB en los binarios de MySQL AB) y en el peor caso tambin emplear una cantidad de memoria adicional igual a sort_buffer_size + read_buffer_size. Compilando MySQL por s mismo, el usuario puede emplear hasta 64GB de memoria fsica en Windows de 32 bits. Consulte la descripcin de innodb_buffer_pool_awe_mem_mb en Seccin 15.4, Opciones de arranque de InnoDB.
770
Cmo deben ajustarse otros parmetro del servidor mysqld? Los siguientes son valores tpicos adecuados para la mayora de los usuarios:
[mysqld] skip-external-locking max_connections=200 read_buffer_size=1M sort_buffer_size=1M # # Establecer key_buffer a un 5 - 50% de la RAM., dependiendo de cunto se usen # tablas MyISAM, pero manteniendo key_buffer_size + InnoDB # buffer pool size < 80% de la RAM key_buffer_size=value
771
innodb_data_file_path Las rutas a los ficheros individuales de datos y sus tamaos. La ruta de directorio completa a cada fichero de datos se obtiene concatenando innodb_data_home_dir con cada ruta especificada aqu. Los tamaos de fichero se especifican en megabytes o gigabytes (1024MB) agregando M o G al valor que representa el tamao. La sumatoria de los tamaos de fichero debe ser de al menos 10MB. En algunos sistemas operativos, los ficheros deben tener menos de 2GB. Si no se indica innodb_data_file_path, el comportamiento predeterminado de inicio es crear un nico fichero autoextensible de 10MB llamado ibdata1. En aquellos sistemas operativos que soporten ficheros grandes, se puede establecer el tamao de fichero en ms de 4GB. Tambin pueden utilizarse como ficheros de datos particiones de dispositivos en bruto. Consulte Seccin 15.14.2, Usar dispositivos en bruto (raw devices) para espacios de tablas. innodb_data_home_dir La porcin comn de la ruta de directorio para todos los ficheros de datos InnoDB. Si este valor no se establece, por defecto ser el directorio de datos de MySQL. Tambin puede especificarse como una cadena vaca, en cuyo caso se podrn utilizar rutas absolutas en innodb_data_file_path. innodb_doublewrite Por defecto, InnoDB almacena todos los datos dos veces, la primera en el buffer de escritura doble (o doublewrite), y luego a los ficheros de datos reales. Esta opcin puede emplearse para desactivar dicha funcionalidad. Al igual que innodb_checksums, esta opcin est habilitada por defecto; puede desactivarse con --skip-innodb-doublewrite en pruebas de rendimiento o casos en que el mximo desempeo prevalezca sobre la preocupacion por la integridad de los datos o las posibles fallas. Esta opcin se agreg en MySQL 5.0.3. innodb_fast_shutdown Si se establece a 0, InnoDB efecta una descarga completa y vuelca los buffers de insercin antes de llevar a cabo el cierre del servidor. Estas operaciones pueden tomar minutos o incluso horas en casos extremos. Si se establece en 1, InnoDB pasa por alto estas operaciones al cierre. El valor por defecto es 1. Si se establece en 2 (opcin que est disponible desde MySQL 5.0.5, excepto en Netware), InnoDB simplemente vuelca a disco sus registros (logs) y se cierra en fro, como si hubiera ocurrido una cada; ninguna transaccin confirmada se perder, pero en el siguiente inicio se ejecutar una recuperacin ante cadas. innodb_file_io_threads El nmero de subprocesos (threads) de E/S de fichero en InnoDB. Normalmente esto debera ser dejado en el valor predeterminado de 4, pero la E/S de disco en Windows puede beneficiarse con un nmero mayor. En Unix, incrementar el nmero no tiene efecto; InnoDB siempre utiliza el valor predeterminado. innodb_file_per_table Esta opcin provoca que InnoDB cree cada nueva tabla utilizando su propio fichero .ibd para almacenar datos e ndices, en lugar de colocarlo en el espacio de tablas compartidas. Consulte Seccin 15.6.6, Usar un espacio de tablas para cada tabla. innodb_flush_log_at_trx_commit Cuando innodb_flush_log_at_trx_commit se establece en 0, una vez por segundo el buffer de registros (log buffer) se graba en el fichero de registro y se vuelca a disco, pero no se hace nada al confirmar una transaccin. Cuando este valor es 1 (predeterminado), cada vez que se confirma una transaccin el buffer de registros (log buffer) se graba en el fichero de registro y se vuelca a disco Cuando se establece en 2, el buffer de registros (log buffer) se graba en el fichero de registro, pero no se vuelca a disco. Sin embargo, el volcado a disco del fichero de registro se produce una vez por segundo tambin cuando vale 2. Se debe tener en cuenta que el volcado una vez por segundo no est 100% garantizado que ocurra en cada segundo, debido a cuestiones de
772
programacin (scheduling) de procesos. Se puede alcanzar un mayor rendimiento estableciendo un valor diferente de 1, pero en caso de cada se puede perder un segundo de transacciones. Si se establece el valor en 0, cualquier cada en un proceso de mysqld puede borrar el ltimo segundo de transacciones. Si se establece el valor en 2, entonces nicamente una cada del sistema operativo o una interrupcin de energa pueden borrar el ltimo segundo de transacciones. Hay que notar que muchos sistemas operativos y algunos tipos de discos puedne ser engaosos en las operaciones de volcado a disco. Podran indicarle a mysqld que el volcado ha tenido lugar, aunque no sea as. En tal caso la estabilidad de las transacciones no est garantizada ni an con el valor 1, y en el peor de los casos una interrupcin de energa puede incluso corromper la base de datos InnoDB. Utilizar un cach de disco apoyado por bateras en el controlador de disco SCSI o en el propio disco, acelera los volcados a disco, y hace ms segura la operacin. Tambin puede intentarse con el comando de Unix hdparm, el cual deshabilita el almacenamiento en caches de hardware de las operaciones de escritura a disco, o utilizar algn otro comando especfico del fabricante del hardware. El valor por defecto de esta opcin es 1 innodb_flush_method Esta opcin solamente es relevante en sistemas Unix. Si se establece en fdatasync (el valor predeterminado), InnoDB utiliza fsync() para volcar tanto los ficheros de datos como de registro (log). Si se establece en O_DSYNC, InnoDB emplea O_SYNC para abrir y volcar los ficheros de registro, pero utiliza fsync() para volcar los ficheros de datos. Si se especifica O_DIRECT (disponible en algunas versiones de GNU/Linux), InnoDB utiliza O_DIRECT para abrir los ficheros de datos, y fsync() para volcar tanto los ficheros de datos como de registro. Ntese que InnoDB emplea fsync() en lugar de fdatasync(), y no emplea O_DSYNC por defecto porque han ocurrido problemas con ste en muchas variedades de Unix. innodb_force_recovery Advertencia: Esta opcin debera ser definida solamente en una situacin de emergencia cuando se desean volcar las tablas desde una base de datos corrupta. Los posibles valores van de 1 a 6. Los significados de estos valores se describen en Seccin 15.8.1, Forzar una recuperacin. Como una medida de seguridad, InnoDB impide que un usuario modifique datos cuando esta opcin tiene un valor mayor a 0. innodb_lock_wait_timeout El lmite de tiempo, en segundos, que una transaccin InnoDB puede esperar por un bloqueo antes de ser cancelada. InnoDB automticamente detecta bloqueos mutuos (deadlocks) en su propia tabla de bloqueos, y cancela la transaccin. InnoDB detecta los bloqueos por el uso de la sentencia LOCK TABLES. El valor predeterminado es de 50 segundos. Para conseguir la mayor estabilidad y consistencia posibles en una configuracin de replicacin, se debera utilizar innodb_flush_logs_at_trx_commit=1, sync-binlog=1, y innodb_safe_binlog en el fichero my.cnf principal. innodb_locks_unsafe_for_binlog Esta opcin desactiva el bloqueo de la clave siguiente en bsquedas y exploraciones de ndices InnoDB. El valor por defecto de esta opcin es falso. Normalmente, InnoDB utiliza un algoritmo denominado bloqueo de clave siguiente (next-key). InnoDB efecta un bloqueo a nivel de fila de tal forma que cuando busca o explora el ndice de una tabla, establece bloqueos compartidos o exclusivos en cualquier registro de ndice que encuentre. El bloqueo que InnoDB establece en registros de ndice tambin afecta al vaco que precede a ese registro. Si un usuario tiene un bloqueo compartido o exclusivo sobre el registro R en un ndice, otro usuario no puede insertar un nuevo registro de ndice inmediatamente antes de R en el orden del ndice. Esta opcin provoca que InnoDB no utilice el bloqueo de clave siguiente en bsquedas o exploraciones de ndices. El bloqueo de clave siguiente es todava utilizado para asegurar las restricciones de claves forneas y la verificacin de claves duplicadas. Ntese que el uso de esta opcin puede provocar problemas secundarios: suponiendo que se deseen leer y bloquear todos los
773
registros hijos de la tabla child que tengan un identificador mayor a 100, junto al posterior intento de actualizar algunas columnas en las filas seleccionadas:
SELECT * FROM child WHERE id > 100 FOR UPDATE;
Supngase que hay un ndice sobre la columna id. La consulta explora aquel ndice comenzando por el primer registro en que id sea mayor que 100. Si el bloqueo efectuado sobre los registros del ndice no bloquea las inserciones realizadas en los espacios vacos, en la tabla se insertar un nuevo registro. Si se ejecuta el mismo SELECT dentro de la misma transaccin, se ver un nuevo registro en el conjunto de resultados devuelto por la consulta. Esto tambin significa que si se agregan nuevos elementos a la base de datos, InnoDB no garantiza la serializacin; sin embargo, los conflictos de serializacin an estn garantizados. Por lo tanto, si esta opcin se utiliza, InnoDB garantiza como mucho el nivel de aislamiento READ COMMITTED. A partir de MySQL 5.0.2 esta opcin es an ms insegura. InnoDB en un UPDATE o DELETE solamente bloquea los registros que se actualizan o borran. Esto reduce notablemente la probabilidad de bloqueos mutuos (deadlocks), pero an pueden ocurrir. Ntese que esta opcin todava no le permite a operaciones como UPDATE predominar sobre otras operaciones similares (como otro UPDATE) an en el caso en que acten sobre registros diferentes. Considrese lo siguiente: example:
CREATE TABLE A(A INT NOT NULL, B INT); INSERT INTO A VALUES (1,2),(2,3),(3,2),(4,3),(5,2); COMMIT;
La consulta dos tendr que esperar la confirmacin o la cancelacin de la consulta uno, porque sta tiene un bloqueo exclusivo en el registro (2,3), y la consulta dos, mientras explora los registros, tambin intenta colocar un bloqueo exclusivo en la misma fila, cosa que no puede hacer. Esto se debe a que la consulta dos primero establece el bloqueo sobre un registro y luego determina si el registro pertenece al conjunto de resultados, y si no es as libera el bloqueo innecesario, cuando se emplea la opcin innodb_locks_unsafe_for_binlog. Por lo tanto, la consulta uno se ejecuta de este modo:
x-lock(1,2) unlock(1,2) x-lock(2,3) update(2,3) to (2,5) x-lock(3,2) unlock(3,2) x-lock(4,3) update(4,3) to (4,5) x-lock(5,2) unlock(5,2)
innodb_log_arch_dir 774
El directorio donde los ficheros de registro (logs) terminados se archivarn si se utiliza el archivo de ficheros de registro. Si se utiliza, el valor de este parmetro debera ser el mismo que innodb_log_group_home_dir. Sin embargo, no es requerido. innodb_log_archive Este valor generalmente debera establecerse a 0. Debido a que la recuperacin a partir de una copia de respaldo es realizada por MySQL empleando sus propios ficheros de registro (log), en general no hay necesidad de archivar los ficheros de registro de InnoDB. El valor predeterminado para esta opcin es 0. innodb_log_buffer_size El tamao del buffer que InnoDB emplea para escribir los ficheros de registro (logs) en disco. Los valores razonables se encuentran entre 1MB y 8MB. El valor predeterminado es 1MB. Un buffer de fichero de registro grande le permite a las transacciones extensas ejecutarse sin necesidad de guardar el fichero de registro en disco antes de que la transaccin se confirme. Por lo tanto, si se manejan grandes transacciones, incrementar el tamao del buffer de ficheros de registro ahorra operaciones de E/S en disco. innodb_log_file_size El tamao de cada fichero de registro (log) en un grupo de ficheros de registro. El tamao combinado de estos ficheros debe ser inferior a 4GB en ordenadores de 32 bits. El valor predeterminado es de 5MB. El rango de valores razonables va desde 1MB hasta la 1/N parte del tamao del pool de buffer, donde N es la cantidad de ficheros de registro en el grupo. Mientras mayor es el valor, menor es la cantidad de guardado de puntos de verificacin que se necesitan en el pool de buffer, ahorrando operaciones de E/S en disco. Pero tener ficheros de registro ms grandes tambin significa que la recuperacin es ms lenta en caso de cadas. innodb_log_files_in_group En un grupo de ficheros de registro (logs), es la cantidad de ficheros que contiene. InnoDB escribe en los ficheros siguiendo una forma circular. El valor predeterminado es 2 (recomendado). innodb_log_group_home_dir La ruta de directorio a los ficheros de registro (log) de InnoDB. Debe tener el mismo valor que innodb_log_arch_dir. Si no se especifican parmetros de ficheros de registro InnoDB, la accin predeterminada es crear dos ficheros de 5MB llamados ib_logfile0 y ib_logfile1 en el directorio de datos de MySQL. innodb_max_dirty_pages_pct Un entero en el rango de 0 a 100. El valor por defecto es 90. El subproceso (thread) principal en InnoDB intenta volcar pginas desde el pool de buffer de modo que a lo sumo este porcentaje de las pginas an sin volcar sea volcado en un momento determinado. Si se tiene el privilegio SUPER, este porcentaje pude cambiarse mientras el servidor est en ejecucin:
SET GLOBAL innodb_max_dirty_pages_pct = value;
innodb_max_purge_lag Esta opcin controla la forma de retrasar las operaciones INSERT, UPDATE y DELETE cuando las operaciones de descarga (ver Seccin 15.12, Implementacin de multiversin) estn sufiendo demoras. TEl valor por defecto de este parmetro es cero, lo que significa que no se retrasarn. Esta opcin puede modificarse en tiempo de ejecucin como una variable global de sistema. El sistema de transacciones de InnoDB mantiene una lista de transacciones que tienen entradas en los ndices marcadas para ser eliminadas por operaciones UPDATE o DELETE. Se deja que la longitud de esta lista sea purge_lag. Cuando purge_lag excede a
775
innodb_max_purge_lag, cada operacin de INSERT, UPDATE y DELETE se retrasa durante ((purge_lag/innodb_max_purge_lag)*10)-5 milisegundos. El retraso se computa en el comienzo de un lote de depuracin, cada diez segundos. Las operaciones no se retrasan si no puede ejecutarse la depuracin debido a una vista de lectura consistente (consistent read) anterior que contenga los registros a ser depurados. Un escenario tpico para una carga de trabajo problemtica podra ser 1 milln, asumiendo que las transacciones son pequeas, slo 100 bytes de tamao, y se pueden permitir 100 MB de registros sin descargar en las tablas. innodb_mirrored_log_groups El nmero de copias idnticas de grupos de ficheros de registro que se mantienen para la base de datos. Actualmente debera establecerse en 1. innodb_open_files Esta opcin slo es relevante si se emplean mltiples espacios de tablas en InnoDB. Especifica el nmero mximo de ficheros .ibd que InnoDB puede mantener abiertos al mismo tiempo. El mnimo es 10. El valor predeterminado es 300. Los descriptores de fichero empleados para ficheros .ibd son nicamente para InnoDB. Son independientes de los especificados por la opcin de servidor --open-files-limit, y no afectan la operacin del cach de tablas. innodb_safe_binlog Contribuye a asegurar la consistencia entre el contenido de las tablas InnoDB y el registro binario (binary log). Consulte Seccin 5.10.3, El registro binario (Binary Log). innodb_status_file Esta opcin provoca que InnoDB cree un fichero <datadir>/innodb_status.<pid> para la salida perodica de SHOW INNODB STATUS. Disponible desde MySQL 4.0.21. innodb_table_locks InnoDB respeta lo establecido por LOCK TABLES, y MySQL no retorna desde un LOCK TABLE .. WRITE hasta que todos los otros flujos (threads) han levantado sus bloqueos a la tabla. El valor por defecto es 1, lo cual significa que LOCK TABLES causar que InnoDB bloquee una tabla internamente. En aplicaciones que emplean AUTOCOMMIT=1, los bloqueos internos de tabla de InnoDB pueden originar bloqueos mutuos (deadlocks). Se puede establecer innodb_table_locks=0 en my.cnf (o my.ini en Windows) para eliminar ese problema. innodb_thread_concurrency InnoDB intenta mantener el nmero de flujos (threads) del sistema operativo que concurren dentro de InnoDB en un valor menor o igual al lmite especificado por este parmetro. Antes de MySQL 5.0.8, el valor por defecto es 8. Si se tienen dificultades de rendimiento, y SHOW INNODB STATUS indica que hay muchos subprocesos esperando por semforos, se podran tener subprocesos pugnando por recursos, y se debera establecer este parmetro en un nmero mayor o menor. Si se posee un ordenador con varios procesadores y discos, se puede intentar aumentar el valor para hacer mejor uso de los recursos del ordenador. Un valor recomendado es la suma del nmero de procesadores y discos que tiene el sistema. Un valor de 500 o mayor deshabilitar la verificacin de concurrencia. A partir de MySQL 5.0.8, el valor por defecto es 20, y la verificacin de concurrencia se deshabilita si se establece en 20 o ms. innodb_status_file 776
Esta opcin provoca que InnoDB cree un fichero <datadir>/innodb_status.<pid> para almacenar peridicamente la salida de SHOW INNODB STATUS.
Se ha creado una nueva base de datos InnoDB. Se puede conectar al servidor MySQL con los programas cliente acostumbrados, como mysql. Cuando se detiene el servidor MySQL, con mysqladmin shutdown, la salida es como la siguiente:
010321 18:33:34 010321 18:33:34 InnoDB: Starting InnoDB: Shutdown mysqld: Normal shutdown mysqld: Shutdown Complete shutdown... completed
Se puede mirar en los directorios de ficheros de datos y registro y se vern los ficheros creados. El directorio de registro (log) tambin contiene un pequeo fichero llamado ib_arch_log_0000000000. Ese fichero resulta de la creacin de la base de datos, luego de lo cual InnoDB desactiv el guardado de registros (log). Cuando MySQL inicia de nuevo, los ficheros de datos y de registro ya han sido creados, por lo que la salida es ms breve:
InnoDB: Started mysqld: ready for connections
Es posible agregar la opcin innodb_file_per_table a my.cnf, y hacer que InnoDB almacene cada tabla en su propio fichero .ibd en un directorio de bases de datos de MySQL. Consulte Seccin 15.6.6, Usar un espacio de tablas para cada tabla.
777
La sentencia SQL crea una tabla y un ndice en la columna a en el espacio de tablas InnoDB que consiste en los ficheros de datos especificados en my.cnf. Adicionalmente, MySQL crea un fichero customers.frm en el directorio test debajo del directorio de bases de datos de MySQL. Internamente, InnoDB agrega a su propio diccionario de datos una entrada para la tabla 'test/ customers'. Esto significa que puede crearse una tabla con el mismo nombre customers en otra base de datos, y los nombres de las tablas no entrarn en conflicto dentro de InnoDB. Se puede consultar la cantidad de espacio libre en el espacio de tablas InnoDB dirigiendo una sentencia SHOW TABLE STATUS para cualquier tabla InnoDB. La cantidad de espacio libre en el espacio de tablas aparece en la seccin Comment en la salida de SHOW TABLE STATUS. Un ejemplo:
SHOW TABLE STATUS FROM test LIKE 'customers'
Ntese que las estadsticas que SHOW muestra acerca de las tablas InnoDB son solamente aproximadas. Se utilizan en la optimizacin SQL. No obstante, los tamaos en bytes reservados para las tablas e ndices son exactos.
778
shell> mysql test Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 to server version: 3.23.50-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> CREATE TABLE CUSTOMER (A INT, B CHAR (20), INDEX (A)) -> ENGINE=InnoDB; Query OK, 0 rows affected (0.00 sec) mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO CUSTOMER VALUES (10, 'Heikki'); Query OK, 1 row affected (0.00 sec) 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>
En APIs como PHP, Perl DBI/DBD, JDBC, ODBC, o la interface de llamadas C estndar de MySQL, se pueden enviar sentencias de control de transacciones como COMMIT al servidor MySQL en forma de cadenas, igual que otras sentencias SQL como SELECT o INSERT. Algunas APIs tambin ofrecen funciones o mtodos especiales para confirmacin y cancelacin de transacciones.
Luego de que todos los registros se hayan insertado, se pueden renombrar las tablas. Durante la conversin de tablas grandes, se puede reducir la cantidad de operaciones de E/S en disco incrementando el tamao del pool de buffer de InnoDB. No debe usarse ms del 80% de la memoria fsica. Tambin pueden aumentarse los tamaos de los ficheros de registro (log) de InnoDB.
779
Hay que asegurarse de no llenar completamente el espacio de tablas: las tablas InnoDB necesitan mucho ms espacio que las tablas MyISAM. Si una sentencia ALTER TABLE se queda sin espacio, realizar una cancelacin (rollback), y esto puede tomar horas si lo hace sobre el disco. Para las inserciones, InnoDB emplea el buffer de insercin para combinar en lotes los registros secundarios de ndices con los ndices. Esto ahorra gran cantidad de operaciones de E/S en disco. Durante la cancelacin no se emplea ese mecanismo, de modo que puede llevar ms de 30 veces el tiempo insumido por la insercin. Si se produjera una de estas cancelaciones fuera de control, sino se tienen datos valiosos en la base de datos, puede ser preferible matar el proceso de la base de datos en lugar de esperar que se completen millones de operaciones de E/S en disco. Para el procedimiento completo, consulte Seccin 15.8.1, Forzar una recuperacin.
El valor retornado por la sentencia se incrementa en uno y se asigna a la columna, y al contador de auto incremento de la tabla. Si la tabla est vaca, se asigna el valor 1. Si el contador an no se ha inicializado y se ejecuta una sentencia SHOW TABLE STATUS que muestre su salida para la tabla T, el contador se inicializa (pero no se incrementa) y se almacena para usos posteriores. Ntese que en esta inicializacin se realiza una lectura normal con bloqueo exclusivo y el bloqueo permanece hasta el final de la transaccin. InnoDB sigue el mismo procedimiento para inicializar el contador de auto incremento de una tabla recientemente creada. Ntese que si durante un INSERT el usuario especifica un valor NULL o 0 para una columna AUTO_INCREMENT, InnoDB trata a la columna como si no se hubiera especificado un valor y genera un nuevo valor para ella. Luego de que el contador de auto incremento ha sido inicializado, si un usuario inserta una fila que explcitamente indica para la columna auto incremental un valor mayor que el valor actual del contador, ste se establece al valor actual de la columna. Si no se indica un valor, InnoDB incrementa el valor del contador en uno y lo asigna a la columna. Al acceder al contador de auto incremento, InnoDB emplea un nivel de bloqueo de tabla especial AUTO-INC, que mantiene hasta el final de la sentencia SQL actual y no hasta el final de la transaccin. Esta estrategia de bloqueo especial fue introducida para mejorar la concurrencia de inserciones en una tabla que contiene una columna AUTO_INCREMENT. Dos transacciones no pueden tener el bloqueo AUTO-INC simultneamente en la misma tabla. Ntese que pueden observarse valores faltantes en la secuencia de valores asignados a la columna AUTO_INCREMENT si se cancelan transacciones que ya han obtenido nmeros desde el contador. El comportamiento del mecanismo de auto incremento no se encuentra definido si un usuario asigna un valor negativo a la columna o si el valor se vuelve mayor que el entero ms grande que puede almacenarse en el tipo de entero especificado. A partir de MySQL 5.0.3, InnoDB soporta la opcin AUTO_INCREMENT = n en sentencias CREATE TABLE y ALTER TABLE, para establecer inicialmente o modificar el valor actual del contador. El efecto
780
de esta accin es cancelado al reiniciar el servidor, por las razones tratadas anteriormente en esta seccin.
Las definiciones de claves forneas estn sujetas a las siguientes condiciones: Ambas tablas deben ser InnoDB y no deben ser tablas temporales. En la tabla que hace referencia, debe haber un ndice donde las columnas de clave extranjera estn listadas en primer lugar, en el mismo orden. En la tabla referenciada, debe haber un ndice donde las columnas referenciadas se listen en primer lugar, en el mismo orden. En MySQL/InnoDB 5.0, tal ndice se crear automticamente en la tabla referenciada si no existe an. No estn soportados los ndices prefijados en columnas de claves forneas. Una consecuencia de esto es que las columnas BLOB y TEXT no pueden incluirse en una clave fornea, porque los ndices sobre dichas columnas siempre deben incluir una longitud prefijada. Si se proporciona un CONSTRAINTsmbolo, ste debe ser nico en la base de datos. Si no se suministra, InnoDB crea el nombre automticamente. InnoDB rechaza cualquier operacin INSERT o UPDATE que intente crear un valor de clave fornea en una tabla hija sin un valor de clave candidata coincidente en la tabla padre. La accin que InnoDB lleva a cabo para cualquier operacin UPDATE o DELETE que intente actualizar o borrar un valor de clave candidata en la tabla padre que tenga filas coincidentes en la tabla hija depende de la accion referencial especificada utilizando las subclusulas ON UPDATE y ON DETETE en la clusula FOREIGN KEY. Cuando el usuario intenta borrar o actualizar una fila de una tabla padre, InnoDB soporta cinco acciones respecto a la accin a tomar: CASCADE: Borra o actualiza el registro en la tabla padre y automticamente borra o actualiza los registros coincidentes en la tabla hija. Tanto ON DELETE CASCADE como ON UPDATE CASCADE estn disponibles en MySQL 5.0. Entre dos tablas, no se deberan definir varias clusulas ON UPDATE CASCADE que acten en la misma columna en la tabla padre o hija. SET NULL: Borra o actualiza el registro en la tabla padre y establece en NULL la o las columnas de clave fornea en la tabla hija. Esto solamente es vlido si las columnas de clave fornea no han sido definidas como NOT NULL. MySQL 5.0 soporta tanto ON DELETE SET NULL como ON UPDATE SET NULL. NO ACTION: En el estndar ANSI SQL-92, NO ACTION significa ninguna accin en el sentido de que unintento de borrar o actualizar un valor de clave primaria no sera permitido si en la tabla referenciada hay una valor de clave fornea relacionado. (Gruber, Mastering SQL, 2000:181). En MySQL 5.0, InnoDB rechaza la operacin de eliminacin o actualizacin en la tabla padre. RESTRICT: Rechaza la operacin de eliminacin o actualizacin en la tabla padre. NO ACTION y RESTRICT son similares en tanto omiten la clusula ON DELETE u ON UPDATE. (Algunos sistemas de bases de datos tienen verificaciones diferidas o retrasadas, una de las cuales es NO ACTION. En MySQL, las restricciones de claves forneas se verifican inmediatamente, por eso, NO ACTION y RESTRICT son equivalentes.) SET DEFAULT: Esta accin es reconocida por el procesador de sentencias (parser), pero InnoDB rechaza definiciones de tablas que contengan ON DELETE SET DEFAULT u ON UPDATE SET DEFAULT.
781
InnoDB soporta las mismas opciones cuando se actualiza la clave candidata en la tabla padre. Con CASCADE, las columnas de clave fornea en la tabla hija son establecidas a los nuevos valores de la clave candidata en la tabla padre. Del mismo modo, las actualizaciones se producen en cascada si las columnas actualizadas en la tabla hija hacen referencia a claves forneas en otra tabla. Ntese que InnoDB soporta referencias de clave fornea dentro de una tabla, y, en estos casos, la tabla hija realmente significa registros dependientes dentro de la tabla. InnoDB necesita que haya ndices sobre las claves forneas y claves referenciadas, as las verificaciones de claves forneas pueden ser veloces y no necesitan recorrer la tabla. En MySQL 5.0, el ndice en la clave fornea se crea automticamente. Esto contrasta con versiones ms antiguas (anteriores a 4.1.8), donde los ndices deban crearse explcitamente o fallaba la creacin de restricciones de claves forneas. Las columnas involucradas en la clave fornea y en la clave referenciada deben tener similares tipos de datos internos dentro de InnoDB, de modo que puedan compararse sin una conversin de tipo. La longitud y la condicin de con o sin signo de los tipos enteros deben ser iguales. La longitud de los tipos cadena no necesita ser la misma. Si se especifica una accin SET NULL, hay que asegurarse de que las columnas en la tabla hija no se han declarado como NOT NULL. Si MySQL informa que ocurri un error nmero 1005 en una sentencia CREATE TABLE y la cadena con el mensaje de error se refiere al errno (nmero de error) 150, significa que la creacin de una tabla fall debido a una restriccin de clave fornea formulada incorrectamente. Del mismo modo, si un ALTER TABLE falla y hace referencia al nmero de error 150, significa que se ha formulado incorrectamente una restriccin de clave extranjera cuando se alter la tabla. En MySQL 5.0, puede emplearse SHOW INNODB STATUS para mostrar una explicacin detallada del ltimo error de clave fornea sufrido por InnoDB en el servidor. Nota: InnoDB no verifica las restricciones de claves forneas en las claves forneas o valores de claves referenciados que contengan una columna NULL. Una desviacin del estndar SQL: Si en la tabla padre hay varios registros que contengan el mismo valor de clave referenciada, entonces InnoDB se comporta en las verificaciones de claves extranjeras como si los dems registros con el mismo valor de clave no existiesen. Por ejemplo, si se ha definido una restriccin del tipo RESTRICT, y hay un registro hijo con varias filas padre, InnoDB no permite la eliminacin de ninguna de stas. InnoDB lleva a cabo las operaciones en cascada a travs de un algoritmo de tipo depth-first, basado en los registros de los indices correspondientes a las restricciones de claves forneas. Una desviacin del estndar SQL: Si ON UPDATE CASCADE u ON UPDATE SET NULL vuelven a modificar la misma tabla que se est actualizando en cascada, el comportamiento es como en RESTRICT. Esto significa que en una tabla no se pueden ejecutar operaciones ON UPDATE CASCADE u ON UPDATE SET NULL que hagan referencia a ella misma. De ese modo se previenen bucles infinitos resultantes de la actualizacin en cascada. En cambio, una operacin ON DELETE SET NULL, puede hacer referencia a la misma tabla donde se encuentra, al igual que ON DELETE CASCADE. En MySQL 5.0, las operaciones en cascada no pueden anidarse en ms de 15 niveles de profundidad. Una desviacin del estndar SQL: Como sucede en MySQL en general, en una sentencia SQL que realice inserciones, eliminaciones o actualizaciones en varias filas, InnoDB verifica las restricciones UNIQUE y FOREIGN KEY fila a fila. De acuerdo con el estndar SQL, el comportamiento predeterminado debera ser que las restricciones se verifiquen luego de que la sentencia SQL ha sido procesada por completo. Note: Actualmente, los disparadores no son activados por acciones de claves forneas en cascada. Un ejemplo sencillo que relaciona tablas padre e hijo a travs de una clave fornea de una sola columna:
CREATE TABLE parent(
782
id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE child( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ) ENGINE=INNODB;
Aqu, un ejemplo ms complejo, en el cual una tabla product_order tiene claves forneas hacia otras dos tablas. Una de las claves forneas hace referencia a un ndice de dos columnas en la tabla product. La otra hace referencia a un ndice de una sola columna en la tabla customer:
CREATE TABLE product ( category INT NOT NULL, id INT NOT NULL, price DECIMAL, PRIMARY KEY(category, id) ) ENGINE=INNODB; CREATE TABLE customer ( id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE product_order ( no INT NOT NULL AUTO_INCREMENT, product_category INT NOT NULL, product_id INT NOT NULL, 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) ) ENGINE=INNODB;
InnoDB permite agregar una nueva restriccin de clave fornea a una tabla empleando ALTER TABLE:
ALTER TABLE yourtablename ADD [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
Debe recordarse crear en primer lugar los ndices necesarios.. Tambin se puede agregar una clave fornea autoreferente a una tabla empleando ALTER TABLE. InnoDB tambin soporta el uso de ALTER TABLE para borrar claves forneas:
ALTER TABLE nombre_tabla DROP FOREIGN KEY smbolo_clave_fornea;
Si la clusula FOREIGN KEY incluye un nombre de CONSTRAINT cuando se crea la clave fornea, se puede utilizar ese nombre para eliminarla. En otro caso, el valor smbolo_clave_fornea es generado internamente por InnoDB cuando se crea la clave fornea. Para saber cul es este smbolo cuando se desee eliminar una clave fornea, se emplea la sentencia SHOW CREATE TABLE. Un ejemplo:
mysql> SHOW CREATE TABLE ibtest11c\G *************************** 1. row *************************** Table: ibtest11c
783
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 ) ENGINE=INNODB CHARSET=latin1 1 row in set (0.01 sec) mysql> ALTER TABLE ibtest11c DROP FOREIGN KEY 0_38775;
El procesador de sentencias (parser) de InnoDB permite emplear acentos graves (ASCII 96) para encerrar los nombres de tablas y columnas en una clsusula FOREIGN KEY ... REFERENCES .... El parser de InnoDB tambin toma en cuenta lo establecido en la variable de sistema lower_case_table_names. InnoDB devuelve las definiciones de claves forneas de una tabla como parte de la salida de la sentencia SHOW CREATE TABLE:
SHOW CREATE TABLE tbl_name;
A partir de esta versin, mysqldump tambin produce definiciones correctas de las tablas en el fichero generado, sin omitir las claves forneas. Se pueden mostrar las restricciones de claves forneas de una tabla de este modo:
SHOW TABLE STATUS FROM nombre_bd LIKE 'nombre_tabla';
Las restricciones de claves forneas se listan en la columna Comment de la salida producida. Al llevar a cabo verificaciones de claves forneas, InnoDB establece bloqueos compartidos a nivel de fila en los registros de tablas hijas o padres en los cuales deba fijarse. InnoDB verifica las restricciones de claves forneas inmediatamente, la verificacin no es demorada hasta la confirmacin de la transaccin. Para facilitar la recarga de ficheros de volcado de tablas que tengan relaciones de claves forneas, mysqldump incluye automticamente una sentencia en la salida del comando para establecer FOREIGN_KEY_CHECKS a 0. Esto evita problemas con tablas que tengan que ser creadas en un orden particular cuando se recarga el fichero de volcado. Tambin es posible establecer el valor de esta variable manualmente:
mysql> SET FOREIGN_KEY_CHECKS = 0; mysql> SOURCE dump_file_name; mysql> SET FOREIGN_KEY_CHECKS = 1;
Esto permite importar las tablas en cualquier orden si el fichero de volcado contiene tablas que no estn ordenadas segn lo requieran sus claves forneas. Tambin acelera la operacin de importacin. Establecer FOREIGN_KEY_CHECKS a 0 tambin puede ser til para ignorar restricciones de claves forneas durante operaciones LOAD DATA y ALTER TABLE. InnoDB no permite eliminar una tabla que est referenciada por una restriccin FOREIGN KEY, a menos que se ejecute SET FOREIGN_KEY_CHECKS=0. Cuando se elimina una tabla, las restricciones que fueron definidas en su sentencia de creacin tambin son eliminadas. Si se recrea una tabla que fue eliminada, debe ser definida de acuerdo a las restricciones de claves forneas que estn haciendo referencia a ella. Debe tener los tipos y nombres correctos de columnas, y debe tener ndices sobre las tablas referenciadas, como se estableci anteriormente. Si estas
784
condiciones no se cumplen, MySQL devuelve un error nmero 1005 y menciona el error nmero 150 en el mensaje de error.
Luego de reiniciar el servidor, InnoDB almacenar cada nueva tabla creada en su propio fichero nombre_tabla.ibd en el directorio de la base de datos a la que pertenece la tabla. Esto es similar a lo que hace el motor de almacenamiento MyISAM, pero MyISAM divide la tabla en un fichero de datos tbl_name.MYD y el fichero de ndice tbl_name.MYI. Para InnoDB, los datos y los ndices se almacenan juntos en el fichero .ibd. El fichero tbl_name.frm se sigue creando como es usual. Si se quita la lnea innodb_file_per_table de my.cnf y se reinicia el servidor, InnoDB crear nuevamente las tablas dentro de los ficheros del espacio de tablas compartido.
785
innodb_file_per_table afecta solamente la creacin de tablas. Si se inicia el servidor con esta opcin, las tablas nuevas se crearn empleando ficheros .ibd, pero an se puede acceder a las tablas existentes en el espacio de tablas compartido. Si se remueve la opcin, las nuevas tablas se crearn en el espacio compartido, pero an se podr acceder a las tablas creadas en espacios de tablas mltiples. InnoDB siempre necesita del espacio de tablas compartido. Los ficheros .ibd no son suficientes para que funcione InnoDB. El espacio de tablas compartido consiste de los ya conocidos ficheros ibdata, donde InnoDB coloca su diccionario de datos interno y los registros para deshacer cambios (undo logs). No se puede mover libremente ficheros .ibd entre directorios de bases de datos en la misma forma en que se hace con ficheros de tablas MyISAM. Esto se debe a que la definicin de las tablas se almacena en el espacio de tablas compartido de InnoDB, y tambin porque InnoDB debe preservar la consistencia de los identificadores de transacciones y los nmeros de secuencia de registros (log). Dentro de una determinada instalacin MySQL, se puede mover un fichero .ibd y las tablas asociadas de una base de datos a otra con la conocida sentencia RENAME TABLE:
RENAME TABLE nombre_bd_anterior.nombre_tabla TO nombre_bd_nuevo.nombre_tabla;
Si se tiene un respaldo limpio de un fichero .ibd, se lo puede restaurar dentro de la instalacin MySQL de donde proviene del siguiente modo: 1. Utilizando esta sentencia ALTER TABLE:
ALTER TABLE nombre_tabla DISCARD TABLESPACE;
Precaucin: Esto eliminar el actual fichero .ibd. 2. Colocando el fichero .ibd nuevamente en el directorio de la base de datos adecuada. 3. Utilizando esta sentencia ALTER TABLE:
ALTER TABLE nombre_tabla IMPORT TABLESPACE;
En este contexto, un respaldo limpio de un fichero .ibd significa: El fichero .ibd no contiene modificaciones realizadas por transacciones sin confirmar. No quedan entradas sin combinar en el buffer de inserciones en el fichero .ibd. Se han quitado todos los registros de ndice marcados para eliminacin en el fichero .ibd. mysqld ha descargado todas las pginas modificadas del fichero .ibd desde el buffer pool hacia el fichero. Se puede realizar un respaldo limpio del fichero .ibd con el siguiente mtodo: 1. Detener toda actividad del servidor mysqld y confirmar todas las transacciones. 2. Esperar hasta que SHOW INNODB STATUS indique que no hay transacciones activas en la base de datos, y el estado del subproceso (trhead) principal de InnoDB sea Waiting for server activity (Esperando por actividad del servidor). Entonces, se puede hacer una copia del fichero .ibd. Otro mtodo para hacer una copia limpia de un fichero .ibd es utilizar la herramienta comercial InnoDB Hot Backup: 1. Utilizar InnoDB Hot Backup para respaldar la instalacin InnoDB. 2. Iniciar un segundo servidor mysqld sobre el respaldo y permitirle limpiar los ficheros .ibd del mismo.
786
Figura en la lista de pendientes (TODO) para permitir mover ficheros .ibd limpios a otra instalacin MySQL. Esto necesita que se inicialicen los IDs (identificadores) de transacciones y los nmeros de secuencia de registros (log) en el fichero .ibd.
Suponiendo que este fichero de datos, a lo largo del tiempo, ha crecido hasta 988MB, debajo se ve la lnea de configuracin luego de agregar otro fichero de datos autoextensible.
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend
Cuando se agrega un nuevo fichero al espacio de tablas, hay que asegurarse de que no exista. InnoDB crea e inicializa el fichero al reiniciar el servidor. Actualmente no es posible quitar un fichero de datos del espacio de tablas. Para reducir el tamao del espacio de tablas, emplear este procedimiento: 1. Utilizar mysqldump para hacer un volcado de todas las tablas InnoDB. 2. Detener el servidor. 3. Eliminar todos los ficheros existentes del espacio de tablas. 4. Configurar un nuevo espacio de tablas. 5. Reiniciar el servidor. 6. Importar el fichero de volcado de tablas. Si se desea modificar la cantidad o tamao de los ficheros de registro (log) de InnoDB, se debe detener el servidor MySQL y asegurarse de que se cerr sin errores. Luego, copiar los ficheros de registro antiguos en un lugar seguro, slo para el caso de que algo haya fallado en el cierre del servidor y se necesite recuperar el espacio de tablas. Eliminar los antiguos ficheros de registro del directorio de ficheros de registro, editar my.cnf para modificar la configuracin de los ficheros de registro, e iniciar nuevamente el servidor MySQL. mysqld ver al iniciar que no hay ficheros de registro e informar que est creando nuevos.
787
15.8. Hacer una copia de seguridad y recuperar una base de datos InnoDB
La clave de una administracin de bases de datos segura es realizar copias de respaldo regularmente. InnoDB Hot Backup es una herramienta de respaldo en lnea que puede utilizarse para respaldar la base de datos InnoDB mientras sta se est ejecutando. InnoDB Hot Backup no necesita que se detenga la base de datos y no establece ningn bloqueo ni dificulta el normal procesamiento de la base de datos. InnoDB Hot Backup es una herramienta adicional comercial (no grautita) cuyo cargo anual de licencia es de 390 por cada ordenador en el que se ejecute el servidor MySQL. Consulte la pgina de Internet de InnoDB Hot Backup para obtener informacin detallada y ver capturas de pantallas. Si se est en condiciones de detener el servidor MySQL, puede realizarse una copia de respaldo binaria, que consiste en todos los ficheros usados por InnoDB para administrar sus tablas. Se utiliza el siguiente procedimiento: 1. Detener el servidor MySQL y asegurarse de que lo hace sin errores. 2. Copiar todos los ficheros de datos (ficheros ibdata e .ibd) en un lugar seguro. 3. Copiar todos los ficheros ib_logfile en un lugar seguro. 4. Copiar el o los ficheros de configuracin my.cnf en un lugar seguro. 5. Copiar todos los ficheros .frm de las tablas InnoDB en un lugar seguro. La replicacin funciona con tablas InnoDB, de forma que puede emplearse para mantener una copia de la base de datos en sitios de bases de datos que necesiten alta disponibilidad. Adicionalmente a la realizacin de copias de respaldo binarias como se ha descripto, tambin se deberan realizar regularmente volcados de las tablas con mysqldump. El motivo de esto es que un fichero binario podra corromperse sin que el usuario lo note. El volcado de las tablas se almacena en ficheros de texto que son legibles por los seres humanos, facilitando la localizacin de corrupcin en las tablas. Adems, puesto que el formato es ms simple, las probabilidades de una corrupcin seria de datos son menores. mysqldump tambin tiene una opcin --single-transaction que puede usarse para capturar una imagen consistente de la base de datos sin bloquear otros clientes. Para estar en condiciones de recuperar una base de datos InnoDB a partir del respaldo binario descripto anteriormente, se debe ejecutar el servidor MySQL con el registro binario (binary logging) activo. Entonces se puede aplicar el log binario al respaldo de la base de datos para lograr la recuperacin a una fecha y hora determinadas:
mysqlbinlog nombre_de_host-bin.123 | mysql
Para recuperarse de una caida del servidor, slo se requiere reiniciarlo. InnoDB verifica automticamente los registros (logs) y ejecuta una recuperacin de la base de datos del tipo roll-forward, es decir, hasta el momento anterior a la falla. InnoDB revierte automticamente las transacciones no grabadas que existan al momento de la cada. Durante la recuperacin, mysqld muestra informacin parecida a esta:
InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: ... InnoDB: InnoDB: InnoDB: 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
788
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 la base de datos se corrompe o falla el disco, habr que efectuar la recuperacin desde una copia de respaldo. En el caso de corrupcin, primero habra que encontrar una copa de respaldo realizada antes de la corrupcin. Luego de restaurar la copia de respaldo base, debe realizarse la recuperacin a partir de los ficheros de registro binario. En algunos casos de corrupcin de base de datos es suficiente con volcar, eliminar, y volver a crear una o unas pocas tablas corruptas. Se puede emplear la sentencia SQL CHECK TABLE para verificar si una tabla est corrupta, aunque CHECK TABLE, naturalmente, no puede detectar cada posible clase de corrupcin. Se puede emplear innodb_tablespace_monitor para verificar la integridad de la gestin de espacio de ficheros dentro de los ficheros de espacio de tablas. En algunos casos, una aparente corrupcin de pgina de base de datos se debe en realidad a que el sistema operativo est corrompiendo su propio cache de ficheros, y los datos en el disco podran estar en buenas condiciones. Lo mejor es, antes que nada, intentar el reinicio del ordenador. Ello puede eliminar errores que dan la sensacin de tener corrupcin en la pgina de base de datos.
Debajo se listan los valores mayores a cero permitidos para innodb_force_recovery. Un nmero mayor incluye todas las precauciones de los nmeros por debajo. Si se logra hacer un volcado de tablas con un valor de a lo sumo 4, se puede estar relativamente seguro de que solamente se han perdido algunos datos en pginas individuales corruptas. Un valor de 6 es ms dramtico, porque las pginas de base de datos han quedado obsoletas, lo que a su vez puede introducir ms corrupcin en B-trees y otras estructuras de bases de datos. 1 (SRV_FORCE_IGNORE_CORRUPT) Le permite al servidor ejecutarse an si detecta una pgina corrupta; intenta hacer que SELECT * FROM tbl_name salte sobre los registros de ndice y pginas corruptos, lo cual es de ayuda en el volcado de las tablas. 2 (SRV_FORCE_NO_BACKGROUND) Impide que se ejecute el subproceso (thread) principal. Si durante la operacin de descarga (purge) ocurriese una caida, esto la previene. 3 (SRV_FORCE_NO_TRX_UNDO) No revierte transacciones luego de la recuperacin. 4 (SRV_FORCE_NO_IBUF_MERGE)
789
Marcadores
Tambin evita las operaciones de combinacin del buffer de inserciones. Si ello pudiese causar una caida, es mejor no hacerlo; no calcula estadsticas de tablas. 5 (SRV_FORCE_NO_UNDO_LOG_SCAN) No tiene en cuenta el contenido de los registros para revertir cambios (undo logs) al iniciar la base de datos: InnoDB considera como confirmadas inclusive a las transacciones incompletas. 6 (SRV_FORCE_NO_LOG_REDO) Omite la creacin del registro (log) que permite la recuperacin de tipo roll-forward. En otro caso la base de datos no debe emplearse con ninguna de estas opciones habilitadas. Como una medida de seguridad, InnoDB impide que los usuarios lleven a cabo operaciones INSERT, UPDATE, o DELETE cuando innodb_force_recovery est configurado en un valor mayor a 0. Se pueden ejecutar sentencias DROP y CREATE para eliminar y crear tablas incluso cuando se est empleando la recuperacin forzada. Si se sabe que una determinada tabla est provocando cadas al hacer una cancelacin (rollback), se la puede eliminar. Tambin puede utilizarse para detener una cancelacin fuera de control causada por una importacin o un ALTER TABLE en masa. Se puede interrumpir el proceso mysqld y establecer innodb_force_recovery a un valor de 3 para poner a funcionar la base de datos sin que ejecute cancelacin (rollback), luego emplear DROP para eliminar la tabla que est causando la cancelacin fuera de control.
15.8.2. Marcadores
InnoDB implementa un mecanismo de puntos de verificacin llamado fuzzy checkpoint (punto de verificacin difuso). InnoDB descarga las pginas modificadas de la base de datos desde el pool de buffers en lotes pequeos. No es necesario descargar al disco el pool de buffers en una sola accin, lo cual en la prctica podra detener temporalmente el procesamiento de sentencias SQL del usuario. Durante la recuperacin de cadas, InnoDB busca un marcador de checkpoint escrito en los ficheros de registro (log). Ya sabe que todas las modificaciones a la base de datos anteriores al marcador estn presentes en la imagen en disco de la misma. Entonces InnoDB recorre los ficheros de registro (log) desde el checkpoint hacia adelante, aplicando sobre la base de datos las modificaciones registradas. InnoDB escribe en los ficheros de registro en una forma rotativa. Todas las modificaciones confirmadas que hagan a las pginas de la base de datos en el pool de buffers diferentes de las grabadas en disco deben estar disponibles en los ficheros de registro en caso de que InnoDB tenga que hacer una recuperacin. Esto significa que cuando InnoDB comienza a reutilizar un fichero de registro, tiene que asegurarse de que las imgenes en disco de las pginas de base de datos contienen las modificaciones asentadas en el fichero de registro que se va a reutilizar. En otras palabras, InnoDB debe crear un punto de verificacin (checkpoint) y esto a menudo implica la descarga a disco de las pginas de base de datos modificadas. La descripcin anterior explica porqu hacer los ficheros de registro muy grandes puede ahorrar operaciones de E/S en disco destinadas a la creacin de puntos de verificacin. A menudo se hace hincapi en establecer el tamao total de los ficheros de registro en lo mismo que el pool de buffers o an ms grande. La desventaja que tienen los ficheros de registro grandes es que la recuperacin ante una cada puede tomar ms tiempo debido a que hay ms informacin que debe aplicarse a la base de datos.
790
[mysqld] lower_case_table_names=1
Al igual que los ficheros de datos MyISAM, los ficheros de datos y de registro (log) de InnoDB son compatibles a nivel binario en todas las plataformas que tengan el mismo formato de nmeros de coma flotante. Se puede mover una base de datos InnoDB simplemente copiando todos los ficheros relevantes que se listan en Seccin 15.8, Hacer una copia de seguridad y recuperar una base de datos InnoDB. Si los formatos de nmero de coma flotante difieren pero no se han empleado tipos de datos FLOAT o DOUBLE en las tablas, el procedimiento es el mismo: copiar los ficheros necesarios. Si los formatos difieren y las tablas contienen datos de coma flotante, se deber emplear mysqldump para volcar las tablas en un ordenador e importar los ficheros de volcado en otro. Una forma de incrementar el rendimiento es desactivar el modo autocommit (ejecucin automtica) al importar datos, asumiendo que el espacio de tablas tiene suficiente sitio para el extenso segmento de cancelacin (rollback) que generar la importacin de transacciones. La confirmacin (commit) se har luego de importar una tabla entera o un segmento de una tabla.
791
InnoDB y AUTOCOMMIT
Luego, el protocolo de bloqueo de intencin es el siguiente: Antes de que de una determinada transaccin logre un bloqueo S en una determinada fila, primero debe conseguir establecer un bloqueo IS o superior en la tabla que contiene a la fila. Antes de que de una determinada transaccin logre un bloqueo X en una determinada fila, primero debe conseguir establecer un bloqueo IX en la tabla que contiene a la fila. Estas reglas pueden resumirse convenientemente por medio de una matriz de compatibilidad entre tipos de bloqueo: X X IX S IS N N N N S IX N S S S S S N N S S S IS N S S S S S S S S S
Por lo tanto, los bloqueos de intencin solamente bloquean solicitudes sobre tablas completas (Ej: LOCK TABLES ... WRITE). El propsito principal de IX y IS es mostrar que alguien est bloqueando una fila, o va a bloquear una fila en la tabla.
Un usuario puede cambiar el nivel de aislamiento de una sesin individual o de todas las nuevas conexiones con la sentencia SET TRANSACTION. Su sintaxis es la siguiente:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
792
Ntese que se usan guiones en los nombres de niveles de la opcin --transaction-isolation, pero no en la sentencia SET TRANSACTION. El comportamiento predeterminado es establecer el nivel de aislamiento a partir de la prxima transaccin que se inicie. Si se emplea la palabra clave GLOBAL, la sentencia establece el nivel predeterminado de la transaccin globalmente para todas las nuevas conexiones creadas a partir de ese punto (pero no en las existentes). Se necesita el privilegio SUPER para hacer esto. Utilizando la palabra clave SESSION se establece el nivel de transaccin para todas las futuras transacciones ejecutadas en la actual conexin. Cualquier cliente es libre de cambiar el nivel de aislamiento de la sesin (incluso en medio de una transaccin), o el nivel de aislamiento para la prxima transaccin. Los niveles de aislamiento de transacciones globales y de sesin pueden consultarse con estas sentencias:
SELECT @@global.tx_isolation; SELECT @@tx_isolation;
En el bloqueo a nivel de fila, InnoDB emplea bloqueo de clave siguiente (next-key). Esto significa que, adems de registros de ndice, InnoDB tambin puede bloquear el vaco que precede a un registro de ndice para bloquear inserciones de otros usuarios inmediatamente antes del registro de ndice. Un bloqueo de clave siguiente hace referencia a bloquear un registro de ndice y la posicin vaca antes de l. Bloquear una posicin vaca es establecer un bloqueo que acta solamente sobre el vaco anterior a un registro de ndice. A continuacin una descripcin detallada de cada nivel de aislamiento en InnoDB: READ UNCOMMITTED Las sentencias SELECT son ejecutadas sin realizar bloqueos, pero podra usarse una versin anterior de un registro. Por lo tanto, las lecturas no son consistentes al usar este nivel de aislamiento. Esto tambin se denomina lectura sucia (dirty read). En otro caso, este nivel de aislamiento funciona igual que READ COMMITTED. READ COMMITTED Similar en parte al mismo nivel de aislamiento de Oracle. Todas las sentencias SELECT ... FOR UPDATE y SELECT ... LOCK IN SHARE MODE bloquean solamente los registros de ndice, no los espacios vacos que los preceden, por lo tanto se permite la libre insercin de nuevos registros junto a los bloqueados. Las sentencias UPDATE and DELETE que empleen un ndice nico con una condicin de bsqueda nica bloquean solamente el registro de ndice hallado, no el espacio que lo precede. En las sentencias UPDATE y DELETE que actan sobre rangos de registros, InnoDB debe bloquear los espacios vacos y bloquear las inserciones de otros usuarios en los espacios vacos que hay dentro del rango. Esto es necesario debido a que las filas fantasma deben ser bloqueadas para que funcionen la replicacin y recuperacin en MySQL. Las lecturas consistentes se comportan como en Oracle: Cada lectura consistente, incluso dentro de la misma transaccin, establece y lee su propia captura tomada de la base de datos. Consulte Seccin 15.10.4, Lecturas consistentes que no bloquean. REPEATABLE READ Este es el nivel de aislamiento predeterminado de InnoDB. Las sentencias SELECT ... FOR UPDATE, SELECT ... LOCK IN SHARE MODE, UPDATE, y DELETE que utilicen un ndice nico con una condicin de bsqueda nica, bloquean solamente el registro de ndice hallado, no el espacio vaco que lo precede. Con otras condiciones de bsqueda, estas operaciones emplean bloqueo de clave siguiente (next-key), bloqueando el rango de ndice cubierto por la operacin incluyendo los espacios vacos, y bloqueando las nuevas inserciones por parte de otros usuarios. En lecturas consistentes (consistent reads), hay una importante diferencia con respecto al nivel de aislamiento anterior: En este nivel, todas las lecturas consistentes dentro de la misma transaccin
793
leen de la captura de la base de datos tomada por la primer lectura. Esta prctica significa que si se emiten varias sentencias SELECT dentro de la misma transaccin, stas sern consistentes unas con otras. Consulte Seccin 15.10.4, Lecturas consistentes que no bloquean. SERIALIZABLE Este nivel es similar a REPEATABLE READ, pero todas las sentencias SELECT son convertidas implcitamente a SELECT ... LOCK IN SHARE MODE.
15.10.5. Bloquear lecturas SELECT ... FOR UPDATE y SELECT ... LOCK IN SHARE MODE
En ciertas circunstancias, no es conveniente una lectura consistente. Por ejemplo, se podra desear agregar una fila en la tabla hijo, y estar seguro de que dicha fila tiene una fila padre en la tabla padre. El siguiente ejemplo muestra cmo implementar integridad referencial en el cdigo de la aplicacin. Suponiendo que se utiliza una lectura consistente para leer la tabla padre y efectivamente puede verse el registro padre para la fila hijo que se agregar, puede agregarse en forma segura la fila hijo dentro de la tabla hijo? No, porque puede haber ocurrido que entretanto otro usuario haya borrado el registro padre de la tabla padre, sin que se tenga conocimiento de ello. La solucin es llevar a cabo el SELECT en un modo con bloqueo, utilizando LOCK IN SHARE MODE:
SELECT * FROM parent WHERE NAME = 'Jones' LOCK IN SHARE MODE;
Realizar una lectura en modo compartido (share mode) significa que se leen los ltimos datos disponibles, y se establece un bloqueo en modo compartido en los registros que se leen. Un bloqueo en modo compartido evita que otros actualicen o eliminen la fila que se ha leido. Adems, si los datos ms actualizados pertenecen a una transaccin todava no confirmada de otra conexin, se espera hasta que la transaccin se confirme. Luego de ver que la mencionada consulta devuelve el registro padre 'Jones', se puede agregar con seguridad el registro hijo en la tabla hijo y confirmar la transaccin. Otro ejemplo: se tiene un campo contador, entero, en una tabla llamada child_codes que se emplea para asignar un identificador nico a cada registro hijo agregado a la tabla hijo. Obviamente, utilizar una lectura consistente o una lectura en modo compartido para leer el valor actual del contador no es una buena idea, puesto que dos usuarios de la base de datos pueden ver el mismo valor del contador, y agregar registros hijos con el mismo identificador, lo cual generara un error de clave duplicada. En este caso, LOCK IN SHARE MODE no es una buena solucin porque si dos usuarios leen el contador al mismo tiempo, al menos uno terminar en un deadlock cuando intente actualizar el contador.
794
En este caso, hay dos buenas formas de implementar la lectura e incremento del contador: (1), actualizar el contador en un incremento de 1 y slo despus leerlo, o (2) leer primero el contador estableciendo un bloqueo FOR UPDATE, e incrementndolo luego. La ltima puede ser implementada como sigue:
SELECT counter_field FROM child_codes FOR UPDATE; UPDATE child_codes SET counter_field = counter_field + 1;
Una sentencia SELECT ... FOR UPDATE lee el dato ms actualizado disponible, estableciendo bloqueos exclusivos sobre cada fila leda. Es decir, el mismo bloqueo que hara UPDATE. Ntese que el anterior es un sencillo ejemplo de cmo funciona SELECT ... FOR UPDATE. En MySQL, la tarea especfica para generar un identificador nico en realidad puede realizarse utilizando un slo acceso a la tabla:
UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field + 1); SELECT LAST_INSERT_ID();
La sentencia SELECT simplemente recupera la informacin del identificador (relativa a la conexin actual). No accede ninguna tabla.
Suponiendo que hay un ndice sobre la columna id, la consulta recorre ese ndice comenzando por el primer registro donde id es mayor a 100. Si el bloqueo establecido sobre el ndice no bloqueara tambin las inserciones hechas en las posiciones vacas, durante el proceso se podra insertar una nueva fila en la tabla. Si se ejecuta la misma sentencia SELECT dentro de la misma transaccin, se podra ver una nueva fila en el conjunto de resultados devuelto por la consulta. Esto es contrario al principio de aislamiento de las transacciones: una transaccin deberia ejecutarse de forma que los datos que ha leido no cambien en el transcurso de la misma. Si se considera un conjunto de columnas como datos, el nuevo registro hijo fantasma violara el principio de aislamiento. Cuando InnoDB recorre un ndice, tambin puede bloquear la posicin vaca despus del ltimo registro del ndice. Es precisamente lo que ocurre en el ejemplo anterior: Los bloqueos impuestos por InnoDB evitan cualquier insercin en la tabla donde id fuera mayor de 100. Se puede emplear bloqueo de prxima clave para efectuar el control de la unicidad en una aplicacin: Si se leen los datos en modo compartido y no se ve un duplicado de la fila que se va a insertar, entonces puede hacerse con la seguridad de que el bloqueo de prxima clave establecido sobre el registro que contina a la fila insertada evita que cualquiera inserte un duplicado de sta. Por lo tanto, el bloqueo de prxima clave permite bloquear la no existencia de algo en la tabla.
795
a la transaccin un punto en el tiempo (timepoint) del momento en que se realiz la consulta. Si otra transaccin elimina una fila y confirma la accin en un momento posterior a dicho punto, no se ver la fila como borrada. Las inserciones y actualizaciones se tratan del mismo modo. Se puede obtener un timepoint ms reciente confirmando la transaccin actual y emitiendo un nuevo SELECT. Esto se llama control de concurrencia multiversin.
Usuario A SET AUTOCOMMIT=0; tiempo | | | | v SELECT * FROM t; empty set INSERT INTO t VALUES (1, 2); SELECT * FROM t; empty set COMMIT; SELECT * FROM t; empty set COMMIT; SELECT * FROM t; --------------------| 1 | 2 | --------------------1 row in set Usuario B SET AUTOCOMMIT=0;
En este ejemplo, el usuario A podr ver la fila insertada por B solamente cuando B haya confirmado la insercin y A haya confirmado tambin, de modo que su timepoint avance e incluya la insercin confirmada por B. Si se desea ver el ms reciente estado de la base de datos, se debera emplear ya sea el nivel de aislamiento READ COMMITTED o bien una lectura con bloqueo:
SELECT * FROM t LOCK IN SHARE MODE;
796
SELECT ... FROM ... FOR UPDATE establece bloqueos exclusivos de prxima clave en todos los registros de ndice hallados por la lectura. INSERT INTO ... VALUES (...) establece un bloqueo exclusivo sobre la fila insertada. Ntese que no se trata de un bloqueo de prxima clave, y no evita que otros usuarios inserten registros en la posicin vaca precedente. Si ocurriese un error por duplicacin de claves, se establecer un bloqueo compartido sobre el registro de ndice duplicado. Mientras se inicializa una columna previamente declarada AUTO_INCREMENT, InnoDB establece un bloqueo exclusivo al final del ndice asociado con dicha columna. Al accederse al contador de autoincremento, InnoDB emplea una modo de bloqueo de tabla especfico llamado AUTO-INC, que dura solamente hasta el final de la actual consulta SQL, en lugar de existir hasta el final de la transaccin. Consulte Seccin 15.10.2, InnoDB y AUTOCOMMIT. En MySQL 5.0, InnoDB trae el valor de una columna previamente declarada AUTO_INCREMENT sin establecer ningn bloqueo. INSERT INTO T SELECT ... FROM S WHERE ... establece un bloqueo exclusivo (pero no de prxima clave) en cada fila insertada dentro de T. La bsqueda en S se hace como una lectura consistente, pero se establecen bloqueos compartidos de prxima clave en S si est activado el registro binario (binary logging) de MySQL. InnoDB tiene que establecer bloqueos en este ltimo caso: en una recuperacin de tipo roll-forward desde una copia de respaldo, cada semtencia SQL debe ser ejecutada en exactamente la misma manera en que se hizo originalmente. CREATE TABLE ... SELECT ... lleva a cabo el SELECT como una lectura consistente o con bloqueos compartidos, como en el punto anterior. REPLACE se ejecuta del mismo modo que una insercin si no hay colisiones con claves nicas. En otro caso, se coloca un bloqueo exclusivo de prxima clave en la fila que ser actualizada. UPDATE ... WHERE ... establece un bloqueo exclusivo de prxima clave sobre cada registro encontrado por la bsqueda. DELETE FROM ... WHERE ... establece un bloqueo exclusivo de prxima clave sobre cada registro encontrado por la bsqueda. Si se define una restriccin FOREIGN KEY sobre una tabla, cualquier insercin, actualizacin o eliminacin que necesite la verificacin de las condiciones impuestas por la restriccin establecer bloqueos compartidos a nivel de registro sobre los registros examinados durante la verificacin. InnoDB tambin establece estos bloqueos en el caso de que la verificacin falle. LOCK TABLES establece bloqueos de tabla, pero es la capa de MySQL de mayor nivel por debajo de la capa de InnoDB la que establece estos bloqueos. InnoDB tiene conocimiento de los bloqueos de tabla si se establecen innodb_table_locks=1 y AUTOCOMMIT=0, y la capa de MySQL por debajo de InnoDB sabe acerca de los bloqueos a nivel de fila. En otro caso, la deteccin automtica de deadlocks de InnoDB no puede detectar los deadlocks donde estn involucradas estas tablas. Adems, puesto que la capa superior de MySQL no sabe acerca de bloqueos a nivel de fila, es posible obtener un bloqueo de tabla sobre una tabla donde otro usuario ha colocado bloqueos a nivel de fila. Sin embargo, esto no pone en peligro la integridad de la transaccin, como se dice en Seccin 15.10.10, Deteccin de interbloqueos (deadlocks) y cancelacin de transacciones (rollbacks). Consulte tambin Seccin 15.16, Restricciones de las tablas InnoDB.
797
Si una sentencia SQL devuelve un error, la confirmacin o cancelacin dependen del error. Consulte Seccin 15.15, Tratamiento de errores de InnoDB. Las siguientes sentencias SQL (y sus sinnimos) provocan en MySQL una confirmacin implcita de la transaccin en curso: 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. Antes de MySQL 5.0.8, CREATE TABLE provocaba la confirmacin si se empleaba el registro binario (binary logging). A partir de MySQL 5.0.8, las sentencias CREATE TABLE, TRUNCATE TABLE, DROP DATABASE, y CREATE DATABASE provocan una confirmacin implcita. La sentencia CREATE TABLE en InnoDB se procesa como una transaccin individual. Esto significa que un ROLLBACK emitido por el usuario no cancelar las sentencias CREATE TABLE hechas durante una transaccin.
798
Si se estn usando lecturas que establecen bloqueos (SELECT ... FOR UPDATE o ... LOCK IN SHARE MODE), hay que intentar utilizar un nivel de aislamiento bajo, como READ COMMITTED. Acceder a las tablas y filas en un orden fijo. Entonces, las transacciones forman secuencias bien definidas y no originan deadlocks. Agregar a las tablas ndices adecuadamente elegidos. Entonces las consultas necesitarn examinar menos registros de ndice y en consecuencia establecern menos bloqueos. Utilizar EXPLAIN SELECT para determinar los ndices que MySQL considera ms apropiados para las consultas. Utilizar menos el bloqueo. Si es aceptable que SELECT devuelva datos de una captura de la base de datos que no sea la ms actualizada, no hay que agregarle las clusulas FOR UPDATE o LOCK IN SHARE MODE. En este caso es adecuado utilizar el nivel de aislamiento READ COMMITTED, porque cada lectura consistente dentro de la misma transaccin leer de su propia captura ms reciente. Si nada de esto ayuda, habr que serializar las transacciones con bloqueos a nivel de tabla. La forma correcta de emplear LOCK TABLES con tablas transaccionales, como InnoDB, es establecer AUTOCOMMIT = 0 y no invocar a UNLOCK TABLES hasta que se haya confirmado explcitamente la transaccin. Por ejemplo, si se necesitara escribir en una tabla t1 y leer desde una tabla t2, se puede hacer esto:
SET AUTOCOMMIT=0; LOCK TABLES t1 WRITE, t2 READ, ...; [aqu se hace algo con las tablas t1 y t2]; COMMIT; UNLOCK TABLES;
Los bloqueos a nivel de tabla favorecen el funcionamiento de la cola de transacciones, y evitan los deadlocks. Otra manera de serializar transacciones es crear una tabla semforo auxiliar que contenga slo una fila. Hay que hacer que cada transaccin actualice esa fila antes de acceder otras tablas. De ese modo, todas las transacciones se producirn en serie. Ntese que el algoritmo de deteccin instantnea de deadlocks de InnoDB tambin funciona en este caso, porque el bloqueo de serializacin es un bloqueo a nivel de fila. Con los bloqueos a nivel de tabla de MySQL, debe emplearse el mtodo de timeout para solucionar deadlocks. En aquellas aplicaciones que emplean el comando de MySQL LOCK TABLES, MySQL no establece bloqueos de tabla si AUTOCOMMIT=1.
799
contenidos modificados desde el pool de buffer al disco en un punto de verificacin. Los ficheros de log pequeos pueden causar escrituras en disco innecesarias. La desventaja de los ficheros de log grandes es que la recuperacin demanda ms tiempo. Tambin el buffer del log debe ser suficientemente grande (en el orden de los 8MB). Emplear el tipo de columna VARCHAR en lugar de CHAR si se almacenarn cadenas de longitud variable o si la columna contendr muchos valores NULL. Una columna CHAR(N) siempre utiliza N bytes para almacenar los datos, inclusive si la cadena es ms corta o es NULL. Las tablas ms pequeas aprovechan mejor el espacio del pool de buffer y reducen las operaciones de E/S en disco. Cuando se utiliza row_format=compact (el formato de registro predeterminado para InnoDB en MySQL 5.0) y un conjunto de caracteres de longitud variable como utf8 o sjis, CHAR(N) ocupar una cantidad variable de espacio, con un mnimo de N bytes. En algunas versiones de GNU/Linux y Unix, descargar ficheros a disco con la funcin de Unix fsync() (la cual es utilizada en forma predeterminada por InnoDB) y otros mtodos similares, es sorprendentemente lento. Si no se est satisfecho con el rendimiento de las operaciones de escritura de la base de datos, se puede intentar establecer el valor de innodb_flush_method en my.cnf a O_DSYNC, si bien O_DSYNC parece ser ms lento en otros sistemas. Durante el empleo del motor de almacenamiento InnoDB en arquitecturas Solaris 10 para x86_64 (AMD Opteron), es importante usar la opcin forcedirectio al montar cualquier sistema de ficheros usado para almacenar los ficheros relacionados con InnoDB (el comportamiento predeterminado en Solaris 10/x86_64 es no utilizar esta opcin al montar el sistema de ficheros). Si no se utiliza forcedirectio se producir una seria degradacin en la velocidad y rendimiento de InnoDB en esta plataforma. Al importar datos dentro de InnoDB, hay que asegurarse de que MySQL no tiene habilitado el modo de ejecucin automtica (autocommit) porque provocara una descarga del log a disco en cada insercin. Para desactivar la ejecucin automtica durante la operacin de importacin, hay que encerrarla entre sentencias SET AUTOCOMMIT y COMMIT:
SET AUTOCOMMIT=0; /* Sentencias de importacin SQL ... */ COMMIT;
Si se utiliza la opcin --opt con mysqldump, se obtienen ficheros de voclado que son rpidos de importar en una tabla InnoDB, incluso sin encerrarlos en las sentencias SET AUTOCOMMIT y COMMIT. Tener cuidado con las cancelaciones de inserciones masivas: InnoDB emplea el buffer de inserciones para reducir la cantidad de operaciones de E/S en disco durante las inserciones, pero ese mecanismo no tiene efecto en la cancelacin. Una cancelacin efectuada directamente sobre el disco puede tomar 30 veces el tiempo que insumen las correspondientes inserciones. Matar el proceso del servidor de bases de datos no es de ayuda, porque la cancelacin recomienza al volver a iniciar el servidor. La nica forma de librarse de una cancelacin fuera de control es incrementar el tamao del pool de buffer para que la cancelacin se haga sobre la CPU y se ejecute ms rpidamente, o utilizar un procedimiento especial. Consulte Seccin 15.8.1, Forzar una recuperacin. Tambin hay que tener cuidado con las operaciones de gran tamao realizadas directamente sobre el disco. Hay que emplear DROP TABLE y CREATE TABLE para obtener una tabla vaca, no DELETE FROM tbl_name. Emplear la sintaxis de mltiples filas de INSERT para reducir la carga extra de la comunicacin entre el cliente y el servidor si se necesita insertar muchos registros:
INSERT INTO yourtable VALUES (1,2), (5,5), ...;
Esta sugerencia es vlida para las inserciones en cualquier tipo de tabla, no solamente en InnoDB.
800
Si se tienen restricciones UNIQUE en claves secundarias, se puede acelerar la importacin desactivando temporalmente, durante la importacin, la verificacin de tales restricciones:
SET UNIQUE_CHECKS=0;
En tablas grandes, esto ahorra una gran cantidad de operaciones de E/S en disco debido a que InnoDB puede emplear su buffer de insercin para escribir de una vez los registros de indice secundarios. Si se tienen restricciones FOREIGN KEY en las tablas, se puede acelerar la importacin desactivando la verificacin de claves forneas durante la misma:
SET FOREIGN_KEY_CHECKS=0;
Para tablas grandes, esto puede ahorrar gran cantidad de operaciones sobre el disco. Si a menudo se realizan consultas sobre tablas que no se actualizan con frecuencia, utilizar el cache de consultas:
[mysqld] query_cache_type = ON query_cache_size = 10M
Otra forma de emplear los Monitores InnoDB es permitirles escribir datos contnuamente en la salida estndar del servidor mysqld. En este caso, no se enva la salida a los clientes. Cuando se activa, los Monitores InnoDB imprimen datos aproximadamente cada 15 segundos. La salida del servidor normalmente se dirige a un fichero .err en el directorio de datos de MySQL. Estos datos son tiles para ajustes de rendimiento. En Windows, se debe iniciar el servidor desde la linea de comandos de una ventana de consola con la opcin --console si se desea dirigir la salida a la ventana en lugar de usar para ello el registro de errores. La salida del Monitor incluye informacin de los siguientes tipos: Tablas y bloqueos de registros en uso por cada transaccin activa. Esperas de transacciones debidas a bloqueos. Esperas de subprocesos debidas a semforos. Solicitudes de E/S de ficheros pendientes. Estadsticas del pool de buffer. Actividad de descarga y mezcla del buffer de inserciones del subproceso principal de InnoDB. Para que el Monitor estndar InnoDB escriba en la salida estndar de mysqld, se debe emplear la siguiente sentencia SQL:
CREATE TABLE innodb_monitor(a INT) ENGINE=INNODB;
801
La sintaxis de CREATE TABLE es solamente una forma de pasar un comando al motor InnoDB a travs del intrprete SQL de MySQL: Lo nico importante aqu es que la tabla se llame innodb_monitor y que sea una tabla InnoDB. La estructura de la tabla no es relevante para el MonitorInnoDB. si se apaga el servidor mientras el monitor se est ejecutando, y se desea iniciar el monitor nuevamente, se debe eliminar la tabla antes de emitir una nueva sentencia CREATE TABLE para iniciar el monitor. Esta sintaxis puede cambiar en una entrega futura de MySQL. De la misma forma se puede emplear innodb_lock_monitor. Esto es lo mismo que innodb_monitor, con la excepcin de que tambin proporciona abundante informacin sobre bloqueos. Un innodb_tablespace_monitor separado imprime una lista de los segmentos de ficheros creados existentes en el espacio de tablas y valida las estructuras de datos de asignacin del espacio de tablas. Adicionalmente, hay un innodb_table_monitor con el que se pueden imprimir los contenidos del diccionario de datos interno de InnoDB. Un ejemplo de la salida del Monitor 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
802
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 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
803
-------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) 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)
Algunas notas acerca de la salida: Si la seccin TRANSACTIONS informa sobre esperas por bloqueo, la aplicacin puede tener conflictos causados por bloqueos. La salida tambin puede ayudar a determinar las razones de interbloqueos en transacciones. La seccion SEMAPHORES informa sobre esperas de subprocesos debidas a semforos y brinda estadsticas de cuntas veces los subprocesos han debido esperar por un mutex o un semforo rw-lock. Una gran cantidad de subprocesos esperando por semforos puede ser el resultado de operaciones de E/S en disco, o conflictos dentro de InnoDB. Los conflictos pueden deberse a un intenso paralelismo en las consultas, o problemas en la planificacin de subprocesos del sistema operativo. En tales situaciones puede ser de ayuda establecer innodb_thread_concurrency en un valor ms bajo. La seccin BUFFER POOL AND MEMORY proporciona estadsticas sobre las pginas ledas y escritas. A partir de estas cifras se puede calcular cuntas operaciones de E/S sobre ficheros de datos estn realizando actualmente las consultas emitidas. La seccin ROW OPERATIONS muestra lo que est haciendo el subproceso principal.
804
Implementacin de multiversin
InnoDB enva su salida de diagnstico a stderr o a ficheros en lugar de a stdout o a buffers de memoria de tamao fijo, para evitar potenciales desbordamientos de buffer. Como efecto secundario, la salida de SHOW INNODB STATUS se escribe cada quince segundos en un fichero de estado. El nombre de este fichero es innodb_status.pid, donde pid es el ID del proceso del servidor. Este fichero se crea en el directorio de datos de MySQL. InnoDB borra el fichero durante un apagado normal del servidor. Si se producen cadas o terminaciones anormales del servidor, pueden quedar copias de estos ficheros que debern ser eliminadas manualmente. Antes de eliminarlas, se las podra examinar para ver si contienen informacin til relativa a la causa de las cadas. En MySQL 5.0, innodb_status.pid solamente se crea si se establece la opcin de configuracin innodb_status_file=1.
805
recursos al subproceso de depuracin. La opcin de inicio (y tambin variable global configurable) innodb_max_purge_lag existe precisamente para este propsito. Consulte Seccin 15.4, Opciones de arranque de InnoDB para ms informacin.
806
Por el otro lado, los ndices secundarios generalmente no son nicos, y las inserciones en los mismos ocurren en un orden relativamente aleatorio. Esto podra ocasionar gran cantidad de operaciones de E/S en disco, de no ser por un mecanismo especial utilizado en InnoDB. Si una entrada de ndice debiera insertarse en un ndice secundario no nico, InnoDB verifica si la pgina del ndice secundario se encuentra en el pool de buffer. Si ese es el caso, InnoDB realizar la insercin directamente en la pgina de ndice. Si dicha pgina no se encuentra en el pool de buffer, InnoDB insertar la entrada en una estructura de buffer de inserciones especial. El buffer de inserciones se mantiene tan pequeo que cabe completamente en el pool de buffer, y las inserciones pueden hacerse muy rpidamente. Peridicamente, el buffer de inserciones se integra a los rboles de ndices secundarios de la base de datos. A menudo es posible integrar varias inserciones en la misma pgina del rbol de ndices, ahorrando operaciones de E/S en disco. Se ha comprobado que el buffer de inserciones puede acelerar hasta 15 veces las inserciones en una tabla. La integracin del buffer de inserciones puede continuar luego de que la transaccin que realiza la insercin ha sido confirmada. De hecho, puede continuar despues de que el servidor ha sido detenido y vuelto a iniciar (consulte Seccin 15.8.1, Forzar una recuperacin). La integracin del buffer de inserciones puede tomar muchas horas, cuando hay varios ndices secundarios para actualizar y gran cantidad de filas insertadas. Durante este tiempo, las operaciones de E/S en disco se incrementan, lo cual puede lentificar significativamente las consultas sobre el disco. Otra operacin de E/S de importancia que se produce en segundo plano es el subproceso de depuracin (Consulte Seccin 15.12, Implementacin de multiversin).
807
Un registro contiene adems un puntero a cada campo del mismo. Si la longitud total de los campos en un registro es menos de 128 bytes, el puntero medir un byte, de lo contrario, tendr dos bytes de longitud. La matriz de estos punteros se conoce como el directorio de registros. El rea a donde sealan estos punteros se denomina la parte de datos del registro. Internamente, InnoDB almacena las columnas de caracteres de longitud fija (como CHAR(10)) en un formato de longitud fija. InnoDB trunca los espacios sobrantes de las columnas VARCHAR. Ntese que MySQL puede convertir internamente columnas CHAR a VARCHAR. Consulte Seccin 13.1.5.1, Cambios tcitos en la especificacin de columnas. Un valor NULL SQL reserva 1 o 2 bytes en el directorio de registros. No reservar ningn byte en la parte de datos del registro si se lo almacena en una columna de longitud variable. En una columna de longitud fija, reservar en la parte de datos la longitud asignada a dicha columna. La razn por la que se reserva este espacio fijo a pesar de tratarse de un valor NULL, es que en el futuro se podr insertar en su lugar un valor no-NULL sin provocar la fragmentacin de la pgina de ndice.
808
innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:2Gnewraw
La prxima vez que se inicie el servidor, InnoDB advertir la palabra clave newraw e inicializar la nueva particin. Sin embargo, an no crear ni modificar ninguna tabla InnoDB. De lo contrario, la prxima vez que se reiniciase el servidor, InnoDB reinicializara la particin y los cambios se perderan. (A partir de la versin 3.23.44, como medida de seguridad, InnoDB impide que los usuarios modifiquen datos cuando se especifica una particin con newraw.) Despus que InnoDB ha inicializado la nueva particin, hay que detener el servidor y cambiar newraw por raw en la linea que especifica el fichero de datos:
[mysqld] innodb_data_home_dir= innodb_data_file_path=/dev/hdd1:5Graw;/dev/hdd2:2Graw
Luego, al reiniciar el servidor InnoDB permitir realizar cambios. En Windows puede asignarse una particin de disco como fichero de datos de este modo:
[mysqld] innodb_data_home_dir= innodb_data_file_path=//./D::10Gnewraw
Los caracteres //./ se corresponden con la sintaxis Windows de \\.\ para acceder dispositivos fsicos. Al emplear particiones de dispositivos en bruto, hay que cerciorarse de que la cuenta de usuario usada para ejecutar el servidor MySQL tiene permisos de lectura y escritura sobre ellas.
809
tablas, de forma que el espacio desocupado quede disponible para otros usuarios. Eliminar una tabla, o todas las filas que contiene, seguramente servir para liberar el espacio, pero no hay que olvidar que las filas eliminadas solamente desaparecen fsicamente cuando dejan de ser necesarias para cancelar transacciones o de integrar lecturas consistentes.
toma ms tiempo del que debera. (En la consulta anterior, se ha engaado al optimizador SQL para que examine el ndice agrupado, no un ndice secundario). La mayora de los discos pueden leer entre 10 y 50 MB por segundo. Esto puede usarse para estimar la velocidad con que debera examinarse una tabla. Se puede acelerar el examen de los ndices si peridicamente se lleva a cabo una operacin ALTER TABLE neutra:
ALTER TABLE tbl_name ENGINE=INNODB
Esto provoca que MySQL reconstruya la tabla. Otra forma de ejecutar una desfragmentacin es emplear mysqldump para obtener un volcado de la tabla en un fichero de texto, eliminar la tabla, y volver a crearla a partir del fichero de volcado. Si las inserciones en un ndice se producen siempre en orden ascendente y los registros se eliminan solamente desde el final, el algoritmo de gestin de espacio en fichero que tiene InnoDB garantiza que no se produzca la fragmentacin del ndice.
810
811
5 (EIO) Error de E/S 6 (ENXIO) No existe el dispositivo o direccin 7 (E2BIG) Lista de argumentos demasiado extensa 8 (ENOEXEC) Eror de formato ejecutable 9 (EBADF) Nmero de fichero errneo 10 (ECHILD) No hay procesos hijos 11 (EAGAIN) Intente nuevamente 12 (ENOMEM) Memoria agotada 13 (EACCES) Permiso denegado 14 (EFAULT) Direccin errnea 15 (ENOTBLK) Se necesita un bloque de dispositivo 16 (EBUSY) El dispositivo o recurso est ocupado 17 (EEXIST) El fichero ya existe 18 (EXDEV) Vnculo de dispositivos cruzado (Cross-device link) 19 (ENODEV) No existe el dispositivo 20 (ENOTDIR) No es un directorio 21 (EISDIR)
812
Es un directorio 22 (EINVAL) Argumento invlido 23 (ENFILE) Desbordamiento de tabla de fichero 24 (EMFILE) Demasiados ficheros abiertos 25 (ENOTTY) Ioctl no apropiada para el dispositivo 26 (ETXTBSY) Fichero de texto ocupado 27 (EFBIG) El fichero es demasiado grande 28 (ENOSPC) Espacio agotado en el dispositivo 29 (ESPIPE) Bsqueda ilegal 30 (EROFS) Fichero de sistema de slo lectura 31 (EMLINK) Demasiados vnculos La siguiente tabla proporciona una lista con algunos cdigos de error de sistema comunes en Windows. Para una lista completa consulte el Microsoft sitio web. 1 (ERROR_INVALID_FUNCTION) Funcin incorrecta 2 (ERROR_FILE_NOT_FOUND) El sistema no puede hallar el fichero especificado 3 (ERROR_PATH_NOT_FOUND) El sistema no puede hallar la ruta especificada 4 (ERROR_TOO_MANY_OPEN_FILES) El sistema no puede abrir el fichero. 5 (ERROR_ACCESS_DENIED) Acceso denegado.
813
6 (ERROR_INVALID_HANDLE) El manejador es invlido. 7 (ERROR_ARENA_TRASHED) Los bloques de control de almacenamiento fueron destruidos. 8 (ERROR_NOT_ENOUGH_MEMORY) No hay suficiente almacenamiento disponible para procesar este comando. 9 (ERROR_INVALID_BLOCK) La direccin del bloque de control de almacenamiento es invlida. 10 (ERROR_BAD_ENVIRONMENT) El entorno es incorrecto. 11 (ERROR_BAD_FORMAT) Se intent cargar un programa con un formato incorrecto. 12 (ERROR_INVALID_ACCESS) El cdigo de acceso es invlido. 13 (ERROR_INVALID_DATA) El dato es invlido. 14 (ERROR_OUTOFMEMORY) No hay suficiente espacio de almacenamiento para completar esta operacin. 15 (ERROR_INVALID_DRIVE) El sistema no puede hallar la unidad especificada. 16 (ERROR_CURRENT_DIRECTORY) El directorio no puede eliminarse. 17 (ERROR_NOT_SAME_DEVICE) El sistema no puede mover el fichero a una unidad de disco diferente. 18 (ERROR_NO_MORE_FILES) No hay ms ficheros. 19 (ERROR_WRITE_PROTECT) El medio de almacenamiento eat protegido contra escritura. 20 (ERROR_BAD_UNIT) El sistema no puede hallar el dispositivo especificado. 21 (ERROR_NOT_READY) El dispositivo no est listo. 22 (ERROR_BAD_COMMAND)
814
El dispositivo no reconoce el comando. 23 (ERROR_CRC) Error de datos (verificacin de redundancia cclica) 24 (ERROR_BAD_LENGTH) El programa emiti un comando pero la longitud del comando es incorrecta. 25 (ERROR_SEEK) La unidad no puede hallar un rea o pista especfica en el disco. 26 (ERROR_NOT_DOS_DISK) No puede accederse al disco o diskette especificado. 27 (ERROR_SECTOR_NOT_FOUND) La unidad no puede hallar el sector solicitado. 28 (ERROR_OUT_OF_PAPER) La impresora no tiene papel. 29 (ERROR_WRITE_FAULT) El sistema no puede escribir en la unidad especificada. 30 (ERROR_READ_FAULT) El sistema no puede leer desde la unidad especificada. 31 (ERROR_GEN_FAILURE) Un dispositivo conectado al sistema est fuera de funcionamiento. 32 (ERROR_SHARING_VIOLATION) El proceso no puede acceder al fichero porque est en uso por otro proceso. 33 (ERROR_LOCK_VIOLATION) El proceso no puede acceder al fichero porque una parte fue bloqueada por otro proceso. 34 (ERROR_WRONG_DISK) La unidad contiene el diskette incorrecto. Inserte %2 (Nmero de Serie de Volumen: %3) en la unidad %1. 36 (ERROR_SHARING_BUFFER_EXCEEDED) Demasiados ficheros abiertos en modo compartido. 38 (ERROR_HANDLE_EOF) Se alcanz el fin del fichero. 39 (ERROR_HANDLE_DISK_FULL) El disco est lleno. 87 (ERROR_INVALID_PARAMETER)
815
El parmetro es incorrecto. (Si se obtiene este error en Windows, y se ha establecido innodb_file_per_table en my.cnf o my.ini, entonces debe agregarse la lnea innodb_flush_method=unbuffered en el fichero my.cnf o my.ini.) 112 (ERROR_DISK_FULL) El disco est lleno. 123 (ERROR_INVALID_NAME) El nombre de fichero, de directorio, o la etiqueta de volumen, tienen la sintaxis incorrecta. 1450 (ERROR_NO_SYSTEM_RESOURCES) No hay suficientes recursos de sistema para completar el servicio requerido.
816
MySQL no se podr ejecutar hasta que se recuperen las tablas de sistema anteriores desde una copia de respaldo o se las regenere con el script mysql_install_db. InnoDB no lleva una cuenta interna de las filas en una tabla. (Esto sera realmente complicado a causa de la multiversin). Para procesar una sentencia SELECT COUNT(*) FROM T, InnoDB debe examinar un ndice de la tabla, lo cual lleva algn tiempo si el ndice no est completamente dentro del pool de buffer. Para disponer de un recuento ms rpido, se debe crear una tabla de recuento y hacer que la aplicacin la actualice a medida que se producen inserciones y eliminaciones. Si una tabla no se modifica a menudo, utilizar el cache de consultas (query cache) de MySQL es una buena solucin. Tambin puede emplearse SHOW TABLE STATUS si es suficiente un recuento aproximado de filas. Consulte Seccin 15.11, Consejos de afinamiento del rendimiento de InnoDB. Para una columna AUTO_INCREMENT, siempre se debe definir un ndice para la tabla, el cual debe contener solamente a la columna AUTO_INCREMENT. En tablas MyISAM, la columna AUTO_INCREMENT puede formar parte de un ndice junto a otras columnas. InnoDB no admite la opcin AUTO_INCREMENT en sentencias CREATE TABLE o ALTER TABLE, la cual sirve para establecer el valor inicial de la secuencia. Para especificar este valor en InnoDB, debe insertarse una fila con un valor que sea uno menos que el deseado, y luego borrarla, o insertar la primera fila especificando un valor determinado. Luego de reiniciar el servidor MySQL, InnoDB puede reutilizar un valor antiguo para una columna AUTO_INCREMENT (esto es, un valor que se hubiese asignado a una transaccin finalmente cancelada). Cuando una columna AUTO_INCREMENT sobrepasa el mximo valor que es capaz de almacenar, InnoDB coloca la columna en -9223372036854775808 (si es BIGINT) o en 1 (si es BIGINT UNSIGNED). Sin embargo, como los valores BIGINT tienen 64 bits, hay que notar que si se insertara un milln de filas por segundo, se demorara cerca de trescientos mil aos en agotar los nmeros disponibles. Con otros tipos de columnas enteros, ocurre un error de clave duplicada. Esto es similar al funcionamiento de MyISAM, ya que es en mayor medida el comportamiento general de MySQL y no pertenece a ningn motor de almacenamiento en particular. DELETE FROM nom_tabla no regenera la tabla sino que elimina todas sus filas, una por una. TRUNCATE tbl_name se implementa en InnoDB como DELETE FROM tbl_name y no inicializa el contador de AUTO_INCREMENT. SHOW TABLE STATUS no proporciona estadsticas precisas en tablas InnoDB, excepto para el tamao fsico reservado por la tabla. El recuento de filas es solamente una estimacin utilizada para la optimizacin SQL. En MySQL 5.0, la operacin LOCK TABLES establece dos bloqueos en cada tabla si innodb_table_locks=1, que es el valor por defecto. Adicionalmente al bloqueo de tabla en la capa MySQL, tambin se establece un bloqueo de tabla en InnoDB. En versiones antiguas de MySQL no se estableca el bloqueo en InnoDB, para volver a este comportamiento debe especificarse innodb_table_locks=0. Si no se establece el bloqueo InnoDB, LOCK TABLES se completa an cuando algunos registros de las tablas estn bloqueados por otras transacciones. Todos los bloqueos InnoDB efectuados por una transaccin se liberan cuando la transaccin se confirma o se cancela. Por lo tanto, no tiene mucho sentido invocar LOCK TABLES en tablas InnoDB cuando se est en el modoAUTOCOMMIT=1, porque los bloqueos establecidos sobre una tabla InnoDB se liberarn inmediatamente. Algunas veces sera til bloquear tablas extensas en el curso de una trasaccin. Desafortunadamente, LOCK TABLES, en MySQL, emite implcitamente un COMMIT y un UNLOCK TABLES. Est planeada una variante para InnoDB de LOCK TABLES que puede ejecutarse dentro de una transaccin. La sentencia LOAD TABLE FROM MASTER empleada para la replicacin de servidores esclavos no funciona an con tablas InnoDB. Una solucin temporal es cambiar a MyISAMla tabla en el servidor
817
amo (master), efectuar la carga, y volver a cambiar la tabla en el amo (master) a su motor original InnoDB. El tamao por defecto de cada pgina de base de datos en InnoDB es de 16KB. Se puede establecer en valores entre 8KB y 64KB recompilando el cdigo. Se deben modificar los valores de UNIV_PAGE_SIZE y UNIV_PAGE_SIZE_SHIFT en el fichero fuente univ.i. En MySQL 5.0, los disparadores (triggers) an no son activados por modificaciones efectuadas en cascada a travs de claves forneas.
Se puede eliminar la tabla que causa el conflicto siguiendo las instrucciones del mensaje de error. Esto es, crear una tabla InnoDB con el mismo nombre en otra base de datos y mover al directorio de la base de datos actual el fichero .frm resultante. MySQL asumir que la tabla ya existe, y se podr eliminar con DROP TABLE. crear.
818
Otro sntoma de un diccionario de datos desactualizado es que MySQL emite un mensaje de error donde dice que no puede abrir un fichero .InnoDB:
ERROR 1016: Can't open file: 'child2.InnoDB'. (errno: 1)
Esto significa que hay un fichero .frm que no tiene la correspondiente tabla dentro de InnoDB. El fichero .frm puede ser borrado manualmente para solucionarlo. Si MySQL cae durante una operacin ALTER TABLE, puede aparecer una tabla temporal hurfana dentro del espacio de tablas InnoDB. Empleando innodb_table_monitor se ver listada una tabla cuyo nombre es #sql-.... En MySQL 5.0, se pueden llevar a cabo sentencias SQL sobre tablas cuyo nombre contenga el caracter '#' si se encierra el nombre dentro de acentos graves (ASCII 96). De esa forma, se puede eliminar esta tabla hurfana del mismo modo que las mencionadas anteriormente. Hay que tener en cuenta que al copiar o renombrar un fichero en el shell de Unix, se necesitar colocar el nombre del fichero entre comillas dobles si ste contiene un caracter '#'.
819
820
821
Lista de correo de MySQL Cluster. El rea de Cluster del MySQL User Forums. Puede encontrar respuestas a preguntas comunes acerca de Cluster en Seccin 16.10, Preguntas frecuentes sobre MySQL Cluster. Si es novato en MySQL Cluster, puede encontrar til el artculo de la Developer Zone How to set up a MySQL Cluster for two servers .
822
Todos estos programas funcionan juntos para formar un MySQL Cluster. Cuando se almacenan los datos en el motor NDB Cluster, las tablas se almacenan en los nodos de datos. Tales tablas son directamente accesibles desde todos los otros servidores MySQL en el cluster. Por lo tanto, en una aplicacin de pago que almacene datos en un cluster, si una aplicacin actualiza el salario de un empleado, todos los otros servidores MySQL que acceden a estos datos pueden ver el cambio inmediatamente. Los datos almacenados en los nodos de datos de MySQL Cluster pueden replicarse: el cluster puede tratar fallos de nodos de datos individuales sin otro impacto a parte de abortar unas pocas transacciones debido a la prdida de estado de transaccin. Como las aplicaciones transaccionales se suponen que tratan fallos transaccionales, esto no debera ser un problema. Al llevar MySQL Cluster al mundo Open Source , MySQL propociona tratamiento de datos clusterizado con alta disponibilidad, alto rendimiento, y escalabilidad disponible para todo el que lo necesite.
823
824
825
Nota: Para mayor simplicidad, usamos slo direcciones IP numricas en este How-To. Sin embargo, si la resolucin de DNS est disponible en su red, es posible usar nombres de equipos en lugar de direcciones IP al configurar el cluster. Alternativamente, puede usar el fichero /etc/ hosts o el equivalente en su sistema operativo para proporcionar significado al hacer la bsqueda de equipos si est disponible. 2. Cada equipo en nuestro escenario es un PC de sobremesa basado en Intel con una distribucin Linux genrica instalada en disco con una configuracin estndar, y ejecutando slo los servicios necesarios. El sistema operativo con un cliente de red TCP/IP estndar es suficiente. Para simplicidad, asumimos que el sistema de ficheros en todas las mquinas est configurado igual. En caso que no fuera as, necesita adaptar estas instrucciones. 3. Tarjetas 100 Mbps o 1 gigabit Ethernet estn instaladas en cada mquina, junto con sus drivers, y las cuatro mquinas estn conectadas via un elemento de red Ethernet como un switch. (Todas las mquinas deben usar tarjetas de red con la misma velocidad; esto es, las cuatro mquinas del cluster deben tener tarjetas 100 Mbps o las 4 mquinas deben tener tarjetas 1 Gbps.) MySQL Cluster funcionar en una red 100 Mbps ; sin embargo, gigabit Ethernet proporciona mejor rendimiento. Tenga en cuenta que MySQL Cluster no est diseado para una conectividad de red menor a 100 Mbps. Por esta razn (entre otras), intentar ejecutar un MySQL Cluster en una red pblica como Internet no funcionar y no est recomendado.
826
4. Para nuestros datos de prueba, usaremos la base de datos world disponible para descarga en la web de MySQL AB. Como ocupa poco espacio, suponemos que cada mquina tiene 256 MB RAM, que debe ser suficiente para ejecutar el sistema operativo, proceso NDB del equipo y (para los nodos de datos) almacenar la base de datos. Aunque nos referimos a Linux en este How-To, las instrucciones y procedimientos que proporcionamos aqu pueden adaptarse tanto a Solaris como a Mac OS X. Suponemos que sabe realizar una instalacin mnima y configurar el sistema operativo con capacidad de red, o que puede obtener asistencia cuando lo necesite. Discutimos los requerimientos hardware ,software, y de red de MySQL Cluster con ms detalle en la siguiente seccin . (Consulte Seccin 16.3.1, Hardware, software y redes.)
16.3.2. Instalacin
Cada mquina MySQL Cluster ejecutando nodos de almacenamiento o SQL deben tener insalados el binario MySQL-max . Para nodos de almacenamiento, no es necesario tener el binario MySQL server instalado, pero tiene que instalar el demonio del servidor MGM y los binarios de clientes (ndb_mgmd y ndb_mgm, respectivamente). En esta seccin, cubrimos los pasos necesarios para instalar los binarios correctos para cada tipo de nodo del cluster.
827
Instalacin
MySQL AB proporciona binarios precompilados que soportan cluster y que no tiene que compilar. (Si necesita un binario personalizado, consulte Seccin 2.8.3, Instalar desde el rbol de cdigo fuente de desarrollo.) Por lo tanto, el primer paso del proceso de instalacin para cada mquina del cluster es bajar la versin ms reciente de su plataforma desde MySQL downloads area. Asumimos que los guarda en el directorio /var/tmp de cada mquina. Hay RPMs disponibles para plataformas Linux 32-bit y 64-bit; los binarios -max instalados por los RPMs soportan el motor NDBCluster . Si elige usarlos en lugar de los binarios, tenga en cuenta que debe instalar ambos el paquete -server y el -max en todas las mquinas que tendrn nodos del cluster. (Consulte Seccin 2.4, Instalar MySQL en Linux para ms informacin acerca de instalar MySQL usando RPMs.) Tras instalar de los RPM, todava tiene que configurar el cluster como se discute en Seccin 16.3.3, Configuracin. Nota: Tras completar la instalacin no arranque los binarios. Le mostraremos como hacerlo siguiendo la configuracin de todos los nodos. Instalacin de nodos de almacenamiento y SQL En cada una de las 3 mquinas designadas para tener los nodos de almacenamiento o SQL, realice los siguientes pasos como root del sistema: 1. Compruebe los ficheros /etc/passwd y /etc/group ( o use cualquier herramienta proporcionada por el sistema operativo para tratar usuarios y grupos) para ver si hay un grupo mysql y usuario mysql en el sistema, como algunas de las distribuciones de sistema operativo los crean como parte del proceso de instalacin. Si no estn presentes, cree un nuevo grupo mysql y un usuario mysql para este grupo:
groupadd mysql useradd -g mysql mysql
2. Cambie al directorio que contiene el fichero descargado; desempaqutelo; cree un symlink al ejecutable mysql-max. Tenga en cuenta que el nombre del fichero y difectorio cambia en funcin del nmero de versin de MySQL .
cd /var/tmp tar -xzvf -C /usr/local/bin mysql-max-5.0.10-pc-linux-gnu-i686.tar.gz ln -s /usr/local/bin/mysql-max-5.0.10-pc-linux-gnu-i686 mysql
3. Cambie al directorio mysql , y ejecute el script proporcionado para crear las bases de datos del sistema:
cd mysql scripts/mysql_install_db --user=mysql
4. Configure los permisos necesarios para los directorios de MySQL server y de datos:
chown -R root . chown -R mysql data chgrp -R mysql .
Tenga en cuenta que el directorio de datos en cada mquina con un nodo de datos es /usr/ local/mysql/data. Haremos uso de esta informacin al configurar el nodo de administracin . (Consulte Seccin 16.3.3, Configuracin.) 5. Copie el script de arranque de MySQL en el directorio apropiado, hgalo ejecutable, y configrelo para arrancar junto al sistema operativo:
cp support-files/mysql.server /etc/rc.d/init.d/ chmod +x /etc/rc.d/init.d/mysql.server chkconfig --add mysql.server
Aqu usamos Red Hat chkconfig para crear enlaces a los scripts de arranque; use lo que sea apropiado para su sistema operativo / distribucin, tal como update-rc.d en Debian. 828
Configuracin
Recuerde que los pasos listados anteriormente deben realizarse separadamente en cada mquina en que el nodo de almacenamiento o SQL residen. Instalacin del nodo de administracin Para el nodo MGM (administracin), no es necesario instalar el ejecutable mysqld, slo los binarios para el cliente y servidor MGM, que pueden encontrarse en el archivo -max descargado. De nuevo asumimos que ha guardado este fichero en /var/tmp. Como root del sistema (esto es, tras usar sudo, su root, o su equivalente en su sistema para asumir temporalmente los privilegios de administrador de sistema), realice los siguientes pasos para instalar ndb_mgmd y ndb_mgm en el nodo de administracin del cluster: 1. Mueva el directorio /var/tmp , y extraiga ndb_mgm y ndb_mgmd del archivo a un directorio disponible como /usr/local/bin:
cd /var/tmp tar -zxvf mysql-max-5.0.10-pc-linux-gnu-i686.tar.gz /usr/local/bin '*/bin/ndb_mgm*'
En Seccin 16.3.3, Configuracin, crearemos y escribiremos los ficheros de configuracin para todos los nodos del cluster de ejemplo.
16.3.3. Configuracin
Para nuestro cluster de 4 nodos y 4 equipos, necesitamos escribir 4 ficheros de configuracin, 1 por nodo/equipo. Cada nodo de datos o SQL necesita un fichero my.cnf que proporciona dos informaciones: un connectstring diciendo al nodo dnde encontrar el nodo MGM , y una lnea diciendo al servidor MySQL en este equipo (la mquina del nodo de datos) que se ejecute en modo NDB. Para ms informacin de connectstrings, consulte Seccin 16.4.4.2, El connectstring de MySQL Cluster. El nodo de administracin necesita un fichero config.ini que le diga cuntas replicas mantener, cunta memoria reservar para datos e ndices en cada nodo de datos, dnde encontrar los nodos de datos, dnde se guardarn los datos en cada nodo de datos, y dnde encontrar los nodos SQL. Configuracin de los nodos de almacenamiento y SQL El fichero my.cnf necesitado por los nodos de datos es muy simple. El fichero de configuracin debe estar localizado en el directorio /etc y puede editarse (y crearse en caso necesario) usando un editor de texto, por ejemplo:
vi /etc/my.cnf
Para cada nodo de datos y SQL en nuestra configuracin de ejemplo, my.cnf debe tener este aspecto:
[MYSQLD] ndbcluster ndb-connectstring=192.168.0.10 [MYSQL_CLUSTER] ndb-connectstring=192.168.0.10 # Options for mysqld process: # run NDB engine # location of MGM node # Options for ndbd process: # location of MGM node
Tras introducir lo anterior, guarde este fichero y salga del editor de texto. Hgalo pra las mquinas que guarden el nodo de datos "A", el "B" y el nodo SQL. 829
Configuracin
Configuracin del nodo de administracin El primer paso al configurar el nodo MGM es crear el directorio en que puede encontrarse el fichero de configuracin y crear el fichero prpiamente dicho. Por ejemplo (ejecutando como root):
mkdir /var/lib/mysql-cluster cd /var/lib/mysql-cluster vi config.ini
Mostramos vi para crear el fichero, pero puede usar cualquier editor de textos. Para nuestra inicializacin representativa, el fichero config.ini debe leerse as:
[NDBD DEFAULT] NoOfReplicas=2 DataMemory=80M IndexMemory=18M # # # # # # # # # # # # # # Options affecting ndbd processes on all data nodes: Number of replicas How much memory to allocate for data storage How much memory to allocate for index storage For DataMemory and IndexMemory, we have used the default values. Since the "world" database takes up only about 500KB, this should be more than enough for this example Cluster setup. TCP/IP options: This the default; however, you can use any port that is free for all the hosts in cluster Note: It is recommended beginning with MySQL 5.0 that you do not specify the portnumber at all and simply allow the default value to be used instead # Management process options: # Hostname or IP address of MGM node # Directory for MGM node logfiles # # # # Options for data node "A": (one [NDBD] section per data node) Hostname or IP address Directory for this data node's datafiles
[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] hostname=192.168.0.20 datadir=/usr/local/mysql/data
# Options for data node "B": # Hostname or IP address # Directory for this data node's datafiles # # # # # # SQL node options: Hostname or IP address Directory for SQL node's datafiles (additional mysqld connections can be specified for this node for various purposes such as running ndb_restore)
(NOTA: La base de datos "world" puede descargarse desde http://dev.mysql.com/doc/ donde puede encontrarse en "Examples".) Una vez que todos los ficheros de configuracin se han creado y se han especificado estas opciones, est preparado para arrancar el cluster y verificar que todos los procesos estn en ejecucin. Se discute acreca de esto en Seccin 16.3.4, Arranque inicial. Para informacin ms detallada acerca de los parmetros de configuracin de MySQL Cluster y sus usos, consulte Seccin 16.4.4, Fichero de configuracin y Seccin 16.4, Configuracin de MySQL Cluster. Para configuracin de MySQL Cluster para realizar copias de seguridad, consulte Seccin 16.6.4.4, Configuracin para copias de seguridad de un nodo. Nota: El puerto por defecto para administracin del cluster es 1186; el puerto por defecto para nodos de datos es 2202. A partir de MySQL 5.0.3, esta restriccin se elimina, y el cluster reserva los puertos de los nodos de datos automticamente de los que estn libres.
830
Arranque inicial
Tenga en cuenta que ndb_mgmd debe saber dnde encontrar su fichero de configuracin , usando la opcin -f o --config-file . (Consulte Seccin 16.5.3, El proceso del servidor de administracin ndb_mgmd para ms detalles.) 2. En cada equipo de los nodos de datos, ejecute este comando para arrancar el proceso NDBD por primera vez:
shell> ndbd --initial
Tenga en cuenta que es muy imporante usar el parmetro --initial slo al arrancar ndbd por primera vez, o tras reiniciar tras una copia de seguridad/restauracin o cambio de configuracin. Esto es debido a que este parmetro har que el nodo borre cualquier fichero creado por instancias ndbd anteriormente necesarios para la restauracin, incluyendo el fichero log de restauracin. 3. En la mquina cluster donde reside el nodo SQL, ejecute un mysqld normal como se muestra:
shell> mysqld &
Si todo ha ido bien, y el cluster se ha inicializado correctamente, el cluster debera ser operacional. Puede comprobarlo invocando el nodo cliente de administracin ndb_mgm ; la salida debe parecerse a la que hay a continuacin:
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: 5.0.11, Nodegroup: 0, Master) id=3 @192.168.0.40 (Version: 5.0.11, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.10 (Version: 5.0.11) [mysqld(SQL)] 1 node(s) id=4 (Version: 5.0.11)
Puede encontrar ligeras diferencias en funcin de la versin exacta de MySQL que use. Nota: Si usa una versin antigua de MySQL, puede ver el nodo SQL referenciado como '[mysqld(API)]'. Esto refleja un uso antiguo que ya est obsoleto. Debera ser capaz de trabajar con bases de datos, tablas y datos en MySQL Cluster. Consulte Seccin 16.3.5, Cargar datos de ejemplo y realizar consultas para una breve discusin.
831
Si est importando tablas de una base de datos existente usando la salida de mysqldump, puede abrir el script SQL en un editor de texto y aadir est opcin a cualquier comando de creacin de tablas, o reemplazar cualquier opcin ENGINE (o TYPE) existente con alguna de estas. Por ejemplo, suponga que tiene la base de datos de ejemplo world en otro MySQL server (que no soporta MySQL Cluster), y desea exportar la definicin de la tabla City :
shell> mysqldump --add-drop-table world City > city_table.sql
El fichero city_table.sql resultante contendr el comando de creacin de la tabla ( y el comando INSERT necesario para importar los datos de la tabla):
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)
Necesitar asegurarse que MySQL usa el motor NDB para esta tabla. Hay dos formas de hacerlo. Una es, antes de importar la tabla en la base de datos del cluster, modificar su definicin para que lea (usando City como ejemplo):
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.)
Esto debe hacerse para la definicin de cada tabla que ser parte de la base de datos clusterizada. La forma ms fcil de hacerlo es smplemente hacer un buscar y reemplazar en el fichero world.sql y reemplazar todas las instancias de TYPE=MyISAM con ENGINE=NDBCLUSTER. Si no quiere modificar el fichero, puede usar ALTER TABLE; consulte a continuacin las particularidades. Asumiendo que ha creado la base de datos llamada world en el nodo SQL del cluster, puede usar el cliente de lnea de comandos mysql para leer city_table.sql, y crear y llenar de datos la tabla correspondiente de la forma usual:
shell> mysql world < city_table.sql
Es muy importante recordar que el comando anterior debe ejecutarse en la mquina en que corre el nodo SQL -- en este caso, la mquina con direccin IP 192.168.0.20. Para crear una copia de la base de datos world en el nodo SQL, guarde el fichero en /usr/ local/mysql/data, luego ejecute
shell> cd /usr/local/mysql/data shell> mysql world < world.sql
832
Por supuesto, el script SQL debe ser leble por el usuario mysql . Si guarda el fichero en un lugar distinto, ajuste lo anterior correctamente. Es importante tener en cuenta que NDB Cluster en MySQL 5.0 no soporta descubrimiento automtico de bases de datos. (Consulte Seccin 16.8, Limitaciones conocidas de MySQL Cluster.) Esto significa que , una vez que la base de datos world y sus tablas se han creado en un nodo de datos, necesitar ejecutar el comando CREATE DATABASE world; (a partir de MySQL 5.0.2, puede usar CREATE SCHEMA world; en su lugar), seguido por FLUSH TABLES; en cada nodo de datos del cluster. Esto har que el nodo reconozca la base de datos y lea sus definiciones de tablas. Ejecutar consultas SELECT en el nodo SQL no es distinto a ejecutarlas en cualquier otra instancia de un MySQL server. Para ejecutar consultas de lnea de comandos, primero necesita registrarse en el MySQL Monitor normalmente:
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 no modifica las clusulas ENGINE= en las definiciones de tabla antes de importar el script SQL, debe ejecutar los siguientes comandos en este punto:
mysql> mysql> mysql> mysql> USE world; ALTER TABLE City ENGINE=NDBCLUSTER; ALTER TABLE Country ENGINE=NDBCLUSTER; ALTER TABLE CountryLanguage ENGINE=NDBCLUSTER;
Tenga en cuenta que smplemente usamos la cuenta root por defecto del sistema con una contrasea vaca. Por supuesto, en un sistema de produccin, debe siempre seguir las precauciones de seguridad para instalar un MySQL server, incluyendo una contrasea de root y la creacin de una cuenta de usuario con slo los permisos necesarios para realizar las tareas necesarias para ese usuario. Para ms informacin acerca de esto, consulte Seccin 5.6, El sistema de privilegios de acceso de MySQL. Vale la pena tener en cuenta que los nodos del cluster no utilizan el sistema de permisos de MySQL al acceder el uno al otro, y preparar o cambiar las cuentas de usuario de MySQL (incluyendo la cuenta root ) no tiene efecto en la interaccin entre nodos, slo en aplicaciones accediendo al nodo SQL. Seleccionar una base de datos y ejecutar una consulta SELECT contra una tabla en la base de datos se realiza de la forma normal, como salir del MySQL Monitor:
mysql> USE world; mysql> SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5; +-----------+------------+ | Name | Population | +-----------+------------+ | Bombay | 10500000 | | Seoul | 9981619 | | So Paulo | 9968485 | | Shanghai | 9696300 | | Jakarta | 9604900 | +-----------+------------+ 5 rows in set (0.34 sec) mysql> \q Bye shell>
833
Las aplicaciones usando MySQL pueden usar APIs estndar. Es importante recordar que sus aplicaciones deben acceder al nodo SQL, y no al nodo MGM o a los de almacenamiento. Este breve ejemplo muestra cmo puede ejecutar la misma consulta que la anterior usando la extensin de PHP 5 mysqli ejecutando un servidor web en cualquier punto de la red:
<!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>SIMPLE mysqli SELECT</title> </head> <body> <?php # connect to SQL node: $link = new mysqli('192.168.0.20', 'root', '', 'world'); # parameters for mysqli constructor are: # host, user, password, database if( mysqli_connect_errno() ) die("Connect failed: " . mysqli_connect_error()); $query = "SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5"; # if no errors... if( $result = $link->query($query) ) { ?> <table border="1" width="40%" cellpadding="4" cellspacing ="1"> <tbody> <tr> <th width="10%">City</th> <th>Population</th> </tr> <? # then display the results... 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> <? # ...and verify the number of rows that were retrieved printf("<p>Affected rows: %d</p>\n", $link->affected_rows); } else # otherwise, tell us what went wrong echo mysqli_error(); # free the result set and the mysqli connection object $result->close(); $link->close(); ?> </body> </html>
Suponemos que el proceso ejecutndose en el servidor web puede alcanzar la IP del nodo SQL. De forma parecida, puede usar la MySQL C API, Perl-DBI, Python-mysql, o los conectores propios de MySQL AB para realizar las tareas de definicin y manipulacin de datos como hara normalmente con MySQL. Recuerde que cada tabla NDB debe tener una clave primaria. Si no se define clave primaria por el usuario cuando se crea la tabla, el motor NDB Cluster crear una oculta automticamente. (Nota:
834
esta clave oculta ocupa espacio como cualquier otro ndice de tabla. No es raro encontrar problemas debido a espacio insuficiente en memoria para guardar estos ndices creados automticamente.)
Esto har que ndb_mgm, ndb_mgmd, y cualquier proceso ndbd termine normalmente. Cualquier nodo SQL puede terminarse usando mysqladmin shutdown y otros medios. Tenga en cuenta que la opcin -e aqu se usa para pasar un comando al cliente ndb_mgm desde el shell. Consulte Seccin 4.3.1, Usar opciones en la lnea de comandos. Para reiniciar el cluster, smplemente ejecute estos comandos: En el equipo de administracin (192.168.0.10 en nuestra configuracin):
shell> ndb_mgmd -f /var/lib/mysql-cluster/config.ini
Recuerde de no invocar este comando con la opcin --initial cuando reinicie el nodo NDBD normalmente. Y en el equipo SQL (192.168.0.20):
shell> mysqld &
Para inforamcin de hacer copias de seguridad de clusters, consulte Seccin 16.6.4.2, Usar el servidor de administracin para crear una copia de seguridad. Para restaurar un cluster de una copia de seguridad requiere el uso del comando ndb_restore . Esto se trata en Seccin 16.6.4.3, Cmo restablecer una copia de seguridad de un nodo. Ms informacin sobre la configuracin del cluster MySQL puede encontrarse en Seccin 16.4, Configuracin de MySQL Cluster.
835
Instalar el software
Si elige compilar desde un paquete fuente o desde el MySQL 5.0 BitKeeper tree, asegrese de usar la opcin --with-ndbcluster cuando ejecute configure. Puede usar el script BUILD/ compile-pentium-max . Tenga en cuenta que este script incluye OpenSSL,as que debe tener u obtener OpenSSL para compilar con xito; de otro modo, necesitar modificar compile-pentiummax para excluir este requerimiento. Por supuesto, puede seguir las instrucciones estndar para compilar sus propios binarios, luego realizar los tests usuales y procedimiento de instalacin. Consulte Seccin 2.8.3, Instalar desde el rbol de cdigo fuente de desarrollo.
En este directorio, cree un fichero llamado config.ini con la siguiente informacin, substituyendo los valores apropiados por HostName y DataDir como sea necesario para su sistema.
# file "config.ini" - showing minimal setup consisting of 1 data node, # 1 management server, and 3 MySQL servers. # The empty default sections are not required, and are shown only for # the sake of completeness. # Data nodes must provide a hostname but MySQL Servers are not required # to do so. # If you don't know the hostname for your machine, use localhost. # The DataDir parameter also has a default value, but it is recommended to # set it explicitly. # Note: DB, API, and MGM are aliases for NDBD, MYSQLD, and NDB_MGMD # respectively. DB and API are deprecated and should not be used in new # installations. [NDBD DEFAULT] NoOfReplicas= 1 [MYSQLD DEFAULT] [NDB_MGMD DEFAULT] [TCP DEFAULT] [NDB_MGMD] HostName= myhost.example.com [NDBD] HostName= myhost.example.com DataDir= /var/lib/mysql-cluster [MYSQLD] [MYSQLD] [MYSQLD]
836
Arranque un nodo DB sencillo usando ndbd. Al arrancar ndbd para un nodod DB dado por primera vez, debe usar la opcin --initial :
shell> ndbd --initial
Esto es porque la opcin --initial borra todos los ficheros de datos y log existentes (as como todos los metadatos de tablas) para este nodo de datos y crea nuevos. Una excepcin a esta regla es al reiniciar el cluster y restaurar desde una copia de seguridad tras aadir nuevos nodos de datos. Por defecto, ndbd buscar el servidor de administracin en localhost en el puerto 1186. Nota: Si ha instalado MySQL desde un tarball binario, necesitar especificar la ruta de los servidores ndb_mgmd y ndbd explcitamente. (Normalemnte, se encuentran en /usr/local/mysql/bin.) Finalmente, vaya al directorio de datos de MySQL (usualmente /var/lib/mysql o /usr/local/ mysql/data), y asegrese que el fichero my.cnf contiene la opcin necesaria para permitir el motor NDB :
[mysqld] ndbcluster
Espere un momento para asegurarse que el servidor MySQL est corriendo apropiadamente. Si ve mysql ended, chequee el fichero .err del servidor para averiguar qu ha fallado. Si todo ha ido bien, puede arrancar usando el cluster:
shell> mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 5.0.10-Max Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> SHOW 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 1 row in set (0.00 sec)
Para chequear que sus nodos se han inicializado correctamente, arranque el cliente de administracin como se muestra:
shell> ndb_mgm
Puede usar el comando SHOW desde el cliente de administracin para obtener un reporte del estado del cluster:
837
Fichero de configuracin
NDB> SHOW Cluster Configuration --------------------[ndbd(NDB)] 1 node(s) id=2 @127.0.0.1 (Version: 3.5.3, Nodegroup: 0, Master) [ndb_mgmd(MGM)] 1 node(s) id=1 @127.0.0.1 (Version: 3.5.3) [mysqld(API)] 3 node(s) id=3 @127.0.0.1 (Version: 3.5.3) id=4 (not connected, accepting connect from any host) id=5 (not connected, accepting connect from any host)
En este punto, ha inicializado correctamente un cluster MySQL. Ya puede almacenar datos en el cluster usando cualquier tabla creada con ENGINE=NDBCLUSTER o su alias ENGINE=NDB.
# provide connectstring for management server host (default port: 1186) [ndbd] connect-string=ndb_mgmd.mysql.com # provide connectstring for management server host (default port: 1186) [ndb_mgm] connect-string=ndb_mgmd.mysql.com # provide location of cluster configuration file [ndb_mgmd] config-file=/etc/config.ini
838
Fichero de configuracin
(Para ms informacin acerca de los connectstrings, consulte Seccin 16.4.4.2, El connectstring de MySQL Cluster.)
# my.cnf # example additions to my.cnf for MySQL Cluster # (will work on all versions) # enable ndbcluster storage engine, and provide connectstring for management # server host to the default port 1186 [mysqld] ndbcluster ndb-connectstring=ndb_mgmd.mysql.com:1186
Puede usar una seccin separada [mysql_cluster] en el cluster my.cnf para configuracin que deba ser leda y afecte a todos los ejecutables:
# cluster-specific settings [mysql_cluster] ndb-connectstring=ndb_mgmd.mysql.com:1186
Actualmente el fichero de configuracin est en formato INI, y se llama config.ini por defecto . Lo lee ndb_mgmd al arrancar y puede situarse en cualquier sitio. Su localizacin y nombre se especifican usando --config-file=[<path>]<filename> en la lnea de comandos con ndb_mgmd. Si el fichero de configuracin no se especifica, ndb_mgmd trata por defecto de leer el fichero config.ini localizado en el directorio de trabajo actual. Los valores por defecto se definen para la mayora de parmetros, y pueden especificarse en config.ini. Para crear una seccin de valores por defecto, aada la palabra DEFAULT al nombre de seccin. Por ejemplo, los nodos de datos se configuran usando las secciones [NDBD]. Si todos los nodos de datos usan el mismo tamao de memoria de datos, y este no es le mismo que el tamao por defecto, cree una seccin [NDBD DEFAULT] que contenga una lnea con DataMemory para especificar el tamao por defecto de la memoria de datos para todos los nodos de datos. El formato INI consiste en secciones precedidas por cabeceras de secciones (rodeados por corchetes), segidos por los nombres y valores apropiados de parmetros. Una desviacin del formato estndar es que el nombre y valor del parmetro puede separarse por un punto y coma (':') as como el signo de igualdad ('='); otra es que las secciones no se identifican nicamente por el nombre. En su lugar, las entradas nicas (tales como dos nodos distintos del mismo tipo) se identifican por un ID nico. Como mnimo, el fichero de configuracin debe definir las mquinas y nodos involucrados en el cluster y en qu mquinas estn estos nodos. Como ejemplo de un fichero de configuracin simple para un cluster con un servidor de administracin, dos nodos de datos y dos servidores MySQL se muestra a continuacin:
# # # # # file "config.ini" - 2 data nodes and 2 SQL nodes This file is placed in the startup directory of ndb_mgmd (the management server) The first MySQL Server can be started from any host. The second can be started only on the host mysqld_5.mysql.com
[NDBD DEFAULT] NoOfReplicas= 2 DataDir= /var/lib/mysql-cluster [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]
839
Fichero de configuracin
HostName= mysqld_5.mysql.com
Hay seis secciones distintas en este fichero de configuracin: [COMPUTER]: Define las mquinas del cluster. [NDBD]: Define los nodos de datos del cluster. [MYSQLD]: Define los nodos MySQL del cluster. [MGM] o [NDB_MGMD]: Define el nodo de administracin del cluster. [TCP]: Define conexiones TCP/IP entre nodos en el cluster, siendo TCP/IP el protocolo de conexin por defecto. [SHM]: Define conexiones de memoria compartida entre nodos. Antiguamente, este tipo de conexin estaba disponible slo en binarios compilados con la opcin --with-ndb-shm . En MySQL 5.0-Max, est activado por defecto, pero debe considerarse experimental. Tenga en cuenta que cada nodo tiene su propia seccin en config.ini. Por ejemplo, desde que el cluster tiene dos nodos de datos, el fichero de configuracin contiene dos secciones definiendo estos nodos. Puede definir valores DEFAULT para cada seccin. En MySQL 5.0, todos los nombres de parmetros no son sensibles a maysculas.
<id> es un entero mayor que 1 que identifica un nodo en config.ini <port> es un entero que se refiere a un puerto unix regular <host> es una cadena que tiene una direccin de equipo de internet vlida
example 1 (long): example 2 (short): "nodeid=2,myhost1:1100,myhost2:1100,192.168.0.3:1200" "myhost1"
Todos los nodos usan localhost:1186 como valor connectstring por defecto si no se especifica otro. Si se omite <port> del connectstring, el puerto por defecto es 1186. Este puerto debe estar siempre disponible en la red, ya que se ha asignado por la IANA para este propsito (consulte http:// www.iana.org/assignments/port-numbers para ms detalles). Listando mltiples valores <host-specification> , es posible disear varios servidores de administracin redundantes. Un nodo del cluster tratar de contactar con administradores sucesivamente en cada equipo en el orden especificado, hasta que se establezca una conexin. Hay un nmero de distintos modos de especificar el connectstring: Cada ejecutable tiene su propia opcin de lnea de comandos que permite especificar el servidor de administracin al arrancar. (Consulte la documentacin para los respectivos ejecutables.) Es posible en MySQL 5.0 Cluster inicializar el connectstring para todos los nodos en el cluster a la vez ponindolo en la seccin [mysql_cluster] en el fichero del servidor de administracin my.cnf. Para compatibilidad con versiones anteriores, hay dos otras opciones disponibles, usando la misma sintaxis:
840
Fichero de configuracin
1. Inicialice la variable de entorno NDB_CONNECTSTRING para que contenga el connectstring. 2. Escriba el connectstring para cada ejecutable en un fichero de texto llamado Ndb.cfg y guarde este fichero en el directorio de arranque del ejecutable. Sin embargo, esto est ahora obsoleto y no debera usarse en nuevas instalaciones. El mtodo recomendado para especificar el connectstring es inicializarlo en la lnea de comandos o en el fichero my.cnf para cada ejecutable.
SYSLOG enva el log a un syslog , siendo los valores posibles uno de auth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, syslog, user, uucp, local0, local1, local2, local3, local4, local5, local6, o local7. Nota: No todos los dispositivos son soportadas necesariamente por cada sistema operativo.
SYSLOG:facility=syslog
841
Fichero de configuracin
FILE enva por un pipe la salida del log del cluster a un fichero normal de la misma mquina. Pueden especificarse los siguientes valores: filename: Nombre del fichero de log. maxsize: Tamao mximo al que puede crecer el fichero antes de pasar el log a un nuevo fichero. Cuando esto ocurre, el antiguo fichero de log se renombra aadiendo .x al nombre del fichero, donde x es el siguiente nmero no usado todava por este nombre. maxfiles: Nmero mximo de ficheros de log.
FILE:filename=cluster.log,maxsize=1000000,maxfiles=6
Es posible especificar mltiples destinaciones de logs como se muestra aqu, usando una cadena delimitada por puntos y comas:
CONSOLE;SYSLOG:facility=local0;FILE:filename=/var/log/mgmd
El valor por defecto para el parmetro FILE es FILE:filename=ndb_<id>_cluster.log,maxsize=1000000,maxfiles=6, donde <id> es el ID del nodo. [NDB_MGMD]ArbitrationRank Este parmetro se usa para definir qu nodos pueden actuar como rbitros. Slo los nodos MGM y SQL pueden serlo. ArbitrationRank puede tener uno de los siguientes valores: 0: El nodo nunca se usar como rbitro. 1: El nodo tiene alta prioridad, esto es, ser preferido como rbitro sobre los nodos con baja prioridad. 2: Indica que un nodo de baja prioridad ser usado como rbitro slo si un nodo con una prioridad alta no est disponible para este propsito. Normalmente, el servidor de administracin debe configurarse como rbitro poniendo ArbitrationRank a 1 (el valor por defecto) y todos los nodos SQL a 0. [NDB_MGMD]ArbitrationDelay Un valor entero hace que las respuestas a peticiones de rbitro al servidor de administracin se retrasen el nmero de milisegundos indicado. Por defecto, este valor es 0, normalmente no es necesario cambiarlo. [NDB_MGMD]DataDir Cambia el directorio donde se guardan los ficheros de salida del servidor de administracin. Estos ficheros incluyen ficheros de log del cluster, ficheros de salida de procesos, y los ficheros pid de los demonios. (Para ficheros de log, esto puede sobreescribirse poniendo el parmetro FILE para [NDB_MGMD]LogDestination como se discute prviamente en esta seccin.)
842
Fichero de configuracin
La mayora de parmetors de los nodos de datos se inicializan en la seccin [NDBD DEFAULT] . Slo los parmetros marcados como capaces de cambiar valores locales se permiten cambiar en la seccin [NDBD] . HostName, Id y ExecuteOnComputer deben definirse en la seccin [NDBD] local. Identificar nodos de datos El valor Id (esto es, el identificador del nodo de datos) puede cambiarse en la lnea de comandos cuando se arranca el nodo o en el fichero de configuracin. Para cada parmetro es posible usar k, M, o G como sufijo para indicar unidades de 1024, 1024*1024, o 1024*1024*1024. (Por ejemplo, 100k significa 100 * 1024 = 102400.) Los parmetros y valores son sensibles a maysculas. [NBDB]Id Este es el ID del nodo usado como direccin del nodo para todos los mensajes internos del cluster. Este es un entero entre 1 y 63. Cada nodo en el cluster tiene una identidad nica. [NDBD]ExecuteOnComputer Se refiere a uno de las mquinas (equipos) definidos en la seccin COMPUTER . [NDBD]HostName Especificar este parmetro tiene un efecto similar a especificar ExecuteOnComputer. Define el nombre de equipo de la mquina en que reside el nodo de almacenamiento. Este parmetro o ExecuteOnComputer es necesario para especificar un nombre de equipo distinto a localhost. (OBSOLETO) [NDBD]ServerPort Cada nodo en el cluster usa un puerto para conectarse a otros nodos. Este puerto se usa tambin para transporte distinto a TCP en la fase de establecimiento de la conexin. Ahora, el puerto por defecto se reserva dinmicamente de forma que se asegura que dos nodos en la misma mquina reciban el mismo nmero de puerto, no debe ser necesario indicar un valor para este parmetro. [NDBD]NoOfReplicas Este parmetro global slo puede cambiarse en la seccin [NDBD DEFAULT] , y define el nmero de replicas para cada tabla almacenada en el cluster. Este parmetro tambin especifica el tamao de los grupos de nodos. Un grupo de nodos es un conjunto de nodos que almacenan todos la misma informacin. Los grupos de nodos se forman impltamente. El primer grupo de nodos se forma por el conjunto de nodos de datos con los IDs de nodo ms bajos, el siguiente grupo de nodos se conforma con el conjunto del siguiente conjunto de identidades de nodos ms baja, y as. Como ejemplo, asuma que tenemos 4 nodos de datos y que NoOfReplicas es 2. Los cuatro nodos de datos tienen los IDs 2, 3, 4 y 5. El primer grupo de nodos est formado con los nodos 2 y 3, y el segundo grupo con los nodos 4 y 5. Es importante configurar el cluster de forma que los nodos en el mismo grupo no se guarden en la misma mquina, ya que en esta situacin un fallo de hardware hara que fallare el cluster entero. Si no hay IDs de nodos el orden de los nodos de datos es el factor determinante para el grupo de nodos. Se haga o no una asignacin explcita, puede verse en la salida del comando del cliente administrador SHOW . No hay valor por defecto para NoOfReplicas; el valor mximo posible es 4. [NDBD]DataDir Este parmetro especifica el directorio donde los ficheros de traceo, ficheros de log, ficheros pid y logs de errores se guardan. 843
Fichero de configuracin
[NDBD]FileSystemPath Este parmetro especifica el directorio donde se guardan todos los ficheros para metadatos, logs de REDO, logs de UNDO y ficheros de datos. Por defecto es el directorio especificado por DataDir. Nota: Este directorio debe existir antes de inciar el proceso ndbd. La jerarqua de directorio recomendada para MySQL Cluster incluye /var/lib/mysql-cluster, bajo qu directorio se crea un sistema de ficheros de un nodo. Este subdirectorio contiene el ID del nodo. Por ejemplo, si el ID del nodo es 2, el subdirectorio se llama ndb_2_fs. [NDBD]BackupDataDir Es posible especificar el directorio en que se guardan las copias de seguridad. Por defecto, este directorio es FileSystemPath/BACKUP. (Consulte secciones anteriores.) Memoria de datos e ndice DataMemory y IndexMemory son parmetros especificando el tamao de los segmentos de memoria usados para almacenar los registros actuales y sus ndices. Al inicializar los valores de los mismos, es importante entender cmo se usan DataMemory y IndexMemory , ya que usualmente necesitan actualizarse para reflejar el uso real del cluster: [NDBD]DataMemory Este parmetro define la cantidad de espacio disponible para almacenar registros de base de datos. La cantidad entera se guardar en memoria, as que es extremadamente importante que la mquina tenga sufuciente memoria fsica para guardar este valor. La memoria reservada por DataMemory se usa para almacenar los registros y los ndices. Cada registro tiene una longitud fija . (Incluso columnas VARCHAR se almacenan como columnas de longitud fija.) Hay una sobrecarga de 16-byte para cada registro; una cantidad adicional para cada registro se necesita porque se almacena en pginas de 32KB con sobrecarga de 128 byte por pgina (consulte a continuacin). Tambin hay una pequea cantidad gastada por pgina debido al hecho que cada registro se almacena en slo una pgina. El tamao de registro mximo actualmente es de 8052 bytes. El espacio de memoria definido por DataMemory se usa para almacenar ndices ordenados, que usa acerca de 10 bytes por registor. Cada registro de tabla se representa en el ndice ordenado. Un error comn entre usuarios es asumir que todos los ndices se almacenan en la memoria reservada por IndexMemory, pero no es as: slo claves primarias e ndices hash nicos usan esta memoria; los ndices ordenados usan la memoria almacenada por DataMemory. Sin embargo, crear una clave primar nica o ndice hash nico tambin crea un ndice ordenado en la misma clave, a no ser que especifique USING HASH en el comando de creacin del ndice. Esto puede verificarse ejecutando ndb_desc -d db_name table_name en el cliente de administracin. El espacio de memoria reservado por DataMemory consiste en 32KB pginas, que se reservan en fragmentos de tabla. Cada tabla se particiona normalmente en el mismo nmero de fragmentos como hay nodos de datos en el cluster. Por lo tanto, por cada nodo, hay el mismo nmero de fragmentos as como se especifica en NoOfReplicas. Una vez que una pgina se ha reservado, no es posible retornarla al pool de pginas libres, excepto borrando la tabla. Ejecutar el modo de recuperacin tambin comprime la particin ya que todos los registros se insertan en particiones vacas por parte de los otros nodos vivos. El espacio de memoria DataMemory tambin contiene informacin UNDO: Para cada actualizacin, se reserva una copia de los registros no alterados en DataMemory. Tambin hay una referencia de cada copia en los ndices de tablas ordenadas. Los ndices hash nicos se modifican slo cuando las columnas de ndice nico se actualizan, en tal caso se inserta una nueva entrada en la tabla de ndices y la antigua entrada se borra al hacer un commit. Por esta razn, es necesario reservar espacio necesario para tratar la transaccin ms grande realizada por aplicaciones usando el 844
Fichero de configuracin
cluster. En cualquier caso, realizar unas cuantas transacciones muy grandes no tiene ventaja sobre usar muchas pequeas, por las siguientes razones: Las transacciones grandes no son ms rpidas que las pequeas. Las transacciones grandes incrementan el nmero de operaciones que se pierden y deben repetirse en caso de fallo de transaccin Las transacciones grandes usan ms memorias El valor por defecto de DataMemory es 80MB; el mnimo es 1MB. No hay tamao mximo, pero en realidad el tamao mximo tiene que adaptarse para que el proceso no empiece ha hacer swapping cuando llega al lmite. Este lmite se determina por la cantidad de RAM fsica disponible en la mquina y por la cantidad de memoria que el sistema operativo puede asignar a un proceso. Sistemas operativos 32-bit estn normalmente limitados a 2-4GB por proceso; los sistemas opertivos de 64-bit pueden usar ms. Para bases de datos grandes, puede ser preferible usar un sistema operativo 64-bit por esta razn. Adems, es posible ejecutar ms de un proceso ndbd por mquina, y esto puede ser ventajoso en mquinas con mltiples CPUs. [NDBD]IndexMemory Este parmetro controla la cantidad de almacenamiento usado por ndices hash en MySQL Cluster. Los ndices hash siempre son usados por ndices de clave primaria, ndices nicos y restricciones nicas. Tenga en cuenta que cuando define una clave primaria y un ndice nico, se crean dos ndices, uno de los cuales es un ndice hash usado por todos los accesos a tuplas as como tratamiento de bloqueos. Tambin se usa para forzar restricciones nicas. El tamao del ndice hash es de 25 bytes por registro, ms el tamao de la clave primaria. Para claves primarias mayores a 32 bytes se aaden otros 8 bytes . Considere una tabla definida por
CREATE TABLE example ( a INT NOT NULL, b INT NOT NULL, c INT NOT NULL, PRIMARY KEY(a), UNIQUE(b) ) ENGINE=NDBCLUSTER;
Hay una sobrecarga de 12 bytes (tener columnas no nulas ahorra 4 bytes de sobrecarga) ms 12 bytes de datos por registro. Adems tenemos dos ndices ordenados en las columnas a y b consumiendo cerca de 10 bytes cada uno por registro. Hay un ndice hash de clave primaria en la tabla base con unos 29 bytes por registro. La restriccin nica se implementa por tablas separadas con b como clave primaria y a como columna. Esta tabla consumir otros 29 bytes de memoria de ndice por registro en la tabla ejemplo as como 12 bytes de sobrecarga, ms 8 bytes de datos de registros. As, para un milln de registros, necesitamos 58 MB para memoria de ndices para tratar los ndices hash para la clave primaria y la restriccin nica. Tambin necesitamos 64 MB para los registros de la tabla base y la tabla de ndice nico, ms las dos tablas con ndice ordenado. Puede ver que los ndices hash tienen una buena cantidad de espacio de memoria; sin embargo, proporcionan acceso muy rpido a los datos retornados. Tambin se usan en MySQL Cluster para tratar restricciones nicas. Actualmente el nico algoritmo de particin es hashing y los ndices ordenados son locales para cada nodo. Por lo tanto los ndices ordenados no pueden usarse para tratar restricciones nicas en caso general.
845
Fichero de configuracin
Un punto importante paraIndexMemory y DataMemory es que el tamao de base de datos total es la suma de toda la memoria de datos y toda la memoria de ndice para cada grupo de nodos. Cada grupo de nodos se usa para guardar informacin replicada, as que si hay cuatro nodos con 2 rplicas, habr dos nodos de grupos. Por lo tanto, la cantidad total de memoria disponible es 2*DataMemory para cada nodo de datos. Se recomienda que DataMemory y IndexMemory se inicialice con el mismo valor para todos los nodos. Desde que los datos se distribuyen eventualmente sobre todos los nodos en el cluster la cantidad de espacio mxima disponible no es mejor que la del menor nodo del cluster. DataMemory y IndexMemory pueden cambiarse, pero decrementar cualquiera de ellos puede ser arriesgado; al hacerlo puede hacer que un nodo o incluso el cluster entero no sea capaz de reiniciar debido a que hay memoria insuficiente. Incrementar estos valores est bien, pero se recomienda que estas actualizaciones se realicen de la misma manera que una actualizacin de software, comenzando con una actualizacin del fichero de configuracin, y luego reiniciando el servidor de administracin seguido del reinicio de cada nodo de datos. Las actualizaciones no incrementan la cantidad de memoria ndice usada. Las inserciones tienen efecto inmediatamente; sin embargo, los registros no se borran realmente hasta que la transaccin hace un commit. El valor por defecto para IndexMemory es 18MB. El mnimo es 1MB. Parmetros de transaccin Los siguientes tres parmetros que discutimos son importanets porque afectan al nmero de transacciones paralelas y los tamaos de transacciones que pueden tratarse por el sistema. MaxNoOfConcurrentTransactions es el nmero de transacciones posibles en un nodo; MaxNoOfConcurrentOperations es el nmero de registros que pueden estar en fase de actualizacin o bloqueados simultneamente. Ambos parmetros (especialmente MaxNoOfConcurrentOperations) son objetivos probables para que los usuarios especifiquen valores especficos y no usen el valor por defecto. El valor por defecto es para sistemas con transacciones pequeas, para asegurar que no usan excesiva cantidad de memoria. [NDBD]MaxNoOfConcurrentTransactions Para cada transaccin activa en el cluster debe haber un registro en uno de los nodos del cluster. La tarea de coordinar transacciones se enva entre los nodos: el nmero total de registros de transacciones en el cluster es el nmero de transacciones en cualquier nodo por el nmero de nodos en el cluster. Los registros de transacciones se guardan en servidores MySQL individuales. Normalmente al menos hay un registro de transaccin por conexin que usa cualquier tabla en el cluster. Por esta razn, debe asegurarse que hay ms registros de transacciones en el cluster que conexiones concurrentes en todos los servidores MySQL del cluster. Este parmetro debe inicializarse al mismo valor para todos los nodos del cluster. Cambiar este parmetro nunca es seguro y puede causar que un cluster falle. Cuando un nodo falla uno de los nodos (el nodo superviviente ms antiguo) levanta el estado de transaccin de todas las transacciones que haya en funcionamiento en todos los nodos que han fallado cuando ha ocurrido el fallo. Por lo tanto es importante que este nodo tenga tantos registros de transaccin como el nodo que ha fallado. El valor por defecto para este parmetro es 4096. [NDBD]MaxNoOfConcurrentOperations 846
Fichero de configuracin
Es una buena idea ajustar el valor de este parmetro segn el tamao y nmero de transacciones. Cuando se realizan transacciones de slo unas cuantas operaciones y que no involucren muchos registros, no hay necesidad de inicializar este parmetro con un valor muy alto. Cuando realiza transacciones grandes involucrando muchos registros necesita cambiar a un valor mayor este parmetro. Los registros se mantienen para cada transaccin que actualice los datos del cluster, tanto en el coordinador de la transaccin como en los nodos donde se hacen las actualizaciones. Estos registros contienen informacin de estado necesaria para encontrar registros UNDO para deshacer cambios, bloquear colas y otros propsitos. Este parmetro debe inicializarse al nmero de registros a actualizar simultneamente en transacciones, dividido por el nmero de nodos de datos del cluster. Por ejemplo, en un cluster que tenga 4 nodos de datos y del que se espera que trate 1,000,000 de actualizaciones concurrentes usando transacciones debe inicializar este valor a 1000000 / 4 = 250000. Leer consultas que hacen bloqueos hace que se creen registros. Se reserva un espacio extra en los nodos individuales para los casos en que la distibucin no es perfecta entre los nodos. Cuando las consultas usan el ndice hash nico, hay dos registros de operacin usados para registrar la transaccin. El primer registro representa la lectura en la tabla ndice y el segundo trata la operacin en la tabla base. El valor por defecto para este parmetro es 32768. Este parmetro trata dos valores que se pueden configurar separadamente. El primero de ellos especifica cuntos registros de operacin se tienen que situar en el coordinador de la transaccin. La segunda parte especifica cuntos registros de operacin sern locales en la base de datos. Una transaccin muy grande realizada en un cluster de 8 nodos requiere tantos registros de operacin en el coordinador de transaccin como lecturas, actualizaciones y operaciones de borrado involucradas en la transaccin. Sin embargo, los registros de operacin se envan a los 8 nodos. Por lo tanto, si es necesario configurar el sistema para una transaccin muy grande, es buena idea configurar las dos partes por separado. MaxNoOfConcurrentOperations se usar siempre para calcular el nmero de registros de operacin en la porcin del coordinador de transaccin del nodo. Es importante tener una idea de los requerimientos de memoria para registros de operaciones. Actualmente es aproximadamente 1KB por registro. [NDBD]MaxNoOfLocalOperations Por defecto, este parmetro se calcula como 1.1 * MaxNoOfConcurrentOperations que encaja en sistemas con muchas transacciones simultneas, ninguna de ellas demasiado grande. Si hay una necesidad de tratar una transaccin muy grande de golpe y hay muchos nodos, es buena idea sobreescribir el valor por defecto especificando explcitamente este parmetro. Almacenamiento temporal de transacciones El siguiente conjunto de parmetros se usa para determinar almacenamiento temporal al ejecutar una consulta que es parte de una transaccin de Cluster. Todos los registros se liberan al completar la consulta y el cluster espera para un commit o rollback. Los valores por defecto de estos parmetros son adecuados para la mayora de situaciones. Sin embargo, los usuarios con necesidad de soportar transacciones que involucren gran cantidad de registros u operaciones pueden necesitar incrementarlos para activar un mejor paralelistmo en el sistema, mientras que los usuarios cuyas aplicaciones necesitan transacciones relativamente pequeas pueden decrementar los valores para ahorrar memoria. [NDBD]MaxNoOfConcurrentIndexOperations 847
Fichero de configuracin
Para consultas usando un ndice hash nico, el conjunto temporal de registros de operaciones se usa durante la fase de ejecucin de una consulta. Este parmetro delimita el tamao del conjunto de registros. As este registro slo se reserva mientras se ejecuta una parte de una consulta, en cuanto ha acabado la ejecucin se libera el registro. El estado necesario para tratar abortos y commits se trata mediante los registros operacionales normales donde el tamao del pool se asigna por el parmetro MaxNoOfConcurrentOperations. El valor por defecto de este parmetro es 8192. Slo en casos raros de paralelismo extremadamente alto usando ndices hash nicos debera ser necesario incrementar este valor. Usar un valor menor es posible y puede ahorrar memoria si el DBA est seguro que un cierto grado de paralelismo no es necesario en el cluster. [NDBD]MaxNoOfFiredTriggers El valor por defecto de MaxNoOfFiredTriggers es 4000, que es suficiente para la mayora de situaciones. En algunos casos puede decrementarse si el DBA est seguro que el cluster no necesita un paralelismo alto. Se crea un registro cuando se realiza una operacin que afecta un ndice hash nico. Insertar o borrar un registro en una tabla con ndices hash nicos o actualizar una columna que es parte de un ndice hash nico provoca una insercin o borrado en la tabla ndice. El registro resultante se usa para representar esta operacin de la tabla ndice mientras se espera a que la operacin original se complete. Esta operacin tiene una vida corta pero puede requerir un gran nmero de registros en su pool para situaciones en que muchas operaciones de escritura paralelas en una tabla base que contenga un conjunto de ndices hash nicos. [NDBD]TransactionBufferMemory La memoria afectada por este parmetro se usa para tracear operaciones disparadas al actualizar tablas ndice y leer ndices nicos. Esta memoria se usa para almacenar la informacin de clave y columna para estas opraciones. Es muy raro que el valor de este parmetro necesite alterarse. Las operaciones normales de lectura y escritura usan un bffer similar, cuyo uso es incluso de vida ms corta. El parmetro de tiempo de compilacin ZATTRBUF_FILESIZE (que se encuentra en ndb/src/kernel/blocks/Dbtc/Dbtc.hpp) es 4000*128 bytes (500KB). Un buffer similar para informacin de claves, ZDATABUF_FILESIZE (tambin en Dbtc.hpp) contiene 4000*16 = 62.5KB de tamao de bffer. Dbtc es el mdulo que trata la coordinacin de transacciones. Escaneos y bffering Hay parmtros adicionales en el mdulo Dblqh (en ndb/src/kernel/blocks/Dblqh/Dblqh.hpp) que afecta a lecturas y actualizaciones. Incluyen ZATTRINBUF_FILESIZE, por defecto 10000*128 bytes (1250KB) y ZDATABUF_FILE_SIZE, por defecto 10000*16 bytes (unos 156KB) de tamao de buffer. Hasta hoy, no ha habido ningn reporte de usuarios ni resultados de nuestros tests que sugieran que deba incrementarse estos lmites en tiempo de compilacin. El valor por defecto de TransactionBufferMemory es 1MB. [NDBD]MaxNoOfConcurrentScans Este parmetro se usa para controlar el nmero de escaneos paralelos que pueden realizarse en el cluster. Cada coordinador de transaccin puede tratar el nmero de escaneos paralelos definidos por este parmetro. Cada consulta de escaneo se realiza escaneando todas las particiones en paralelo. Cada escaneo de particin usa un registro de escaneo en el nodo donde se encuentra la particin, siendo el nmero de registros el valor de este parmetro por el nmero de nodos. El clster debe ser capaz de sostener MaxNoOfConcurrentScans escaneos concurrentes de todos los nodos en el cluster. Los escaneos se realizan en dos casos. El primero cuando no existe un ndice hash u ordenado para tratar la consulta, en cuyo caso la consulta se ejecuta realizando un escaneo de la tabla
848
Fichero de configuracin
completa. El segundo caso se encuentra cuando no hay ndice hash para soportar la consulta pero hay un ndice ordenado. Usar el ndice ordenado significa ejecutar un escaneo de rango paralelo. Como el orden se mantiene en las particiones locales slo, es necesario realizar el escaneo de ndice en todas las particiones. El valor por defecto de MaxNoOfConcurrentScans es 256. El valor mximo es 500. Este parmetro especifica el nmero de escaneos posibles en el coordinador de transaccin. Si el nmero de registros de escaneos locales no se proporciona, se calcula como el producto de MaxNoOfConcurrentScans y el nmero de nodos de datos en el sistema. [NDBD]MaxNoOfLocalScans Especifica el nmero de registros de escaneo locales si varios escaneos no estn paralelizados completamente. [NDBD]BatchSizePerLocalScan Este parmetro se usa para calcular el nmero de registros bloqueados que necesitan estar ah para tratar varias operaciones de escaneo concurrentes. El valor por defecto es 64; este valor tiene una fuerte conexin con ScanBatchSize definido en los nodos SQL. [NDBD]LongMessageBuffer Este es un buffer interno usado para pasar mensajes entre nodos individuales y entre nodos. Aunque es muy improbable que este valor deba cambiarse, es configurable. Por defecto es 1MB. Registro y establecer Checkpoins [NDBD]NoOfFragmentLogFiles Este parmetro especifica el tamao del fichero de log REDO del nodo. Los ficheros de log REDO se organizan en un anillo. Es muy importante que el fichero primero y ltimo del log (a veces conocidos como "cabeza" y "cola", respectivamente) no se encuentren; cuando se aproximan el uno al otro demasiado, el nodo empieza a abortar todas las transacciones que realizan actualizaciones debido a la falta de espacio para nuevos registros de log. Un registro de log REDO no se elimina hasta que se han completado tres checkpoints locales desde la insercin del ltimo registro del log. Establecer checkpoints frecuentemente viene determinado por su propio conjunto de parmetros de configuracin discutidos en este captulo. El valor por defecto del parmetro es 8, que significa 8 conjuntos de 4 ficheros de 16MB para un total de 512MB. En otras palabras, el espacio de log REDO debe reservarse en bloques de 64MB. En escenarios que necesitan muchas actualizaciones, el valor de NoOfFragmentLogFiles puede necesitar ser tan grande como 300 o incluso mayor para proporcionar suficiente espacio para logs REDO. Si se hacen pocos checkpoings y hay tantas escrituras en la base de datos que los ficheros de log se llenan y la cola de logs no puede cortarse sin recuperacin jeapo rdising , se abortan todas las transacciones con un cdigo de error interno 410, o Out of log file space temporarily. Esta condicin prevalecer hasta que se complete un checkpoint y se mueva la cola de log. [NDBD]MaxNoOfSavedMessages Este parmetro especifica el mximo nmero de ficheros de traceo que se mantienen antes de sobreescribir los antiguos. Los ficheros de traceo se generan cuando, por alguna razn, el nodo cae. Por defecto son 25 ficheros de traceo. Objetos de metadatos
849
Fichero de configuracin
El siguiente conjunto de parmetros definen tamaos de pool para objetos de metadatos. Es necesario definir el mximo nmero de atributos, tablas, ndices y disparadores usados por ndices, eventos y replicaciones entre clusters. [NDBD]MaxNoOfAttributes Define el nmero de atributos que pueden definirse en el cluster. El valor por defecto para este parmetro es 1000, cuyo valor mnimo posible es 32. No hay mximo. Cada atributo consume acerca de 200 bytes de almacenamiento por nodo debido a que todos los metadatos estn replicados en los servidores. [NDBD]MaxNoOfTables Se reserva un objeto tabla para cada tabla, ndice hash nico e ndice ordenado. Este parmetro especifica el mximo nmero de objetos tabla para el cluster en total. Para cada atributo que tiene un tipo de datos BLOB se usa una tabla extra para almacenar la mayora de datos BLOB . Estas tablas deben tenerse en cuenta al definir el nmero total de tablas. El valor por defecto es 128. El mnimo es 8 y el mximo es 1600. Cada objeto tabla consume aproximadamente 20KB por nodo. [NDBD]MaxNoOfOrderedIndexes Para cada ndice ordenado en este cluster, un objeto se reserva que describe lo que se indexa y sus segmentos de almacenamiento. Por defecto cada ndice definido as tambin define un ndice ordenado. Cada ndice nico y clave primaria tiene un ndice ordenado e ndice hash. El valor por defecto es 128. Cada objeto consume unos 10KB de datos por nodo. [NDBD]MaxNoOfUniqueHashIndexes Para cada ndice nico que no sea clave primaria, se reserva una tabla especial que mapea la clave nica con la clave primaria de la tabla indexada. Por defecto hay un ndice ordenado que se define para cada ndice nico. Para evitarlo, debe usar la opcin USING HASH al definir el ndice nico. El valor por defecto es 64. Cada ndice consume aproximadamente 15KB por nodo. [NDBD]MaxNoOfTriggers Los disparadores internos de actualizacin, insercin y borrado se reservan para cada ndice hash nico. (Esto significa que se crean 3 disparadores para cada ndice hash.) Sin embargo, un ndice ordenado necesita slo un objeto disparador. Las copias de seguridad tambin usan tres objetos disparadores para cada tabla normal en el cluster. Nota: Cuando se soporta replicacin entre clusters, esta har uso de disparadores internos. Este parmetro inicializa el nmero mximo de objetos disparadores en el cluster. El valor por defecto es 768. [NDBD]MaxNoOfIndexes Este parmetro est obsoleto en MySQL 5.0; debe usar MaxNoOfOrderedIndexes y MaxNoOfUniqueHashIndexes en su lugar. Este parmetro se usa slo en ndices hash nicos. Debe haber un registro en este pool para cada ndice hash nico definido en el cluster. El valor por defecto es 128. Parmetros booleanos
850
Fichero de configuracin
El comportamiento de los nodos de datos se ve afectado por un conjunto de parmetros booleanos. Estos parmetros pueden especificarse como TRUE ponindolos a 1 o Y, y como FALSE ponindolos a 0 o N. [NDBD]LockPagesInMainMemory Para algunos sistemas operativos, incluyendo Solaris y Linux, es posible bloquear el proceso en memoria y evitar el swapping de disco. Esto puede usarse para ayudar a garantizar las caractersticas de tiempo real del cluster. Por defecto, esta caracterstica est desactivada. [NDBD]StopOnError Este parmetro especifica si un proceso NDBD debe salir o reiniciarse automticamente cuando se encuentra una condicin de error. Esta caracterstica est activada por defecto. [NDBD]Diskless Es posible especificar tablas cluster como diskless, que significa que no se hacen checkpoints en disco y que no se registran. Estas tablas slo existen en memoria. Una consecuencia de usar estas tablas es que no se pueden mantener tras una caida. Sin embargo, cuando el modo diskless est operativo se puede ejecutar ndbd en una mquina sin disco. Nota: Actualmente, esta caracterstica hace que el cluster entero funcione en modo diskless. Actualmente, cuando est caracterstica est activa, las copias de seguridad se realizan pero los datos no se almacenan. En futuras versiones esperamos hacer la copia de seguridad diskless un parmetro separado y configurable. Esta caracterstica est activada mediante poner Diskless a 1 o Y. Diskless est desactivado por defecto. [NDBD]RestartOnErrorInsert Esta caracterstica es accesible slo al compilar la versin de debug cuando es posible insertar errores en la ejecucin de bloques de cdigo individuales como parte del testeo. Por defecto, esta caracterstica est desactivada. Controlar timeouts, intervalos y paginacin de disco Hay un nmero de parmetros que especifican timeouts e intervalos entre varias acciones en nodos de datos del culster. La mayora de los timeouts se especifican en milisegundos. Cualquier excepcin se menciona a continuacin. [NDBD]TimeBetweenWatchDogCheck Para evitar que el flujo principal quede en un bucle sin fin en algn punto, un watchdog chequea el flujo principal. Este parmetro especifica el nmero de milisegundos entre chequeos. Si el proceso sigue siendo el mismo tras tres chequeos, lo mata el flujo watchdog. Este parmetro puede cambiarse fcilmente para propsitos de experimentacin o para adaptar las condiciones locales. Puede especificarse por nodo aunque parece que no hay grandes razones para hacerlo. El timeout por defecto es de 4000 milisegundos (4 segundos). [NDBD]StartPartialTimeout 851
Fichero de configuracin
Este parmetro especifica lo que esperar el cluster para que arranquen los nodos de almacenamiento cuando se invoca la rutina de inicializacin . Este timeout se usa para evitar un arranque parcial del cluster cuando es posible. El valor por defecto es de 30000 milisegundos (30 segundos). 0 significa timeout eterno; en otras palabras, el cluster puede arrancar slo si todos los nodos estn disponibles. [NDBD]StartPartitionedTimeout Si el cluster est preparado para arrancar tras esperar durante StartPartialTimeout milisegundos pero todava es posible en un estado particionado, el cluster espera hasta que este timeout pasa. El timeout por defecto es 60000 milisegundos (60 segundos). [NDBD]StartFailureTimeout Si un nodo de datos no ha completado su secuencia de arranque en el tiempo especificado por este parmetro, el arranque del nodo falla. Poner este parmetro a 0 significa que no se aplica ningn timeout para el nodo de datos. El valor por defecto es 60000 milisegundos (60 segundos). Para los nodos de datos con cantidades de datos extremadamente grandes, este parmetro debe incrementarse. Por ejemplo, en el caso de un nodo de almacenamiento que contenga varios gigabytes de datos, un perido de 10-15 minutos (esto es, 600,000 a 1,000,000 milisegundos) puede ser necesario para realizar una reinicializacin de nodo. [NDBD]HeartbeatIntervalDbDb Uno de los mtodos primarios de descubrimiento de nodos fallidos es el uso de heartbeats. Este parmetro refleja la frecuencia con que las seales heartbeat se envan y con que frecuencia se espera su recepcin. Tras perder tres intervalos heartbeat seguidos, el nodo se declara muerto. As el mximo tiempo para descubrir un fallo a travs del mecanismo heartbeat es cuatro veces el intervalo heartbeat. El intervalo de heartbeat por defecto es de 1500 milisegundos (1.5 segundos). Este parmetro no debe cambiarse drsticamente y no debe variar demasiado entre nodos. Si un nodo usa 5000 milisegundos y el nodo observador usa 1000 milisegundos entonces bviamente se declarar muerto rpidamente. Este parmetro puede cambiarse durande una actualizacin de software en lnea pero slo en pequeos incrementos. [NDBD]HeartbeatIntervalDbApi Cada nodo de datos enva seales heartbeat a cada MySQL server (nodo SQL ) para segurar que permanece en contacto. Si un MySQL server falla para enviar un heartbeat a tiempo se declara muerto, en cuyo caso todas las transacciones activas se completan y todos los recursos se liberan. El nodo SQL no puede reconectar hasta que todas las actividades iniciadas por la instancia MySQL prvia se ha completado. El criterio de tres heartbeats para esta discriminacin es la misma que se describe en HeartbeatIntervalDbDb. El intervalo por defecto es de 1500 milisegundos (1.5 segundos). Este intervalo puede variar entre nodos de datos individuales ya que cada nodo de almacenamiento vigila los servidores MySQL conectados a ellos, independientemente de todos los otros nodos de datos.. [NDBD]TimeBetweenLocalCheckpoints Este parmetro es una excepcin en que no especifica un tiempo para esperar antes de arrancar un nuevo checkpoint local; en lugar de esto, se usa para asegurarse que los checkpoints locales no se realizan en un cluster donde tienen lugar relativamente pocas actualizaciones. En la mayora
852
Fichero de configuracin
de clusters con altos ratios de actualizacin, es probable que se arranquen checkpoints locales inmediatamente tras que se hayan completado los previos. El tamao de todas las operaciones de escritura ejecutadas desde el arranque de los chekpoints locales prvios. Este parmetro es excepcional ya que se especifica como el logaritmo en base 20 2 del nmero de palabras de 4 bytes, as que el valor por defecto 20 significa 4MB (4 * 2 ) de operaciones de escritura, 21 significara 8MB, y as hasta un mximo de 31, que son 8GB de operaciones de escritura. Todas las operaciones de escritura en el cluster se aaden juntas. Poner TimeBetweenLocalCheckpoints a 6 o menos significa que los checkpoints locales se ejecutarn contnuamente sin pausa, independientemente de la carga de trabajo del cluster. [NDBD]TimeBetweenGlobalCheckpoints Cuando se hace un commit de una transaccin, se realiza en memoria principal en todos los nodos en que los datos se replican. Sin embargo, los registros del log de transaccin no se vuelcan en disco como parte del commit. El razonamiento de este comportamiento es que tener la transaccin con un commit en al menos dos mquinas autnomas debe cumplir estndars razonables para durabilidad. Tambin es importante asegurarse que incluso el peor caso una cada completa del cluster se trata apropiadamente . Para garantizar que esto ocurre, todas las transacciones que tienen lugar dentro de un intervalo dado se ponen en un checkpoint global, que puede entenderse como un conjunto de transacciones volcadas en disco. En otras palabras, como parte del proceso de commit, una transaccin se guarda en el grupo de checkpoint global; posteriormente, este registro de log de grupo se vuelca en disco, y luego se guarda en disco el completo grupo de transacciones en todas las mquinas del cluster. Este parmetro define el intervalo entre checkpoints globales. Por defecto son 2000 milisegundos. [NDBD]TimeBetweenInactiveTransactionAbortCheck El tratamiento de time-outs se realiza chequeando un timer en cada transaccin una vez por cada intervalo especificado por este parmetro. Por lo tanto, si este parmetro se pone a 1000 milisegundos, cada transaccin se chequea para hacer un time out una vez por segundo. El valor por defecto para este parmetro es 1000 milisegundos (1 segundo). [NDBD]TransactionInactiveTimeout Si la transaccin no est realizando ninguna consulta pero esta esperando ms datos de entrada del usuario, este parmetro indica el tiempo mximo que el usuario puede esperar entes de abortar la transaccin. Por defecto este parmetro es cero (no timeout). Para una base de datos en tiempo real que necesita asegurarse que las transacciones no mantienen bloqueos demasiado tiempo se debe inicializar con un valor mucho ms pequeo. La unidad es milisegundos. [NDBD]TransactionDeadlockDetectionTimeout Cuando un nodo ejecuta una consulta que implique una transaccin, el nodo espera para que respondan los otros nodos en el cluster antes de continuar. Puede que haya un fallo al responder por cualquiera de las siguientes razones: 1. El nodo est muerto 2. La operacin ha entrado en una cola de bloqueo 3. El nodo con la peticin de realizar la accin puede estar muy sobrecargado. 853
Fichero de configuracin
Este parmetro de timeout indica cunto espera el coordinador de la transaccin para la ejecucin de la consulta por otro nodo antes de abortar la transaccin, y es importante para tratamiento de fallo de nodo y deteccin de deadlocks. Ponerlo a un valor muy alto puede causar comportamiento no deseables en situaciones que impliquen deadlocks y fallos de nodos. El timeout por defecto es 1200 milisegundos (1.2 segundos). [NDBD]NoOfDiskPagesToDiskAfterRestartTUP Al ejecutar un checkpoint local el algoritmo vuelca todas las pginas de datos a disco. Hacer esto tan rpidamente como sea posible sin ninguna moderacin es posible que imponga demasiada carga de procesador, red y disco. Para controlar la velocidad de escritura, este parmetro especifica cuntas paginas se escriben en 100 milisegundos. En este contexto, una pgina se define como 8KB; por lo tanto, este parmetro se especifica en unidades de 80KB por segundo. Por lo tanto, poner NoOfDiskPagesToDiskAfterRestartTUP a un valor de 20 significa escribir 1.6MB de pginas de datos en disco cada segundo durante checkpoints locales. Este valor incluye escribir registros del log UNDO para pginas de datos; esto es, este parmetro trata la limitacin de escrituras de memoria de datos. Los registros del log UNDO para pginas de ndice se tratan mediante los parmetros NoOfDiskPagesToDiskAfterRestartACC. (Consulte la entrada para IndexMemory para informacin acerca de pginas de ndice.) Resumiendo, este parmetro especifique con qu velocidad se realizan los checkpoints locales, y opera en conjuncin con NoOfFragmentLogFiles, DataMemory, y IndexMemory. El valor por defecto es 40 (3.2MB de pginas de datos por segundo). [NDBD]NoOfDiskPagesToDiskAfterRestartACC Este parmetro usa las mismas unidades que NoOfDiskPagesToDiskAfterRestartTUP y acta de forma similar, pero limita la velocidad de escritura de pginas ndices de memoria ndice. El valor por defecto de este parmetro es 20 pginas ndice de memoria por segundo (1.6MB por segundo). [NDBD]NoOfDiskPagesToDiskDuringRestartTUP Este parmero parecido a NoOfDiskPagesToDiskAfterRestartTUP y NoOfDiskPagesToDiskAfterRestartACC, slo lo hace en funcin de los checkpoints locales ejecutados en el nodo donde se reinicia un nodo. Como parte de todo reinicio de nodo siempre se realiza un checkpoint. Durante el reinicio de un nodo es posible escribir en disco a una velocidad superior que otras veces, ya que se realizan menos actividades en el nodo. Este parmetro cubre pginas escritas de memoria de datos. El valor por defecto es 40 (3.2MB por segundo). [NDBD]NoOfDiskPagesToDiskDuringRestartACC Controla el nmero de pginas de memoria ndice que pueden escribirse en disco durante la fase de checkpoint local del reinicio de un nodo. Como con NoOfDiskPagesToDiskAfterRestartTUP y NoOfDiskPagesToDiskAfterRestartACC, los valores para este parmetro se expresan en trminos de 8KB pginas escritas en 100 milisegundos (80KB/segundo). El valor por defecto es 20 (1.6MB por segundo). [NDBD]ArbitrationTimeout Este parmetro especifica el tiempo que esperar el nodo de datos en respuesta al rbitro. Si se excede, se asume que la red se ha partido.
854
Fichero de configuracin
El valor por defecto es de 1000 milisegundos (1 segundo). Buffering y Logueo Varios parmetros de configuracin se corresponden a antiguos parmetros en tiempo de compilacin que todava estn disponibles. Esto permite al usuario avanzado tener ms control sobre los recursos usados por los procesos nodo y para ajustar varios tamaos de buffer segn sea necesario. Estos buffers se usan como front ends para el sistema de ficheros cuando se escriben los registros de log en disco. Si el nodo est ejecutndose en modo diskless, y estos parmetros pueden cambiarse a sus valores mnimos sin penalizacin debido al hecho que las escrituras en disco se "falsean" por parte la capa de abstraccin del sistema de ficheros del motor de almacenamiento NDB. [NDBD]UndoIndexBuffer Este buffer se usa durante los checkpoints locales. El motor NDB usa un esquema de recuperacin basado en consistencia de checkpoints en conjuncin con un log REDO operacional. Para producir un checkpoint consistente con bloquear el sistema entero para escrituras, el logueo de UNDO se hace mientras se realiza el checkpoint local. El logueo UNDO se activa en un fragmento de tabla nico cada vez. Esta optimizacin es posible porque las tablas se almacenan completamente en memoria. El buffer UNDO ndice se usa para las actualizaciones en el ndice de clave hash primaria. Las inserciones y borrados modifican el ndice hash; el motor NDB escribe registros en el log UNDO que mapean todos los cambios fsicos en una pgina ndice de forma que pueden deshacerse al reiniciar al sistema. Tambin loguea todas las operaciones de inserciones activas para cada fragmento al arranque del checkpoint local. Lee y actualiza el conjunto de bits de bloquea y actualiza una cabecera en la entrada del ndice hash. Estos cambios los trata el algoritmo de escritura de pginas para asegurar que estas operaciones no necesitan logueo UNDO. Este bffer es de 2MB por defecto. El valor mnimo es de 1MB, y para la mayora de aplicaciones el mnimo es suficiente. Para aplicaciones que realicen un nmero de inserciones y borrados muy alto junto con transacciones muy grandes y claves primaria grandes, puede ser necesario incrementar el tamao de este buffer. Si el buffer es muy pequeo, el motor NDB realiza un cdigo de error interno 677 Index UNDO buffers overloaded. [NDBD]UndoDataBuffer El buffer de datos UNDO juega el mismo rol que el buffer de indice UNDO, excepto que se usa a con la memoria de datos en lugar de la de ndice. Este buffer se usa durante la fase de checkpoint local de un fragmento para inserciones, borrados y actualizaciones. Como UNDO las entradas de log tienden a crecer mayores mientras ms operaciones se loguean, este buffer tambin es mayor que su contraparte de memoria ndice, con un valor por defecto de 16MB. Para algunas aplicaciones esta cantidad de memoria puede ser innecesariamente grande. En tales casos es posible decrementar este tamao a un mnimo de 1MB. Rramente es necesario incrementar el tamao de este buffer. Si hay tal necesidad, es una buena idea chequear si el disco puede tratar la carga causada por la actividad de actualizacin de la base de datos. Una falta de espacio de disco no puede evitarse incrementando el tamao de este buffer. Si este buffer es demasiado pequeo y se congestiona, el motor NDB realiza un cdigo de error interno 891 Data UNDO buffers overloaded. [NDBD]RedoBuffer 855
Fichero de configuracin
Todas las actividades de actualizacin necesitan loguearse. Este log hace posible rehacer estas actualizaciones cuando el sistema se reinicia. El algoritmo de recuperacin NDB usa un checkpoint fuzzy de los datos junto con el log UNDO, luego aplica el log REDO para aplicar todos los cambios hasta el punto de restauracin. Este buffer es de 8MB por defecto. El valor mnimo es 1MB. Si este buffer es demasiado pequeo, el motor NDB realiza un cdigo de error 1221 REDO log buffers overloaded. Al administrar el cluster, es muy importante ser capaz de controlar el nmero de mensajes de log enviados por distintos tipos de eventos a stdout. Hay 16 niveles posibles de evento (numerados de 0 a 15). Realizar un reporte de evento para una categora de evento dada a nivel 15 significa que todos los reportes de evento en esta categora se envan a stdout; ponerlo a 0 significa que no habr reportes de eventos en esta categora. Por defecto, slo el mensaje de arranque se enva stdout, con los valores por defecto de los niveles de reporte pendientes puestos a 0 . La razn para esto es que estos mensajes tambin se envan al log de administracin del cluster. Un conjunto de niveles anlogo puede ponerse para el cliente de administracin para determinar qu niveles de evento registrar en el log de cluster. [NDBD]LogLevelStartup Reportar niveles para eventos generados durante el arranque del proceso. El nivel por defecto es 1. [NDBD]LogLevelShutdown El nivel de reporte para eventos generados como parte de un cierre de un nodo. El nivel por defecto es 0. [NDBD]LogLevelStatistic El nivel de reporte para eventos estadsticos tales como nmero de lecturas de clave primaria, nmero de actualizaciones, nmero de inserciones, informacin acerca del uso de bffer, y as. El nivel por defecto es 0. [NDBD]LogLevelCheckpoint Nivel de reporte para eventos generados por los checkpoints locales y globales. El nivel por defecto es 0. [NDBD]LogLevelNodeRestart Nivel de reporte para eventos generados durante reinicio de nodo. El nivel por defecto es 0. [NDBD]LogLevelConnection El nivel de reporte para eventos generados por conexiones entre nodos del cluster. El nivel por defecto es 0. [NDBD]LogLevelError 856
Fichero de configuracin
Nivel de reporte para eventos generados por errores y advertencias por el cluster global. Estos errores no causan ningn fallo de nodo pero se considera que vale la pena de reportar. El nivel por defecto es 0. [NDBD]LogLevelInfo Nivel de reporte para eventos generados por informacin acerca del estado general del cluster. El nivel por defecto es 0. Parmetros de copia de seguridad Los parmetros de esta seccin definen buffers de memoria para ejecucin de copias de seguridad en lnea. [NDBD]BackupDataBufferSize Al crear una copia de seguridad, hay dos bffers usados para enviar data a disco. El buffer de copia de seguridad de datos se usa para rellenar con datos registrados al escanear las tablas de un nodo. Una vez que este buffer se ha rellenado al nivel especificado por BackupWriteSize (vea a continuacin), las pginas se envan a disco. Al volcar los datos a disco, el proceso de copia de seguridad puede continuar rellenando este buffer hasta que se queda sin espacio. Cuando ocurre, el proceso de copia de seguridad pausa el escaneo y espera hasta que se completan algunas escrituras en disco y han liberado memoria de forma que pueda continuar el escaneo. El valor por defecto de este paremtro es 2MB. [NDBD]BackupLogBufferSize El buffer de log de copia de seguridad tiene un rol similar al jugado por el buffer de copia de seguridad de datos , excepto que se usa para generar un log de todas las escrituras de tabla realizadas durante la ejecucin de una copia de seguridad. Los mismos principios se aplican para escribir estas pginas como con el buffer de datos de copia de seguridad, excepto que cuando no hay ms espacio en el buffer de log de copia de seguridad, la copia falla. Por esta razn, el tamao del buffer de log de copia de seguridad debe ser lo bastante grande para tratar la carga causada por las actividades de escritura mientras se realiza la copia de seguridad. El valor por defecto de este parmetro debe ser suficiente para la mayora de aplicaciones. De hecho, es ms fcil que un fallo de copia de seguridad sea causado por velocidad de escritura en disco insuficiente que por que el buffer de log est lleno. Si el subsistema de disco no est configurado para la carga de escritura causada por las aplicaciones, el cluster posiblemente ser capaz de realizar las operaciones deseadas. Es preferible configurar nodos del cluster de forma que el procesador sea el cuello de botella en lugar que los discos o las conexiones de red. El valor por defecto es 2MB. [NDBD]BackupMemory Este parmetro es la suma de BackupDataBufferSize y BackupLogBufferSize. El valor por defecto es 2MB + 2MB = 4MB. [NDBD]BackupWriteSize Este parmetro especifica el tamao de los mensajes escritos en disco por los buffers de log y datos de copia de seguridad. El valor por defecto es 32KB.
857
Fichero de configuracin
Fichero de configuracin
nodo y el servidor de administracin. (Para una excepcin a esta regla consulte Seccin 16.4.4.8, Conexiones TCP/IP de MySQL Cluster usando conexiones directas.) Slo es necesario definir una conexin para sobreescribir los parmetros por defecto de conexin. En tal caso es necesario definir al menos NodeId1, NodeId2, y los parmetros a cambiar. Es posible cambiar los valores por defecto para estos parmetros cambindolos en la seccin [TCP DEFAULT] . [TCP]NodeId1 , [TCP]NodeId2 Para identificar una conexin entre dos nodos es necesario proporcionar los identificadores de nodo para ambos en la seccin [TCP] del fichero de configuracin. [TCP]SendBufferMemory TCP usa un buffer para almacenar todos los mensajes antes de realizar la llamada de envo del sistema operativo. Cuando este buffer llega a 64KB sus contenidos se envan; tambin se envan cuando se ha ejecutado una ronda de mensajes. Para tratar situaciones de sobrecarga temporal es posible definir un buffer de envio mayor. El tamao por defecto del buffer de envo es 256KB. [TCP]SendSignalId Para poder trazar un diagrama de mensaje distribudo es necesario identificar cada mensaje. Cuando este parmetro es Y, los IDs de mensaje se transportan por la red. Esta caracterstica est desactivada por defecto. [TCP]Checksum Este parmetro es booleano (Y/N o 1/0) , y est desactivado por defecto. Cuando est activado, los checksums de todos los mensajes se calculan antes de ponerlos en el buffer de envo. Esta caracterstica se asegura que los mensajes no se corrompan mientras esperan en el buffer de envo, o por el mecanismo de transporte. [TCP]PortNumber (OBSOLETO.) Antiguamente especificada el nmero de puerto a usar para escuchar las conexiones de otros nodos. Este paremtro no debe usarse ms. [TCP]ReceiveBufferMemory Especifica el tamao del buffer usado al recibir datos del socket TCP/IP . No hay necesidad de cambiar el valor por defecto de este parmetro de 64KB, excepto para ahorrar memoria.
859
Fichero de configuracin
Id=2 HostName=172.23.72.21 # Data Nodes [NDBD] Id=3 HostName=172.23.72.22 [NDBD] Id=4 HostName=172.23.72.23 # TCP/IP Connections [TCP] NodeId1=3 NodeId2=4 HostName1=1.1.0.1 HostName2=1.1.0.2
El uso de conexiones directas entre nodos de datos puede mejorar la eficiencia global del cluster permitiendo a los nodos de datos cortocircuitar un equipo de Ethernet como un switch, hub o router, disminuyendo la latencia del cluster. Es importante tener en cuenta que para obtener el mayor rendimiento de las conexiones directas con ms de 2 nodos de datos, necesitar tener una conexin directa entre cada datos de nodos y cada uno de los nodos de datos en el mismo grupo de nodos.
860
Fichero de configuracin
Esta caracterstica evita que los mensajes se corrompan mientras esperan en el buffer de envo. Tambin sirve como chequeo para que no se corrompan los datos durante el transporte.
861
[SCI]Checksum Este parmetro es un valor booleano, y est desactivado por defecto. Cuando Checksum est activado, los checksums se calculan para todos los mensajes antes de ponerlos en el buffer de envo. Esta caracterstica evita que los mensajes se corrompan mientras esperan en el buffer de salida durante el transporte.
16.5.1. El uso del proceso del servidor MySQL para MySQL Cluster
mysqld es el proceso de MySQL server tradicional. mysqld debe compilarse con soporte para el motor NDB Cluster , como lo est en los binarios -max precompilados disponibles en mysql.com. Si el binario mysqld se ha compilado de esta forma, el motor NDB Cluster todava est desactivado por defecto. Tiene dos opciones para activar el motor NDB Cluster : Use --ndbcluster como opcin de arranque para mysqld Inserte una lnea con ndbcluster en la seccin [mysqld] en el fichero my.cnf . Una forma sencilla de verificar que su servidor est ejecutando el motor NDB Cluster es ejecutar el comando SHOW ENGINES en MySQL Monitor (mysql). Debe ver el valor YES en el registro NDBCLUSTER; si ve NO en este registro (o si no se muestra este registro en la salida), no est ejecutando la versin NDB-activada de mysqld. Si ve DISABLED en este registro, entonces su servidor es capaz de usar el motor NDBCLUSTER , pero debe activarse mediante algunos de los mtodos ya descritos. Para leer los datos de configuracin del cluster, el MySQL server necesita como mnimo 3 informaciones: El ID del nodo del servidor MySQL. El nombre de equipo o direccin IP para el servidor de administracin (nodo MGM). El puerto en el que puede conectarse al servidor de administracin. Los ID de nodo pueden registrarse dinmicamente en MySQL 5.0, as que no es estrictamente necesario especificarlo explcitamente. El parmetro de mysqld ndb-connectstring se usa para especificar el connectstring en la lnea de comandos al arrancar mysqld o en my.cnf. El connectstring contiene el nombre de equipo o direcciones IP as como el puerto donde puede encontrarse el servidor de administracin. En el siguiente ejemplo, ndb_mgmd.mysql.com es el equipo en que reside el servidor de administracin, y el servidor de administracion escucha los mensajes del cluster en el puerto 1186:
shell> mysqld --ndb-connectstring=ndb_mgmd.mysql.com:1186
Consulte Seccin 16.4.4.2, El connectstring de MySQL Cluster para ms informacin sobre los connectstrings. Dada esta informacin el servidor MySQL ser un participante activo del cluster. (En ocasiones nos referimos a un proceso mysqld que se ejecute de este modo como nodo SQL.) Ser consciente de todos los nodos de datos del cluster as como de su estado, y establecer conexiones con todos los
862
nodos de datos. En este caso, es capaz de usar cualquier nodo de datos como un coordinador de transaccin y para acceder nodos de datos para leer y actualizar.
ndb_<NodeID>_trace.log.<TraceID> es un fichero de traceo que describe exactamente qu ha ocurrido jusnto antes de que ocurra el error. Esta informacin es til para su anlisis por parte del equipo de desarrollo de MySQL Cluster . Es posible configurar el nmero de estos ficheros de traceo que se crean antes que los ficheros antiguos se sobreescriban. <TraceID> es un nmero que se incrementa para cada fichero de traceo sucesivo. ndb_<NodeID>_trace.log.next es el fichero que se encarga del siguiente nmero de traceo para fichero a asignar. ndb_<NodeID>_out.log es un fichero que contiene cualquier salida de datos del proceso ndbd . Este fichero se crea slo si ndbd se arranca como demonio. ndb_<NodeID>.pid es un fichero que contiene el ID de proceso del proceso ndbd cuando se arranca como demonio. Tambin funciona como fichero de bloqueo para evitar arrancar los nodos con el mismo identificador. ndb_<NodeID>_signal.log es un fichero usado slo en versiones de depuracin de ndbd, donde es posible tracear toda la entrada, salida, y mensajes internos con sus datos en el proceso ndbd . Se recomiendo no usar un directorio montado mediante NFS porque en algunos entornos puede causar problemas donde el bloqueo del fichero pid sigue en efecto tras la finalizacin del proceso. Al reiniciar ndbd puede ser necesario especificar un nombre de equipo del servidor de administracin y el puerto en que est escuchando. (Opcionalmente, se puede especificar el ID de nodo que usar el proceso.
863
Consulte Seccin 16.4.4.2, El connectstring de MySQL Cluster para ms informacin sobre este tema. Cuando ndbd arranca, inicia dos procesos. El primero de ellos se llama el proceso angel process; su trabajo es descubrir cundo se completa el proceso de ejecucin, y luego reinicia el proceso ndbd si se configura para hacerlo. Por lo tanto, is trata de matar ndbd via comando Unix kill , es necesario matar a ambos procesos. Una forma ms adecuada de matar un proceso ndbd es usar el cliente de administracin y parar el proceso desde all. El proceso en ejecucin usa un flujo para lectura, escritura y escaneo de datos, as como otras actividades. Este flujo se implementa asncronamente para que pueda tratar fcilmente miles de actividades concurrentes. Adems, un flujo watch-dog supervisa el flujo de ejecucin para asegurarse que no se cuelga en un bucle infinito. Un pool de flujos trata ficheros de entrada/salida, siendo cada flujo capaz de tratar un fichero abierto. Los flujos pueden usarse por las conexiones en el proceso de transporet de ndbd . En un sistema que realice un gran nmero de operaciones, incluyendo actualizaciones, el proceso ndbd consume hasta 2 CPUs si se permite hacerlo. Para mquinas con varias CPUs se recomienda usar varios procesos ndbd que pertenecen a diferentes grupos de nodos.
864
seguridad, y realizar otras funciones administrativas. El cliente de administracin accede al servidor de administracin usando la API C que pueden emplear los usuarios avanzados para programacin dedicada a procesos de administracin que pueden realizar tareas similares a las realizadas por ndb_mgm. Al arrancar el cliente de administracin, es necesario proporcionar el nombre de equipo y puerto del servidor de administracin como en el ejemplo posterior. Los valores por defecto en MySQL 5.0 son localhost y 1186.
shell> ndb_mgm localhost 1186
Ms informacin puede acerca de ndb_mgm puede encontrarse en Seccin 16.5.5.4, Opciones de comando para ndb_mgm y Seccin 16.6.1, Comandos del cliente de administracin.
--debug[=options] Esta opcin slo puede usarse para opciones compiladas con depuracin activada. Se usa para permitir la salida de las llamadas de depuracin de la misma forma que para el proceso mysqld . -e, --execute Puede usarse para enviar un comando al ejecutable cluster desde el shell de sistema. Por ejemplo, cualquiera de los siguientes comandos:
shell> ndb_mgm -e show
o
shell> ndb_mgm --execute="SHOW"
es equivalente a
NDB> SHOW;
Esto es anlogo a cmo la opcin -e funciona con el cliente de lnea de comandos mysql . Consulte Seccin 4.3.1, Usar opciones en la lnea de comandos. 865
explcitamente por parte del servidor de administracin. Esto puede realizarse ejecutando el comando apropiado por parte del cliente de administracin.
867
El cliente de administracin tiene los siguientes comandos bsicos. En la lista que sigue, <id> dentoa un ID de nodo de base de datos o la palabra clave ALL, que indica que el comando debe aplicarse a todos los nodos de datos en el cluster. HELP Muestra informacin de todos los comandos disponibles. SHOW Muestra informaicn del estado del cluster. <id> START Arranca el nodo de datos identificado por <id> (o todos los nodos de datos). <id> STOP Para el nodo de datos identificado por <id> (o todos los nodos de datos). <id> RESTART [-N] [-I] Reinicia el nodo de datos identificado por <id> (o todos los nodos de datos). <id> STATUS Muestra informacin de estado para el nodo de datos identificado por <id> (o todos los nodos de datos). ENTER SINGLE USER MODE <id> Entra en modo de usuario nico, donde slo el servidor MySQL identificado por el ID del nodo <id> tiene permiso para acceder a la base de datos. EXIT SINGLE USER MODE Abandona el modo de usuario nico permitiendo a todos los nodos SQL (esto es, todos los procesos mysqld en ejecucin) para acceder a la base de datos. QUIT Termina el cliente de administracin. SHUTDOWN Para todos los nodos del cluster, excepto los nodos SQL, y sale. Los comandos para los logs de eventos se dan en la siguiente seccin; los comandos para creacin de copias de seguridad y restaurar de una copia de seguridad se proporcionan en una seccin separada de estos temas.
868
Ambos tipos de logueo de eventos pueden configurarse para loguear distintos subconjuntos de eventos. Nota: El log del cluster es el log recomendado para la mayora de usos, ya que proporciona informacin de logueo para un cluster entero en un nico fichero . Los logs de nodos estn pensados para ser usados slo durante desarrollo de aplicaciones, o para depurar cdigo de aplicacin. Cada evento reportable puede distinguirse segn tres criterios distintos: Categora: Puede tener uno de los siguientes valores: STARTUP, SHUTDOWN, STATISTICS, CHECKPOINT, NODERESTART, CONNECTION, ERROR, o INFO. Prioridad: Representada por un nmero de 1 a 15 incluidos, donde 1 indica ms importante y 15 menos importante. Nivel de severidad: Puede ser uno de los siguientes valores: ALERT, CRITICAL, ERROR, WARNING, INFO, o DEBUG. El log de cluster y el log de nodo pueden filtrarse con estas propiedades.
869
Los umbrales se usan para filtrar eventos dentro de cada categora. Por ejemplo, un evento STARTUP con una prioridad de 3 no se loguea a no ser que el umbral para STARTUP se cambie a 3 o menos. Slo los eventos con prioridad de 3 o menor se envan si el umbral es 3. Los niveles de seguridad de los eventos se muestran a continuacin. (Nota: Se corresponde a niveles syslog Unix, excepto para LOG_EMERG y LOG_NOTICE, que no se usan o mapean.) 1 ALERT Condicin que debe corregirse inmediatamente, tal como una base de datos de sistema corrupta
2 3 4 5 6
CRITICAL Condiciones crticas, tales como errores de dispositivos o recursos insuficientes ERROR Condiciones que deben corregirse, tales como errores de configuracin
WARNINGCondiciones que no son errores, pero que pueden requerir tratamiento especial INFO DEBUG Mensajes de informacin Mensajes de depuracin usados para desarrollo NDB Cluster
Los niveles de severidad de eventos pueden activarse o desactivarse. Si un invel de severidad se activa, todos los eventos con una prioridad menor o igual que los umbrales de categora se loguan. Si el nivel de severidad se deactiva no se loguan los eventos pertenecientes a ese nivel.
Todos los eventos reportables se discuten en esta seccin, ordenados por categora y nivel de severidad dentro de cada categora. CONNECTION Eventos Hay eventos asociados con conexiones entre nodos del cluster. Evento nodos DB conectados nodos DB desconectados comunicacin cerrada Comunicacin abierta Prioridad Nivel de Descripcin severidad 8 8 8 8 INFO INFO INFO INFO nodos de datos conectados nodos de datos desconectados conexin con nodo SQL o de datos node cerrada conexin con nodo SQL o de datos node abierta
CHECKPOINT Eventos Los mensajes de log que se muestran se asocian con checkpoints. (Nota: GCP = Global Checkpoint, LCP = Local Checkpoint.) Evento LCP parado en el clculo de mantenimiento de GCI Prioridad Nivel de Descripcin severidad 0 ALERT LCP parado
870
Fragmento de checkpoint local completo Checkpoint global completo Checkpoint global arrancado Checkpoint local completado Checkpoint local arrancado Reporte del log de undo bloqueado STARTUP Eventos
11 10 9 8 7 7
LCP en un fragmento se ha completado GCP finalizado Arranque de GCP: REDO log escrito en disco LCP completado normalmente Arranque de LCP: datos escritos en disco Logueo de UNDO bloqueado; buffer cerca de desbordarse
Los siguientes eventos se generan en respuesta al arranque de un nodo o del cluster y de su xito o fallida. Tambin proporciona informacin relacionada con el progreso del proceso de arranque, incluyendo informacin acerca de las actividades de logueo. Evento Prioridad Nivel de Descripcin severidad INFO INFO INFO INFO INFO GCI guarda X, los GCI restaurables ms nuevos Y Parte X de log, arranca MB Y, para MB Z El nodo no puede incluirse en el cluster debido a fallos de configuracin, inabilidad de establecer comunicacin, u otros problemas Muestra nodos de datos vecino Un inicio de fase de nodo se ha completado Muestra el nodo, nodo de administracin, e ID dinmico Nodos de cluster NDB arrancando Nodos NDB Cluster arrancados Parada de nodos de datos comenzada Incapaz de cerrar el nodo de datos normalmente Bloques recibidos tras completar el reinicio
Seal de arranque interna recibida 15 STTORRY Registros Undo rejecutados Arrancado nuevo log REDO Nuevo log arrancado El nodo se ha rehusado para incluir en el cluster 15 10 10 8
8 4
El nodo se ha incluido con xito en 3 el cluster Fases de arranque de nodo DB iniciadas Todas las fases de arranque del nodo DB completadas Parada de nodo DB iniciada Parada de nodo DB abortada 1 1 1 1
NODERESTART Eventos Los siguientes eventos se generan al reiniciar un nodo y estn relacionados con el xito o fracaso del proceso de reinicio del nodo. Evento Fase de fallo de nodo completa El nodo ha fallado, el estado del nodo era X Prioridad Nivel de Descripcin severidad 8 8 ALERT ALERT Rerporta la finalizacin de las fases de fallo de nodo Reporta que el nodo ha fallado
871
ALERT
Hay 8 resultados distintos posibles de arbitraciones: Chequeo de arbitracin fallido - quedan menos de 1/2 de los nodos. Chequeo de arbitracin exitoso - mayora de nodos del grupo. Chequeo de arbitracin fallido - falta un grupo de nodos. Particin de red - arbitracin necesaria Arbitracin exitosa - respuesta afirmativa del nodo X Arbitracin fallida - respuesta negativa del nodo X Particin de red - no hay rbitro disponible Particin de red - no hay rbitro configurado
Completada la copia de fragmento 10 Completada la copia de informacin de directorio Completada la copia de informacin de distribucin Iniciada la copia de fragmentos Completada la copia de todos los fragmentos Control de GCP iniciado Control de GCP completado Control de LCP iniciado Control de LCP completado (estado = X) 8 8 8 8 7 7 7 7
INFO INFO INFO INFO INFO INFO INFO INFO INFO INFO Hay 7 salidas distintas al buscar un rbitro: El servidor de administracin reinicia el flujo rbitro [estado=X] Prepara nodo rbitro X [ticket=Y] Recibe nodo rbitro X [ticket=Y] Nodo rbitro iniciado X [ticket=Y] Nodo rbitro perdido X - proceso fallido [estado=Y] Lost arbitrator node X - process exit [state=Y] Nodo rbitro perido X <error msg> [estado=Y]
872
STATISTICS Eventos Los siguientes eventos son de naturaleza estadstica. Proporcionan informacin tal como nmeros de transaccin y otras operaciones, cantidad de datos enviados o recibidos por nodos individuales, y uso de memoria. Evento Reporta estadsticas de planificacin de trabajos Nmero de bytes enviados Recibidos # bytes Reporte de estadsticas de transaccin Prioridad Nivel de Descripcin severidad 9 9 9 8 INFO INFO INFO INFO Estadsticas de planificacin de trabajos internos Nmero de bytes enviados al nodoX Nmero de bytes recibidos del nodo X Nmero de: transacciones, commits, lecturas, lecturas simples, escrituras, operaciones concurrentes, informacin de atributos, y abortos Nmero de operaciones Uso de datos e ndices (80%, 90% y 100%)
8 7 5
Estos eventos estn relacionados con errores y advertencias del cluster; la presencia de uno o ms de ellos indica generalmente que un fallo importante ha ocurrido. Evento Muerte debida a un heartbeat fallido Errores de transporte Advertencias de transporte Heartbeats perdidos Prioridad Severidad Descripcin 8 2 8 8 ALERT ERROR WARNING WARNING Nodo X ha perdido el heartbeat #Y WARNING Nodo X declarado dead debido a un heartbeat fallido
Estos eventos proporcionan informacin general sobre el estado del cluster y actividades asociadas con el mantenimiento del mismo, tales como logueo y transmisin de heartbeat . Evento Heartbeat enviado Bytes de log creado Eventos de informacin general Prioridad Severidad Descripcin 12 11 2 INFO INFO INFO Heartbeat enviado a nodo X Parte de log, fichero de log, MB
873
Tras la ejecucin de este comando y que el cluster entre en modo de usuario nico, el nodo SQL cuyo ID de nodo es 5 pasa a ser el nico usuario permitido del cluster. El nodo especificado en el comando superior debe ser un nodo MySQL Server ; Un intento de especificar cualquier otro tipo de nodo se rehusar. Nota: Cuando se invoca el comando anteior, todas las transacciones en ejecucin en el nodo designado se abortan, la conexin se cierra y el servidor debe reiniciarse. El comando EXIT SINGLE USER MODE cambia el estado de los nodos del datos del cluster de modo de usuario nico a modo normal. Los servidores MySQL esperando conexiones (esto es, a que el cluster pase a estar preparado y disponible), pueden conectarse: El servidor MySQL denotado como el nodo de usuario nico SQL contina ejecutndose (si todava est conectado) durante y tras el cambio de estado. Ejemplo:
NDB> EXIT SINGLE USER MODE
La forma recomendada de tratar un fallo de nodo al ejecutar el modo de usuario nico es una de las siguientes: 1. Terminar todas las transacciones de modo de usuario nico. 2. Ejecutar el comando EXIT SINGLE USER MODE 3. Reiniciar los nodos de datos del cluster or Reinicia los nodos de base de datos antes de entrar en modo de usuario nico.
874
por cada nodo comienza con una cabecera que explica a qu tabla pertenencen los registros. A continuacin de la lista de registros, hay un pie que contiene un checksum de los registros. BACKUP-<BackupId>.<NodeId>.log Un fichero de log con registros de transacciones finalizadas. Slo las transacciones de tablas guardadas en la copia de seguridad se guardan en el log. Los nodos involucrados en la copia de seguridad guardan distintos registros, ya que distintos nodos guardan distintos fragmentos de base de datos. En la tabla anterior <BackupId> es el identificador de la copia de seguridad y <NodeId> es el identificador nico para el nodo que crea el fichero.
Para abortar una copia en marcha: 1. Arranque el servidor de administracin. 2. Ejecute el comando 'ABORT BACKUP <BackupId>'. El nmero <BackupId> es el identificador de la copia que se incluy en la respuesta del servidor de administracin cuando se inici la copia (en el mensaje '"Backup <BackupId> started"'). 3. El servidor de administracin reconocer la peticin de aborto con Abort of backup <BackupId> ordered; tenga en cuenta que no se ha recibido todava respuesta a esta peticin. 4. Una vez que la copia de seguridad se ha abortado, el servidor de administracin reportar Backup <BackupId> has been aborted for reason msg. Esto significa que el cluster ha terminado la copia y que todos los ficheros relacionados con la misma se han eliminado del sistema de ficheros del cluster. Es posible abortar una copia de seguridad en curso desde el shell de sistema usando este comando:
shell> ndb_mgm -e "ABORT BACKUP BackupId"
Nota: Si no hay una copia con ID <BackupId> en ejecucin cuando se aborta, el servidor de administracin no hace ninguna respuesta explcita. Sin embargo, el hecho que se envi un comando de aborto incorrecto se indica en el log del cluster.
875
876
proceso de restauracin, las transacciones en ejecucin obtienen lecturas no repetibles de los datos restaurados. Esto significa que el estado de los datos es incosistente mientras que la restauracin est en marcha.
877
DIS_GPL_2_5_0_SEP_10_2004.tar.gz y SCI_SOCKET_2_3_0_OKT_01_2004.tar.gz. Debera poder encontrar estas versiones (o posteriores) en http://www.dolphinics.no/support/downloads.html. Instalacin de paquetes Una vez que tiene los paquetes con las bibliotecas, el siguiente paso es descomprimirlas en los directorios apropiados, con la biblioteca SCI Sockets en un directorio bajo el cdigo DIS. Luego, necesita compilar las bibliotecas. Este ejemplo muestra los comandos usados en Linux/x86 para realizar esta tarea:
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
Es posible compilar estas bibliotecas para algunos procesadores 64-bit. Para compilar las bibliotecas para Opteron CPUs usando la extensin 64-bit , ejecute make_PSB_66_X86_64_release en lugar a make_PSB_66_release; si la compilacin se hace en una mquina Itanium, debe usar make_PSB_66_IA64_release. La variante X86-64 debe funcionar para arquitecturas Intel EM64T pero no se ha probado. Una vez que se completa el proceso de compilacin ,las bibliotecas compiladas se encuentran en un fichero tar zipeado con un nombre entre las lneas de DIS-<operating-system>-time-date. Es hora de instalar el paquete en el lugar apropiado. En este ejemplo lo guardaremos en /opt/DIS. (Nota: Seguramente necesitar ejecutar lo siguiente como root del sistema.)
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
Configuracin de red Ahora que todos los binarios y bibliotecas estn en su lugar adecuado, necesitamos asegurarnos que las tarjetas SCI tiene IDs de nodo adecuados en el espacio de direcciones SCI. Es necesario decidir la estructura de red antes de seguir. Hay tres tipo de estructura de red que pueden usarse en este contexto: Anillo simple unidimensional Uno o ms switches con un anilo para cada puerto de switch Un toro de dos o tres dimensiones. Cada una de estas topologas tiene su propio mtodo para proporcionar Ids de nodo. Discutimos cada una de las mismas brvemente. Un anillo simple usa IDs de nodo que son mltipes de 4 distintos a cero: 4, 8, 12,... La siguiente posibilidad usa swithces SCI. Un switch SCI tiene 8 puertos, cada uno de los cuales puede soportar un anillo. Es necesario asegurarse que distintos anillos usan distintos espacios de nombres. En una configuracin tpica, el primer puerto usa IDs de nodo por debajo de 64 (4 - 60), el siguiente puerto los siguientes 64 IDs (68 - 124) , y as, con IDs de nodo 452 - 508 siendo asignados al octavo puerto. Las estructuras de red de toro bi o tri dimensional se tienen en cuenta donde cada nodo se localiza en cada dimensin, incrementando en 4 para cada nodo en la primera dimensin, en 63 cada nodo en la segunda dimensin, y (donde sea aplicable) en 1024 en la tercera dimensin. Consulte Dolphin's Web site para ms documentacin. En nuestras pruebasa hemos usado switches, aunque las instalaciones de cluster ms grandes usan toros bi o tri dimensionales. La ventaja proporcionada por switches es que, con tarjetas SCI duales y
878
switches duales, es posible constuir con facilidad relativa una red redundante donde el tiempo de fallo medio en la red SCI es del orden de 100 microsegundos. Esto lo soporta el transporte SCI en MySQL Cluster y tambin est bajo desarrollo par la implementacin SCI Socket . Evitar fallos en el toro 2D/3D es posible pero requiere el envo de nuevos ndices de enrutamiento a todos los nodos. Sin embargo, esto requiere slo 100 milisegundos o as para completarse y debera ser aceptable para la mayora de casos de alta disponibilidad. Situar los nodos de datos del cluster adecuadamente en la arquitectura de switch hace que sea posible usar 2 switches para construir una arquitectura en que puedan interconectarse 16 mquinas y que un fallo nico no pueda afectar a ms de una. Con 32 mquinas y 2 switches se puede configurar el cluster de forma que un fallo nico no pueda causar la prdida de ms de dos nodos; en este caso es posible saber qu par de nodos est afectado. Por lo tanto, poner los dos nodos en grupos de nodos separados hace que la instalacin de MySQL Cluster sea segura . Para poner el ID de nodo en una tarjeta SCI use el siguiente comando en el directorio /opt/DIS/ sbin. En este ejemplo -c 1 se refiere al nmero de la tarjeta SCI (siempre ser 1 si slo hay 1 tarjeta en la mquina) , -a 0 se refiere al adaptador 0, y 68 es el ID del nodo:
shell> ./sciconfig -c 1 -a 0 -n 68
Si tiene varias tarjetas SCI en la misma mquina, puede determinar qu tarjeta tiene cada slot ejecutando el siguiente comando (de nuevo asumimos que el directorio de trabajo actual es /opt/ DIS/sbin):
shell> ./sciconfig -c 1 -gsn
Esto le retorna el nmero de serie de la tarjeta SCI. Luego repita este procedimiento con -c 2, y siga con cada tarjeta en la mquina. Una vez que ha relacionado cada tarjeta con cada slot, puede poner los IDs de nodo para todas las tarjetas. Una vez instaladas la bibliotecas y binarios necesarios, y configurado el ID de nodo SCI, el siguiente paso es configurar el mapeo de nombres de equipo (o direcciones IP) con el ID del nodo SCI. Esto se realiza en el fichero de configuracin de los sockets SCI, que debera encontrarse en /etc/sci/ scisock.conf. En este fichero, cada nombre de mquina o direccin IP se mapea con el ID de nodo SCI. Aqu hay un ejemplo sencillo de un fichero de configuracin:
#host alpha beta 192.168.10.20 #nodeId 8 12 16
Es posible limitar la configuracin para que se aplique slo a un subconjunto de los puertos disponibles para estos equipos. Un fichero de configuracin adicional /etc/sci/ scisock_opt.conf puede usarse para esto, como se muestra aqu:
#-key EnablePortsByDefault EnablePort DisablePort EnablePortRange DisablePortRange -type yes tcp tcp tcp tcp 2200 2201 2202 2219 2220 2231 -values
Instalacin de drivers Con los ficheros de configuracin en su lugar, se pueden instalar los drivers. Primero los drivers de bajo nivel y luego el driver del socket SCI:
shell> cd DIS/sbin/ shell> ./drv-install add PSB66 shell> ./scisocket-install add
Si se desea, la instalacin puede chequearse invocando un script que verifica que todos los nodos en el los ficheros de configuracin del socket SCI son accesibles:
879
Si descubre un error y necesita cambiar la configuracin del socket SCI, es necesario usar ksocketconfig para ello:
shell> cd /opt/DIS/util shell> ./ksocketconfig -f
Testing y Setup Para asegurar que los sockets SCI estn siendo usados, puede emplear el programa de testeo latency_bench . Usando este componente del servidor de utilidades, los clientes pueden conectar con el servidor para testear la latencia de la conexin; determinar si el SCI est activado o no debe ser muy simple observando la latencia. (Nota: Antes de usar latency_bench, es necesario incializar la variable de entorno LD_PRELOAD como se muestra posteriormente.) Para inicializar un servidor, use:
shell> cd /opt/DIS/bin/socket shell> ./latency_bench -server
Para ejecutar un cliente, use latency_bench de nuevo, excepto que esta vez con la opcin client :
shell> cd /opt/DIS/bin/socket shell> ./latency_bench -client server_hostname
La configuracin del socket SCI debera estar completa ahora y MySQL Cluster preparado para usar SCI Sockets y SCI transporter (consulte Seccin 16.4.4.10, Conexiones de transporte SCI en MySQL Cluster). Arrancar el Cluster El siguiente paso en el proceso es arrancar MySQL Cluster. Para permitir el uso de SCI Sockets es necesario inicializar la variable de entorno LD_PRELOAD antes de arrancar ndbd, mysqld, y ndb_mgmd. Esta variable debe apuntar a la biblioteca kernel para SCI Sockets. Para arrancar ndbd en un bash shell, haga:
bash-shell> export LD_PRELOAD=/opt/DIS/lib/libkscisock.so bash-shell> ndbd
Nota: MySQL Cluster slo puede usar la variante de kernel de SCI Sockets.
880
Acceso por clave nica Son similares a los anteriores, con la excepcin que los accesos por clave nica se ejecutan como lecturas en una tabla ndice seguidos por su acceso por clave primaria a la tabla. Sin embargo, slo se enva una peticin desde el servidor MySQL, y la lectura de la tabla ndice es tratada por ndbd. Estas peticiones tambin se benefician del uso de batch. Escaneo de toda la tabla Cuando no existen ndices para la bsqueda en una tabla, se realiza un escaneo completo. Se enva como peticin ncia al proceso ndbd , que divide el escaneo de tabla en un conjunto de escaneos paralelos en todos los procesos ndbd del proceso. En futuras versiones de MySQL Cluster, un nodo SQL ser capaz de filtrar algunos de estos escaneos. Escaneo de rangos usando ndices ordenados Cuando se usa un ndice ordenado, realiza un escaneo igual que lo hace un escaneo de tabla completo, excepto que escanea slo los registros en el rango usados por la consulta transmitidas por el MySQL server (nodo SQL). Para chequear el rendimiento base de estos mtodos de acceso hemos desarrollado un conjunto de benchmarks. Uno de ellos testReadPerf, testea accesos simple y en batch por clave primaria y nica. Este benchmark tambin mide el coste de preparar los escaneos de rango ejecutando escaneos que retornan un nico registro. Hay una variante de este benchmark que usa un escaneo de rango para recibir un batch de registros. De este modo, podemos determinar el coste de accesos de clave nica y accesos de escaneo de registro simple, as como medir el impacto del medio de comunicacin usdo, en mtodos de acceso base. En nuestros tests, ejecutamos los benchmarks para transporters normales usando sockets TCP/ IP sockets y una configuracin similar usando sockets SCI. Las figuras posteriores son pequeos accesos de 20 registros por acceso. Las diferencias entre accesos seriales y mediante batch se decrementan en un factor de 3 a 4 usando registros de 2 kB. SCI Sockets no se testearon con registros de 2 kB. Los tests se realizaron en un cluster con 2 nodos de datos en 2 mquinas de CPU dual equipadas con procesadores AMD MP1900+ .
Tipo de acceso: TCP/IP sockets SCI Socket Acceso Serial clave primaria: 400 microsegundos 160 Acceso Batched clave primaria 28 microsegundos 22 Acceso Serial indice unico: 500 microsegundos 250 Acceso Batched indice unico: 70 microsegundos 36 Acceso Indexado igualdad: 1250 microsegundos 750 ndice rango: 24 microsegundos 12 microsegundos microsegundos microsegundos microsegundos microsegundos microsegundos
Tambin realizamos otro conjunto de tests para chequear el rendimiento de los SCI Sockets vis--vis contra el SCI transporter, y ambos comparados con el TCP/IP transporter. Todos estos tests usaron acceso por clave primaria de forma serial o multi-flujo, o multi-flujo y batch. Los tests mostraron que los sockets SCI eran 100% ms rpido que TCP/IP. El transporter SCI era ms rpido en la mayora de casos comparado con los sockets SCI. Un caso notable ocurrin con muchos flujos en el programa de test, que mostr que el tramporter SCI no funcionaba muy bien usado por el proceso mysqld. Nuestra conclusin global fue que, para la mayora de benchmarks, usando sockets SCI mejoraba el rendimiento aproximadamente 100% sobre TCP/IP, excepto en raros casos cuando el rendimiento de la configuracin no es un tema importante. Esto puede ocurrir cuando los filtros de escaneo toman la mayora del tiempo de proceso o cuando los procesos batchs muy grandes de accesos por clave primaria se realizan. En tal caso, el proceso de la CPU en los procesos ndbd es la mayor parte del proceso. Usar el transporter SCI en lugar de SCI Sockets slo es de inters en comunicacin entre procesos ndbd. Usar el SCI transporter tambin es slo de inters si una CPU puede dedicarse al proceso
881
ndbd ya que el SCI transporter se asegura que su proceso nunca estar en espera. Es importante asegurar que la prioridad del proceso ndbd est configurada de tal modo que el proceso no pierde prioridad debido a ejecutarse durante un periodo de tiempo extendido, como puede pasar por bloqueo de procesos por la CPU en Linux 2.6. Si tal configuracin es posible, entonces el proceso ndbd se beneficiar de un 10-70% comparado con usar SCI sockets. (Las diferencias ms grandes se vern al realizar actualizaciones y probablemente en escaneos paralelos tambin Hay otras implementaciones de socket para clusters de mquinas, incluyendo Myrinet, Gigabit Ethernet, Infiniband y la interfaz VIA . Hemos testeado MySQL Cluster hasta ahora slo con SCI sockets.Tambin inclumos documentacin acerca de cmo preparar SCI sockets usando TCP/IP ordinario para MySQL Cluster.
882
En MySQL 4.1 y 5.0, todos los registros de tabla de Cluster son de longitud fija. Esto significa (por ejemplo) que si una tabla tiene uno o ms campos VARCHAR conteniendo slo valores pequeos, sern necesarios ms memoria y espacio de disco al usar el motor NDB que el que sera para la misma tabla y datos usando el motor MyISAM. Estamos trabajando para rectificar este punto en MySQL 5.1. El mximo nmero de objetos de metadatos est limitado a 1600, incluyendo tablas de base de datos, tablas de sistema, ndices y BLOBs. Estamos trabajando para incrementar esto a aproximadamente 20k en MySQL 5.0. El mximo nmero de atributos por tabla est limitado a 128. El tamao mximo permitido de registro es 8k, sin incluir datos almacenados en columnas BLOB. Esperamos incrementar esto a aproximadamente 32k en MySQL 5.1. El mximo nmero de atributos por clave es 32. Caractersticas no soportadas (no causan errores, pero no estn soportadas o forzadas): El constructor de clave primaria se ignora, como en tablas MyISAM . Los puntos de chequeo y rollbacks se ignoran como en MyISAM. Rendimiento y temas relacionados con limitaciones : La cach de consulta est desactivada, ya que no est invalidad si ocurre una actualizacin en distintos servidores MySQL. Hay temas de rendimiento de consulta debido a acceso secuencial al motor NDB; tambin es relativamente ms costoso hacer varios escaneos de rango que con MyISAM o InnoDB. La estadstica Records in range no est soportada, resultando en planes de consulta no ptimos en algunos casos. Use USE INDEX o FORCE INDEX como solucin. ndices hash nicos creados con USING HASH no pueden usarse para acceder a una tabla si NULL se da como parte de la clave. Caractersitcas no includas: El nico nivel de isolacin soportado es READ_COMMITTED. (InnoDB soporta READ_COMMITTED, REPEATABLE_READ, y SERIALIZABLE.) Consulte Seccin 16.6.4.5, Resolver problemas con copias de seguridad para informacin sobre cmo puede afectar a las copias de seguridad y restauracin de bases de datos Cluster. Commits no durables en disco. Los commits se replican, pero no hay garanta que los logs se vuelquen a disco en un commit. Problemas relacionados con mltiples MySQL servers (no relacionados con MyISAM o InnoDB): ALTER TABLE no es completamente bloqueante cuando se ejecutan mltiples MySQL servers (no hay bloqueo de tabla distribudo). La replicacin MySQL no funcionar correctamente si las acutalizaciones se hacen en mltiples MySQL servers. Sin embargo, si el esquema de particionado de la base de datos es en nivel de aplicacin, y no hay transacciones entre estas particiones, la replicacin puede funcionar. El autodescubrimiento de bases de datos no se soporta para mltiples MySQL servers accediendo al mismo MySQL Cluster. Sin embargo, el autodescubrimiento de tablas se soporta en estos casos. Lo que significa que si tras una base de datos llamada db_name se crea o importa usando un MySQL server, debe ejecutar un CREATE DATABASE db_name; en cada MySQL server adicional que accede al mismo MySQL Cluster. (Desde MySQL 5.0.2 puede usar CREATE
883
SCHEMA db_name;.) Una vez hecho esto para un MySQL server dado, el servidor debera ser capaz de detectar las tablas de la base de datos sin error. Temas exclusivos de MySQL Cluster (no relacionados con MyISAM o InnoDB): Todas las mquinsa usadas en el cluster deben tener la misma arquitectura; esto es, todas las mquinas con nodos deben ser o big-endian o little-endian, y no puede usar una mezcla. Por ejemplo, no puede tener un nodo de administracin ejecutndose en un PPC con un nodo datos en una mquina x86 . Esta restriccin no se aplica a mquinas que ejecuten slo mysql u otros clientes que puedan estar accediendo a los nodos SQL del cluster. No es posible hacer cambios del esquema en lnea tales como los realizados usando ALTER TABLE o CREATE INDEX, ya que NDB Cluster no soporta autodescubrimiento de tales cambios. (Sin embargo, puede importar o crear una tabla que use distintos motores, convertirlos a NDB usando ALTER TABLE tbl_name ENGINE=NDBCLUSTER;. En tales casos, necesitar ejecutar un comando FLUSH TABLES para forzar al cluster a recoger los cambios.) Aadir o eliminar nodos en lnea no es posible (el cluster debe reiniciarse en tales casos). Cuando se usan mltiples servidores de administracin debe dar a los nodos explcitamente los IDs en los connectstrings ya que la reserva automtica de IDs de nodo no funciona entre mltiples servidores de administracin. Usando varios servidores de administracin debe tener cuidado de tener la misma configuracin para todos los servidores de administracin. El cluster no hace chequeos para ello. El nmero mximo de nodos de datos es 48. El nmero mximo de nodos en MySQL Cluster es 63. Este nmero incluye todos los MySQL Servers (nodos SQL), nodos de datos, y servidores de administracin. Este listado trata de ser completo respecto al conjunto de condiciones del principio de esta seccin. Puede reportar cualquier discrepancia que encuentre a la base de datos de bugs de MySQL en http:// bugs.mysql.com/. Si no planeamos arreglar el problema n MySQL 4.1, lo aadiremos a la lista anterior.
884
usar un escaneo de toda la tabla y la condicin se evaluar en los nodos de datos del cluster. Por lo tanto no es necesario enviar el registro a la red para evaluacin. (Esto es, la transporte de funcin se usa, en lugar del transporte de datos.) Para este tipo de consultas debe observar un factor de incremento de velocidad de 5-10. Tenga en cuenta que esta caracterstica actualmente est desactivada por defecto (pendiente de ms testeo), pero debera funcionar en la mayora de casos. Esta caracterstica puede estar activada mediante el comando SET engine-conditionpushdown=On; . Alternativamente, puede ejecutar mysqld con esta caracterstica activada arrancando MySQL server con la nueva opcin --engine-condition-pushdown. Puede usar EXPLAIN para determinar cundo se usan las condiciones push-down . Un beneficio principal de este cambio es que las consultas se ejecutan en paralelo. Esto significa que las consultas contra columnas no indexadas pueden mejorar de 5 a 10 veces, veces por el nmero de nodos de datos, ms rpido que prviamente, ya que CPUs mltiples pueden funcionar en la consulta en paralelo. Decrementado uso de IndexMemory: En MySQL 5.0, cada registro consume aproximadamente 25 bytes de memoria ndice, y cada ndice nico usa 25 bytes por registro de memoria ndice (adems de alguna memoria de datos ya que se almacena en una tabla separada). Esto es porque no hay almacenamiento de la clave primaria en la memoria ndice. Cach de consulta activada para MySQL Cluster: Consulte Seccin 5.12, La cach de consultas de MySQL para informacin acerca de configurar el uso de la cach de consulta. Nuevas optimizaciones: Una optimizacin que merece atencin particular es que una interfaz de lectura batch se usa ahora en algunas consultas. Por ejemplo, considere la siguiente consulta:
SELECT * FROM t1 WHERE primary_key IN (1,2,3,4,5,6,7,8,9,10);
Esta consulta se ejecutar 2 o 3 veces ms rpido que en versiones anteriores de MySQL Cluster debido al hecho que todas las 10 bsquedas de clave se envan en un batch nico en lugar de uno cada vez. Lmite en nmero de objetos de metadatos : En MySQL 4.1, cada base de datos de Cluster puede contener un mximo de 1600 objetos de metadatos, incluyendo tablas de base de datos, tablas de sistema, ndices y BLOBs. En MySQL 5.0, esperamos incrementar este nmero a 20,320. Esperamos implementar esta mejora en MySQL 5.0.6 beta a mediados de 2005.
885
es posible de eliminar algunas de las particiones de la clusula WHERE . La particin basada en KEY, HASH, RANGE, y LIST ser posible, as como subparticiones. Esta caracterstica debe estar disponible para otros criterios. Adems, estamos trabajando para incrementar el lmite de tamao de 8k para los registros que contienen columnas de tipos distintos a BLOB o TEXT en tablas cluster. Esto es debido al hecho que los registros estn fijados en tamao y el tamao de pgina es de 32,768 bytes (menos 128 bytes para la cabecera del registro.) Esto significa actualmente que si permitimos ms de 8k por registro, cualquier espacio que quede (hasta aproximandamente 14,000 bytes) quedara vaco. En MySQL 5.1, planeamos para arreglar esta limitacin para que use ms de 8k en un registro dado no resulta en que se gaste lo que queda de la pgina.
886
nodos. El nodo de administracin se implementa como la aplicacin ndb_mgmd; el cliente de administracin usado para controlar MySQL Cluster via nodo MGM es ndb_mgm. 2. nodo de datos: Almacena y replica datos. La funcionalidad de los nodos de datos la trata una instancia del proceso NDB ndbd. 3. nodo SQL: Smplemente es una instancia de MySQL Server (mysqld) arrancado con la opcin --ndb-cluster. Qu sistemas operativos pueden usar Cluster? En MySQL 5.0, MySQL Cluster se soporta oficialmente en Linux, Mac OS X, y Solaris. Estamos trabajando para aadir soporte a cluster para otras plataformas, incluyendo Windows, y nuestra finalidad es eventualmente ofrecer MySQL Cluster en todas las plataformas en que se soporta MySQL . Puede ser posible ejecutar procesos Cluster en otros sistemas operativos. Hemos tenido reportes de usuarios que dicen que han ejecutado Cluster en FreeBSD. Sin embargo, Cluster en cualquier plataforma que no sen las 3 mencionadas aqu se considera software alfa (como mucho), no puede garantizarse el buen funcionamiento en un entorno de produccin, y no lo soporta MySQL AB. Cules son los requerimientos de hardware para ejecutar MySQL Cluster? Cluster debe ejecutarse en cualquier plataforma en que los binarios de NDB estn disponibles. Naturalmente, una CPU ms rpida y ms memoria mejora el rendimiento, y CPUs de 64 bits sern mejores que los procesadores de 32. Debe haber suficiente memoria en las mquinas usadas por los nodos de datos para tratar cada parte de la base de datos (consulte Cunta RAM necesito? para ms informacin). Los nodos pueden comunicarse via TCP/IP estndar y su hardware. Para soporte SCI, se necesita hardware especial de red. Como MySQL Cluster usa TCP/IP, significa que puedo usarlo en Internet, con uno o ms nodos en una localizacin remota? Es importante tener presente que la comunicacin entre nodos en MySQL Cluster no es segura ; no est cifrada ni protegida por ningn otro mecanismo. La configuracin ms segura para un cluster es en una red privada detrs de un firewall, sin acceso directo a ningn nodo de datos ni de administracin desde fuera. Es muy dudoso que un cluster se muestre fiable bajo tales condiciones, ya que se dise e implement con la suposicin que se ejecutara bajo condiciones que garantizaran conectividad dedicada de alta velocidad como las encontradas en configuraciones en una LAN con 100 Mbps o gigabit Ethernet (mejor la ltima). No testeamos ni garantizamos el rendimiento usando algo ms lento que esto. Debo usar nuevos lenguajes de programacin o de consulta para usar Cluster? No. Aunque se usan algunos comandos especializados para administrar y configurar el cluster, solo comandos estndar (My)SQL se necesitan para: Crear, alterar y borrar tablas Insertar, actualizar y borrar datos de tabla Crear, cambiar y borrar ndices nicos y primarios Configurar y administrar nodos SQL (servidores MySQL) Cmo puedo saber qu significan los mensajes de error o advertencias al usar Cluster? Se puede hacer de dos modos:
887
1. Desde el MySQL Monitor, use SHOW ERRORS o SHOW WARNINGS inmediatamente al recibir la notificacin del error o advertencia. Tambin se pueden mostrar en MySQL Query Browser. 2. De un shell de sistema, use perror --ndb error_code. Es MySQL Cluster transaccional? Qu tipo de tablas se soportan en Cluster ? S. MySQL Cluster utiliza tablas creadas con el motor NDB , que soporta transacciones. NDB es el nico motor que soporta cluster. Qu significa NDB? Significa "Network Database". Qu versiones de MySQL software soportan Cluster? Debo compilarlo de las fuentes? Cluster se soporta en todos los binarios MySQL-max en la serie 5.0, excepto lo que se explica en el siguiente pargrafo. Puede determinar si su servidor soporta o no NDB usando los comandos SHOW VARIABLES LIKE 'have_%'; o SHOW ENGINES;. (Consulte Seccin 5.1.2, El servidor extendido de MySQL mysqld-max para ms informacin.) Usuarios de Linux , tengan en cuenta que NDB no se incluye en los RPM estndar de MySQL server. Desde MySQL 5.0.4, hay paquetes RPM separados para el motor NDB junto con herramientas de administracin; consulte la seccin de descargas NDB RPM de MySQL 5.0 Downloads . (Antes de 5.0.4, debe usar los binarios -max proporcionados como .tar.gz . Todava es posible, pero no es un requerimiento, as que puede usar su administracin de RPMs de Linux si lo prefiere.) Puede obtener soporte NDB compilando los binarios -max de las fuentes, pero no es necesario hacerlo para usar MySQL Cluster. Para descargar los ltimos binarios, RMP o distribucin fuente en la serie MySQL 5.0 visite http://dev.mysql.com/downloads/mysql/5.0.html. Cunta RAM necesito? Es posible usar memoria de disco? Actualmente, Cluster slo funciona en memoria. Esto significa que todos los datos de tabla (incluyendo ndices) se almacena en RAM. Por lo tanto, si sus datos ocupan 1 GB de espacio y quiere replicarlo en el cluster, necesitar 2 GB de memoria para ello. Esto es a parte de la memoria necesaria para el sistema operativo y cualquier aplicacin ejecutndose en las mquinas del cluster. Puede usar la siguiente frmula para obtener una estimacin aproximada de cunta RAM necesita para cada nodo de datos en el cluster:
(SizeofDatabase * NumberOfReplicas * 1.1 ) / NumberOfDataNodes
Para calcular los requerimientos de memoria con ms exactitud debe determinar, para cada tabla en la base de datos del cluster, el espacio de almacenamiento requerido por registro (consulte Seccin 11.5, Requisitos de almacenamiento segn el tipo de columna para ms detalles), y multiplicarlo por el nmero de registros. Debe recordar tener en cuenta cualquier ndice de columna como sigue: Cada clave primaria o ndice hash creado para una tabla NDBCluster necesita 21-25 bytes por registro. Estos ndices usan IndexMemory. Cada ndice ordenado necesita 10 bytes de almacenamiento por registro, usando DataMemory. Crear una clave primaria o ndice nico tambin crea un ndice ordenado, a no ser que este ndice se cree con USING HASH. En otras palabras, si se crea sin USING HASH, una clave primaria o ndice nico en una tabla Cluster ocupar hasta 31-35 bytes por registro en MySQL 5.0. Tenga en cuenta que crear tablas MySQL Cluster con USING HASH para todas las claves primarias e ndices nicos generalmente causar que las actualizaciones de tablas sean ms rpidas. Esto es debido al hecho que se necesita menos memoria (ya que no se crean ndices nicos), y que debe usarse menos CPU (ya que se deben leer y actualizar menos ndices).
888
Es especialmente importante tener en mente que cada tabla en MySQL Cluster debe tener clave primaria, que el motor NDB crear una clave primaria automticamente si no se define y que esta clave primaria se crea sin USING HASH. No hay una forma sencilla en MySQL 5.0 para determinar exactamente cunta memoria se est usando para almacenar ndices Cluster en un momento dado; sin embargo, las advertencias se escriben en el log del cluster cuando el 80% de memoria DataMemory y/o IndexMemory est en uso, y de nuevo al 85%, 90% etc. A menudo vemos preguntas de usuarios que reportan que, cuando intentan rellenar una base de datos cluster, el proceso de carga termina prematuramente y aparece un mensaje de error como este:
ERROR 1114: The table 'my_cluster_table' is full
Cuando esto ocurre, la causa es que su configuracin no proporciona suficiente RAM para todos los datos de tablas e ndice , incluyendo la clave primaria requerida por el motor NDB y creada automticamente en el caso que la definicin de tabla no incluya la definicin de la clave primaria. Vale la pena tener en cuenta que todos los nodos de datos deben tener la misma cantidad de RAM, ya que ningn nodo de datos en el cluster puede usar ms memoria que la mnima cantidad disponible para cualquier nodo de datos individual. En otras palabras, si hay tres mquinas con nodos de datos y dos tienen 3 GB RAM disponibles y otro slo 1 GB de RAM, entonces cada nodo slo puede usar 1 GB para el cluster. En caso de un fallo catastrfico por ejemplo, que la ciudad entera se queda sin electricidad y mi UPS falla perdera todos mis datos? Todas las transacciones con commit se loguean. Por lo tanto, aunque es posible perder algunos datos en caso de catstrofe, debera ser algo limitado. La prdida de datos puede reducirse minimizando el nmero de operaciones por transaccin. (No es buena idea realizar un gran nmero de operaciones por transaccin en cualquier caso.) Es posile usar ndices FULLTEXT con Cluster? La indexacin FULLTEXT no se soporta en el motor NDB , o por cualquier motor que no sea MyISAM. Estamos trabajando para aadir esta funcionalidad en nuevas versiones. Puedo ejecutar mltiples nodos en una sola mquina? Es posible pero no recomendable. Una de las razones principales para ejecutar un cluster es proporcionar redundancia; para tener todos los beneficios de esta redundancia, cada nodo debe residir en mquinas separadas. Si tiene mltiples nodos en una misma mquina y esta falla, pierde todos estos nodos. Dado que MySQL Cluster puede ejecutarse en hardware dedicado cargado con sistemas operativos de bajo o ningn coste, vale la pena el gasto en una o dos mquina extra para guardar datos crticos. Tambin vale la pena tener en cuenta que los requerimientos para una mquina cluster ejecutando un nodo de administracin son mnimos; esta tarea puede realizarse con una CPU 200 MHz Pentium y suficiente RAM para el sistema operativo ms una mnima cantidad de sobrecarga para los procesos ndb_mgmd y ndb_mgm . Puedo aadir nodos en un cluster sin reiniciarlo? No. Un reinicio es necesario para aadir nuevos nodos MGM o SQL. Al aadir nodos de datos el proceso es ms complejo, y necesita los siguientes pasos: Hacer una copia de seguridad completa de todos los datos del cluster. Parar todo el cluster y procesos de los nodos. Reiniciar el cluster, usando la opcin --initial 889
Restaurar todos los datos desde la copia de seguridad En el futuro, esperamos implementar capacidad de reconfiguracin hot para MySQL Cluster para minimizar (o eliminar) los requerimientos para reiniciar el cluster al aadir nuevos nodos. Hay alguna limitacin que deba tener en cuenta al usar Cluster? Las tablas NDB tienen las siguientes limitaciones: No se soportan todos los conjuntos de caracteres y colaciones. ndices FULLTEXT y prefijo no estn soportados. Slo pueden indexarse columnas completas. Captulo 18, Extensiones espaciales de MySQL no se soportan. Slo se soporta rollback completo para transacciones. Los rollback parciales y rollbacks en checkpoints no se soportan. El mximo nmero de atributos permitidos por tabla es 128, y los nombres de atributo no pueden tener ms de 31 caracteres. Para cada tabla, la longitud mxima combinada del nombre de tabla y de base de datos es 122 caracteres. El tamao mximo para un registro de tabla es de 8 kilobytes, sin contar BLOBs. No hay lmite para el nmero de registros por tabla; los lmites de tamao de tabla dependen en un nmero de factores, en particular la cantidad de RAM disponible para cada nodo de datos. El motor NDB no soporta claves forneas. Como con tablas MyISAM, se ignoran. No se soporta el cach de consulta. Para informacin adicional de limitaciones de cluster, consulte Seccin 16.8, Limitaciones conocidas de MySQL Cluster. Cmo importo una base de datos existente en un cluster? Puede importar bases de datos en MySQL Cluster como con cualquier otra versin de MySQL. A parte de las limitaciones mencionadas anteriormente, el nico requerimiento especial es que cualquier tabla que se incluya en el cluster debe usar el motor NDB. Esto significa que las tablas deben crearse con la opcin ENGINE=NDB o ENGINE=NDBCLUSTER. Cmo se comunican los nodos del cluster entre ellos? Los nodos del Cluster pueden comunicarse mediante tres protocolos: TCP/IP, SHM (memoria compartida), y SCI (Scalable Coherent Interface). Donde est disponible, SHM se usa por defecto entre nodos residentes en el mismo equipo de cluster. SCI es un protocolo de alta velocidad (1 gigabit por segundo o ms), alta disponibilidad usado en construir sistemas escalables de multi procesador; requiere hardware especial y drivers. Consulte Seccin 16.7, Usar interconexiones de alta velocidad con MySQL Cluster para ms informacin usando SCI como mecanismo de transporte en MySQL Cluster. Qu es un rbitro? Si uno o ms nodos en un cluster fallan, es posible que no todos los nodos del cluster ser capaz de verse entre ellos. De hecho, es posible que dos conjuntos de nodos puedan a estar aislados de los otros en una particin de red, tambin conocido como un escenario split brain. Este tipo de situacin no es deseable ya que cada conjunto de nodos trata de comportarse como si fuera el cluster entero. Cuando caen los nodos del cluster, hay dos posibilidades. Si ms del 50% de los nodos restantes pueden comunicarse entre ellos, entonces tenemos lo que a veces se llama reglas de mayora , y este conjunto de nodos se consideran como el cluster. El rbitro entra en juego cuando hay
890
un nmero impar de nodos: en tales casos, el conjunto de nodos al que pertenece el rbitro se considera el cluster, y los nodos que no pertenecen a este grupo se paran. La informacin anterior est simplificada; a continuacin hay una explicacin ms completa: Cuando todos los nodos en al menos un grupo de nodos est vivo, la particin de la red no es un problema, porque ninguna porcin del cluster puede formar un cluster funcional. El problema real es cuando un grupo no tiene todos sus nodos vivos, en tal caso la particin de red (el escenario split-brain mencionado anteriormente) es posible. Cuando se necesita un rbitro, que normalmente es el servidor de administracin; sin embargo, es posible configurar cualquier MySQL Server en el cluster para que acte como el rbitro. El rbitro acepta el primer conjunto de nodos del cluster que contacten con el, y le dice al resto que mueran. La seleccin del rbitro se controla mediante el parmetro de configuracin ArbitrationRank para los nodos MySQL Server y de administracin. (Consulte Seccin 16.4.4.4, Definicin del servidor de administracin de MySQL Cluster para ms detalles.) Debe tener en cuenta que el rol de administrador no impone ninguna demanda en la mquina designada, y por lo tanto la mquina rbitro no necesita ser particularmente rpida o tener memoria extra para este propsito. Qu tipos de columna soport MySQL Cluster? MySQL Cluster soporta todos los tipos de columna MySQL usuales, con la excepcin de los asocidados con las extensiones espaciales. (Consulte Captulo 18, Extensiones espaciales de MySQL.) Adems, hay algunas diferencias respecto a los ndices cuando se usan con tablas NDB. Nota: En MySQL 5.0, las tablas Cluster (esto es, tablas creadas con ENGINE=NDBCLUSTER) tiene slo registros de longitud fija. Esto significa que (por ejemplo, cada registro conteniendo una columna VARCHAR(255) necesitar 256 bytes de almacenamiento para esa columna, independientemente del tamao de los datos almacenados. Este punto se arreglar en futuras versiones. Consulte Seccin 16.8, Limitaciones conocidas de MySQL Cluster para ms informacin. Cmo arranco y paro MySQL Cluster? Es necesario arrancar cada nodo en el cluster por separado en el siguiente orden: 1. Arranque el nodo de administracin con el comando ndb_mgmd . 2. Arranque cada nodo de datos con el comando ndbd. 3. Arranque cada servidor MySQL (nodo SQL) usando mysqld_safe --user=mysql &. Cada uno de estos comandos debe ejecutarse en una shell de sistema en la mquina que contenga el nodo afectado. Puede verificar que el cluster est en ejecucin arrancando el cliente de administracin MGM . ndb_mgm en la mquina con el nodo MGM. Qu ocurre a los datos del cluster cuando el cluster se para? Los datos en memoria de los nodos de datos se escriben en disco, y se recargan en memoria la siguiente vez que se inicia el cluster. Para parar el cluster, introduzca lo siguiente en una shell en la mquina del nodo MGM:
shell> ndb_mgm -e shutdown
Esto hace que ndb_mgm, ndb_mgm, y cualquier proceso ndbd termina correctamente. MySQL servers corriendo como nodos Cluster SQL pueden pararse usando mysqladmin shutdown. Para ms informacin, consulte Seccin 16.6.1, Comandos del cliente de administracin y Seccin 16.3.6, Apagado y encendido seguros. Es til tener ms de un nodo de administracin para el cluster? 891
Puede ser til para ser ms seguro. Slo un nodo MGM controla el cluster en un momento dado, pero es posible configurar un MGM como primario, y otro o ms nodos adicionales para tomar el control en caso de fallo del nodo MGM primario. Puedo mezclar hardware y sistemas operativos distintos en un Cluster? S, mientras todas las mquinas y sistemas operativos tengan la misma endian. Es posible usar distintas versiones de MySQL Cluster en nodos distintos; sin embargo, recomendamos que esto se haga slo como parte del procedimiento de actualizacin. Puedo ejecutar dos nodos de datos en una misma mquina? Dos nodos SQL? S. En el caso de mltiples nodos de datos, cada nodo debe usar un directorio de datos distinto. Si quiere ejecutar mltiples nodos SQL en una mquina, entonces cada instancia de mysqld debe usar un puerto TCP/IP distinto. Puedo usar nombres de equipo con MySQL Cluster? S, es posible usar DNS y DHCP para equipos del cluster. Sin embargo, si su aplicacin necesita disponibilidad de "cinco nueves", recomendamos usar direcciones IP fijas. Esto es porque hacer la comunicacin entre equipos del cluster dependiente de estos servicios introduce puntos de fallo adicionales, y mientras menos haya, mejor.
Generalmente hablando, cuando los datos se guardan en disco, se dice que se llega a un checkpoint. Ms especficamente para el cluster, es un punto en tiempo donde todas las transacciones que han hecho un commit se guardan en disco. Respecto al motor NDB, hay dos clases de checkpoints que trabajan juntas para asegurar que se mantiene una vista consistente del cluster: Local Checkpoint (LCP): Este es un checkpoint especfico a un nodo; sin embargo LCP se realizan para todos los nodos de forma ms o menos concurrentes en todo el cluster. Un LCP inplica guardar todos los datos de los nodos en disco, y esto ocurre normalmente cada pocos minutos. El intervalo preciso vara, y depende de la cantidad de datos almacenada por el nodo, el nivel de la actividad del cluster y otros factores. Global Checkpoint (GCP): Un GCP se realiza cada pocos segundos, cuando las transacciones para todos los nodos se sincronizan y el log de redo se vuelca en disco. Equipo Cluster: Una mquina que forma parte del MySQL Cluster. Un cluster tiene una estructura fsica y una lgica . Fsicamente, el cluster consiste en un nmero de mquinas , conocidas como equipos del cluster (o ms smplemente equipos . Consulte Nodo y Grupo de Nodos a continuacin. Nodo: Se refiere a un unidad lgica o funcional de MySQL Cluster, y a veces se denomina como nodo de cluster . En el contexto de MySQl Cluster, usamos el trmino nodo para indicar un proceso en lugar de un componente fsico del cluster. Hay tres tipos de nodo requeridos para implementar un MySQL Cluster. Son: Nodos de administracin (MGM): Administra los otros nodos dentro del MySQL Cluster. Proporciona datos de configuracin de los otros nodos; arranca y para nodos; trata particin de red; crea copias de seguridad y restaura desde las mismas, y as. Nodos SQL (MySQL server): Instancias de MySQL Server que sirve como front end para cuardar datos en los nodos de datos del cluster. Clientes que quieran almacenan, recuperar o actualizar datos pueden acceder a un nodo SQL slo como si fuera cualquier otro MySQL Server, empleando los mtodos de autenticacin usual y API; la distribucin subyacente de datos entre grupos de nodos es transparente a los usuarios y aplicaciones. Los nodos SQL acceden a las bases de datos del cluster como un total sin tener en cuenta la distribucin de datos entre distintos nodos de datos o mquinas del cluster. Nodos de datos: Estos nodos almacenan los datos. Los fragmentos de datos se almacenan en un conjunto de grupos de nodos. Cada uno de los nodos creando un grupo de nodos almacena una rplica del fragmento para el que ese grupo de nodos es responsable. Actualmente un nico cluster puede soportar hasta 48 nodos de datos en total. Es posible que ms de un nodo coexista en una nica mquina. (De hecho, es posible tener un cluster completo en una nica mquina, aunque no es recomendable hacerlo en un entorno de produccin.) Puede ser til recordar que, cuando se trabaja con MySQL Cluster, el trmino mquina se refiere a un componente fsico del cluster mientras que nodo es un componente lgico o funcional. (un proceso).
893
Nota respecto a trminos obsoletos: En versiones ms antiguas de la documentacin de MySQL Cluster , los nodos de datos se llaman a veces "nodos de bases de datos" o "nodos DB". Adems, los nodos SQL a veces se conocen como "nodos cliente" o "nodos API". Esta terminologa antigua ha quedado obsoleta para minimizar confusin, y por estas razones debera evitarse. Grupo de nodos: Conjunto de nodos de datos. Todos los nodos de datos en un grupo de nodos contienen los mismos datos (fragmentos), y todos los nodos en un mismo grupo deben estar en distintas mquinas. Es posible controlar qu nodos pertenecen a qu grupos de nodos. Fallo de nodo: MySQL Cluster no slo depende de la funcionalidad de un nico nodo en el cluster; el cluster puede continuar funcionando si uno o ms nodos fallan. El nmero preciso de fallos de nodo que puede tolerar un nico cluster depende en el nmero de nodos de la configuracin del cluster. Reinicio de nodo: El proceso de restaurar un nodo de cluster fallido. Reinicio de nodo inicial: El proceso de arrancar un nodo de cluster con su sistema de fichero eliminado. Esto a veces se usa en actualizaciones de software y en otras circunstancias especiales. Fallo de sistema: Puede ocurrir cuando han fallado tantos nodos que el estado del cluster no puede garantizarse. Reinicio de sistema: El proceso de reiniciar el cluster y reinicializar su estado de logs de disco y checkpoints. Se requiere tras una parada planficada o no del cluster. Fragmento: Una porcin de una tabla; en el motor NDB una tabla se divide y almacena como un nmero de fragmentos. Un fragmento es a veces llamado particin; sin embargo, fragmento es la denominacin preferida.Las tablas fragmentadas en MySQL Cluster se usan para facilitar balanceo de carga entre mquinas y nodos. Rplica: Bajo el motor NDB , cada fragmento de tabla tiene un nmero de rplicas almacenadas en otros nodos de datos para proporcionar redundancia. Hay actualmente 4 rplicas por fragmento. Transporter: Protocolo que proporciona transferencia de datos entre nodos. MySQL Cluster soporta 4 tipos distintos de conexiones de transporters: TCP/IP (local) Protocolo de red habitual que existe bajo HTTP, FTP (y as ) en Internet. TCP/IP (remoto) Lo mismo que el anterior, excepto que se usa para comunicacin remota. SCI 894
Scalable Coherent Interface es un protocolo de alta velocidad usado para montar sistemas multiprocesador y aplicaciones paralelas. El uso de SCI con MySQL Cluster requiere hardware especializado y se discute en Seccin 16.7.1, Configurar MySQL Cluster para que utilice Sockets SCI. Para una introduccin bsica a SCI, consulte este ensayo de dolphinics.com. SHM shared memory segments (segmentos de memoria compartida). Donde se soporta, SHM se usa automticamente para conectar nodos en la misma mquina. La pgina de man Unix para shmop(2) es un buen sitio para obtener informacin adicional acerca de este tema. Nota: El transporter del cluster es interno. Las aplicaciones que usan MySQL Cluster se comunican con nodos SQL como se hace con cualquier otra versin de MySQL Server (via TCP/IP, o a travs del uso de sockets Unix o Windows named pipes). Las consultas pueden enviarse y recibirse los resultados usando la API estndar MySQL . NDB: Significa Network Database, y se refiere al motor de almacenamiento usando para permitir MySQL Cluster. El motor NDB soporta todos los tipos de columna MySQL habituales y comandos SQL , y cumple las reglas ACID. Este motor proporciona soporte para transacciones (commits y rollbacks). Arquitectura de comparticin cero: Arquitectura ideal para MySQL Cluster. En un entorno sin comparticin, cada nodo se ejecuta en mquinas separadas. La ventaja de este entorno es que ninguna mquina puede ser un punto de fallida nico o como cuello de botella del sistema. Almacenamiento en memoria: Todos los datos almacenados en cada nodo de datos se mantiene en memoria en la mquina del nodo. Para cada nodo de datos en el cluster, debe tener disponible una cantidad de RAM igual al tamao de la base de datos multiplicado por el nmero de rplicas, dividido por el nmero de nodos de datos. Por lo tanto, si la base de datos ocupa 1 GB de memoria, y quiere tener 4 rplicas en el cluster, necesita para cada nodo un mnimo de 500 . Tenga en cuenta que esto es adems de cualquier requerimiento para el sistema operativo u otra aplicacin que puede ejecutarse en el equipo. Tabla: Como es normal en el contexto de bases de datos relacionales, el trmino tabla denota un conjunto ordenado de requistros de idntica estructura. En MySQL Cluster, una tabla de base de datos se almacena en un nodo de datos como un conjunto de fragmentos, cada uno de ellos se replica en nodos de datos adicionales. El conjunto de nodos de datos replicando el mismo fragmento o conjunto de fragmentos se conoce como grupo de nodos. Programas del Cluster: Son programas de lnea de comandos usados para ejecutar, configurar y administrar MySQL Cluster. Incluyen demonios: ndbd: Demonio de nodo de datos (ejecuta un proceso de nodo de datos) ndb_mgmd: Demonio de servidor de administracin (ejecuta un proceso de servidor de administracin) y programas cliente: 895
ndb_mgm: El cliente de administracin (proporciona una interfaz para ejecutar comandos de administracin) ndb_waiter: Usado para verificar el estado de todos los nodos del cluster ndb_restore: Restaura datos del cluster de una copia de seguridad Para ms informacin de estos programas, consulte Seccin 16.5, Gestin de procesos en MySQL Cluster. Log de eventos: MySQL Cluster registra eventos por categora (arranque, parada, errores,checkpoints, y as), prioridad, y severidad. Un listado completo de todos los eventos reportables pueden encontrarse en Seccin 16.6.2, Informes de eventos generados por MySQL Cluster. Los logs de eventos son de dos tipos: Log de Cluster: Mantiene un registro de todos los eventos reportables deseados para el cluster entero. Log de Node: Un log separado que se mantiene para cada nodo individual. Bajo circunstancias normales, es necesario y suficiente mantener y examinar slo el log del cluster. Los logs de nodo tienen que ser consultados slo para desarrollo de aplicaciones y depuracin.
896
MaxDB is an enterprise-level database. MaxDB is the new name of a database management system formerly called SAP DB.
897
el back up en lnea como expansin de la base de datos estn soportados. El Servidor Cluster de Microsoft tiene soporte directo para mltiples instalaciones de servidores; otros requerimientos deben ser escritos manualmente. Las herramientas de administracin son provistas tanto en aplicaciones Desktop como implementaciones basadas en browser.
898
Para la lista de palabras reservardas en MySQL, Visite Seccin 9.6, Tratamiento de palabras reservadas en MySQL. Reserved in MaxDB @ ADDDATE() ADDTIME() ALPHA ARRAY ASCII() AUTOCOMMIT BOOLEAN Context of usage in MaxDB MySQL counterpart Can prefix identifier, like @table Funcion SQL Funcion SQL Funcion SQL Tipo de Dato Funcion SQL Transactions; ON by default Not allowed ADDDATE(); nuevo en MySQL 4.1.1 ADDTIME(); nuevo en MySQL 4.1.1 Sin comparacion Sin Implementar ASCII(), implementado pero con otro significado Transactions; OFF by default
Column types; BOOLEAN BOOLEAN was added in MySQL 4.1.0; it is accepts as values only TRUE, a synonym for BOOL which is mapped to FALSE, and NULL TINYINT(1). It accepts integer values in the same range as TINYINT as well as NULL. TRUE and FALSE can be used as aliases for 1 and 0. CHECK TABLE Column types SQL function CHECK TABLE; similar, but not identical usage COLUMN; noise word CHAR(); identical syntax; similar, not identical usage
Implicit commits of Implicit commits of transactions happen when data transactions happen when definition statements are issued, and also with a data definition statements are number of other statements issued SQL function SQL function SQL function SQL function SQL function SQL function SQL function SQL functions AVG, MAX, MIN, SUM DROP INDEX, for example SQL function SQL function Optimization SQL function SQL function SQL function SQL function Nothing comparable COT(); identical syntax and implementation DATABASE(); DATABASE is used in a different context; for example, CREATE DATABASE CURRENT_DATE DATEDIFF(); new in MySQL 4.1.1 Nothing comparable DAYOFWEEK(); by default, 1 represents Monday in MaxDB and Sunday in MySQL DISTINCT; but used in a different context: SELECT DISTINCT DROP INDEX; similar, but not identical usage Nothing comparable Nothing comparable EXPLAIN; similar, but not identical usage Nothing comparable Nothing comparable HEX(); similar, but not identical usage INSTR() or LOCATE(); similar, but not identical syntaxes and meanings
COSH() COT() CREATE DATABASE DATE() DATEDIFF() DAY() DAYOFWEEK() DISTINCT DROP EBCDIC() EXPAND() EXPLAIN FIXED() FLOAT() HEX() INDEX()
899
INDEX
USE INDEX, IGNORE INDEX and similar hints are used right after SELECT; for example, SELECT ... USE INDEX SQL function SQL function SQL function Comparisons MaxDB supports %, _, Control-underline, Control-up arrow, *, and ? as wildcards in LIKE comparisons SQL function SQL function SQL function SQL function SQL function SQL function SQL function Column types; comparisons
USE INDEX, IGNORE INDEX and similar hints are used in the FROM clause of a SELECT query; for example, in SELECT ... FROM ... USE INDEX Nothing comparable LENGTH(); identical syntax, but slightly different implementation Nothing comparable LIKE; but the extended LIKE MaxDB provides rather resembles the MySQL REGEX MySQL supports %, and _ as wildcards in LIKE comparisons
LPAD(); slightly different implementation LTRIM(); slightly different implementation MAKEDATE(); new in MySQL 4.1.1 MAKETIME(); new in MySQL 4.1.1 Nothing comparable MICROSECOND(); new in MySQL 4.1.1 Nothing comparable NULL; MaxDB supports special NULL values that are returned by arithmetic operations that lead to an overflow or a division by zero; MySQL does not support such special values PI(); identical syntax and implementation, but parentheses are mandatory in MySQL Nothing comparable Nothing comparable Similar to LIMIT clause RPAD(); slightly different implementation RTRIM(); slightly different implementation AUTO_INCREMENT; similar concept, but different implementation Nothing comparable SOUNDEX(); slightly different syntax ANALYZE TABLE; similar concept, but different implementation SUBSTRING(); slightly different implementation SUBTIME(); new in MySQL 4.1.1 Nothing comparable
PI REF RFILL() ROWNO RPAD() RTRIM() SEQUENCE SINH() SOUNDS() STATISTICS SUBSTR() SUBTIME() SYNONYM
SQL function Data type SQL function Predicate in WHERE clause SQL function SQL function CREATE SEQUENCE, DROP SEQUENCE SQL function SQL function UPDATE STATISTICS SQL function SQL function Data definition language: CREATE [PUBLIC] SYNONYM, RENAME SYNONYM, DROP SYNONYM SQL function
TANH()
Nothing comparable
900
CURRENT_TIME TIMEDIFF(); new in MySQL 4.1.1 TIMESTAMP(); new in MySQL 4.1.1 Nothing comparable
TIMESTAMP() SQL function as argument to DAYOFMONTH() and DAYOFYEAR() TIMEZONE() TRANSACTION() TRANSLATE() TRIM() TRUNC() USE SQL function Returns the ID of the current transaction SQL function SQL function SQL function Switches to a new database instance; terminates the connection to the current database instance; all subsequent commands are referred to this database instance SQL function
Nothing comparable Nothing comparable REPLACE(); identical syntax and implementation TRIM(); slightly different implementation TRUNCATE(); slightly different syntax and implementation USE; identical syntax, but does not terminate the connection to the current database
USER
USER(); identical syntax, but slightly different implementation, and parentheses are mandatory in MySQL UTC_DATE(); provides a means to calculate the same result as UTC_DIFF() COALESCE(); identical syntax and implementation VARIANCE(); new in MySQL 4.1.0 WEEKOFYEAR(); new in MySQL 4.1.1
SQL function SQL function, alias for COALESCE() SQL function SQL function
901
902
903
Introduccin
18.1. Introduccin
MySQL implementa extensiones espaciales siguiendo la especificacin del Consorcio Open GIS (OGC), un consorcio internacional de ms de 250 compaas, agencias y universidades que participan en el desarrollo de soluciones conceptuales pblicamente disponibles y que pueden ser tiles para todo tipo de aplicaciones que manejan datos espaciales. El OGC matiene una web en http://www.opengis.org/. En 1997, el Consorcio Open GIS public las Especificaciones de caractersticas simples Open GIS para SQL, un documento que propone diversas maneras conceptuales de extender un Sistema Gestor de Bases de Datos Relacionales para agregar soporte a datos espaciales. Esta especificacin est disponible en http://www.opengis.org/docs/99-049.pdf. Contiene informacin adicional relevante relacionada con este captulo. MySQL implementa un subconjunto del entorno SQL con Tipos Geomtricos propuesto por el OGC. Este trmino se refiere a un entorno SQL que ha sido extendido con un conjunto de tipos geomtricos. Una columna SQL con valores geomtricos se implementa como una columna que tiene un tipo geomtrico. Las especificaciones describen un conjunto de tipos geomtricos SQL, as como las funciones para analizar y crear valores geomtricos sobre esos tipos. Un elemento geogrfico es cualquier cosa en el mundo que tenga una ubicacin. Un elemento puede ser: Una entidad. Por ejemplo, una montaa, un lago, una ciudad. Un espacio. Por ejemplo, un rea de cdigo postal, los trpicos. Una ubicacin definible. Por ejemplo, un cruce de carreteras, como un lugar partcular donde dos calles se interseccionan. Tambin puede encontrar documentos que utilicen el trmino elementos geoespaciales para referirse a elementos geogrficos. Geometra es otra palabra que denota un elemento geogrfico. Originalmente la palabra geometra significaba medicin de la tierra. Otro significado viene de la cartografa, refirindose a los elementos geomtricos que los cartgrafos utilizan para crear mapas del mundo. Este captulo utiliza todos estos trminos a modo de sinnimos: This chapter uses all of these terms synonymously: elemento geogrfico, elemento geoespacial, elemento, o geometra. El trmino ms comnmente utilizado aqu es geometra. Definamos una geometra como un punto o conjunto de puntos representando cualquier cosa en el mundo que tenga una ubicacin.
904
La clase Geometry
Point (instanciable) Curve (no instanciable) LineString (instanciable) Line LinearRing Surface (no instanciable) Polygon (instanciable) GeometryCollection (instanciable) MultiPoint (instanciable) MultiCurve (no instanciable) MultiLineString (instanciable) MultiSurface (no instanciable) MultiPolygon (instanciable) No es posible crear objetos de clases no instanciables. Se pueden crear objetos de clases instanciables. Todas las clases tienen propiedades, y las clases instanciables pueden tener tambin aserciones (reglas que definen las instancias de clase vlidas). Geometry es la clase base. Es una clase abstracta. Las subclases instanciables de Geometry estn restringidas a objetos geomtricos cero-, uni-, y bi-dimensionales que existen en un espacio de coordenadas bidimensional. Todas las clases geomtricas instanciables son definidas de manera que las instancias vlidas de una clase geomtrica sean topolgicamente cerradas (es decir, que todas las geometras definidas incluyen su lmite). La clase base Geometry tiene las subclases Point, Curve, Surface, y GeometryCollection: Point representa objetos de cero dimensiones. Curve representa objetos unidimensionales, y tiene la subclase LineString, con sub-subclases Line y LinearRing. Surface est diseado para objetos bidimensionales y tiene la subclase Polygon. GeometryCollection tiene clases especializadas de cero, una y dos dimensiones llamadas MultiPoint, MultiLineString, y MultiPolygon para modelar geometras correspondientes a colecciones de Points, LineStrings, y Polygons, respectivamente. MultiCurve y MultiSurface han sido introducidas como superclases abstractas que generalizan las interfaces de la coleccin para manejar Curves y Surfaces. Geometry, Curve, Surface, MultiCurve, y MultiSurface estn definidas como clases no instanciables. Definen un conjunto comn de mtodos para sus subclases y se incluyen para ser extendidas. Point, LineString, Polygon, GeometryCollection, MultiPoint, MultiLineString, y MultiPolygon son clases instanciables.
905
La clase Geometry
subclases de Geometry. Estas propiedades estn descritas en la siguiente lista. (Algunas subclases en concreto tienen sus propiedades especficas, descritas ms tarde.) Propiedades de Geometry Un valor geomtrico tiene las siguientes propiedades: Su tipo. Cada geometra pertenece a una de las clases instanciables de la jerarqua. Su SRID, o IDentificador de Referencia eSpacial. Este valor identifica el Sistema de Referencia Espacial asociado a la geometra, que describe el espacio de coordenadas en el que la geometra est definida. En MySQL, el valor SRID es simplemente un entero asociado con el valor de la geometra. Todos los clculos se hacen asumiendo una geometra eucldea (planar). Sus coordenadas en este Sistema de Referencia Espacial, representadas como nmeros de doble precisin (ocho bytes). Todas las geometras no vacas incluyen al menos un par de coordenadas (X,Y). Las geometras vacas no contienen coordenadas. Las coordenadas estn relacionadas con el SRID. Por ejemplo, en diferentes sistemas de coordenadas, la distancia entre dos objetos puede diferir an cuando los objetos tengan las mismas coordenadas, porque la distancia en sistemas de coordenadas planares y la distancia en sistemas geocntricos (coordenadas en la superficie de la tierra) son cosas diferentes. Su interior, lmite, y exterior. Cada geometra ocupa una posicin en el espacio. El exterior de una geometra es todo el espacio no ocupado por la geometra. El interior es el espacio ocupado por la geometra. El lmite es la interfaz entre el interior y el exterior de la geometra. Its MBR (Minimum Bounding Rectangle), or Envelope. This is the bounding geometry, formed by the minimum and maximum (X,Y) coordinates:
((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
Si el valor es simple o no-simple. Los valores geomtricos de tipo (LineString, MultiPoint, MultiLineString) son o simples, o no-simples. Cada tipo determina sus propias aserciones para ser simple o no-simple. Si el valor es cerrado o no cerrado. Los valores geomtricos de tipo (LineString, MultiString) son o cerrados o no cerrados. Cada tipo determina sus propias aserciones para ser cerrado o no cerrado. Si el valor es vaco o no vaco. Una geometra es vaca si no tiene ningn punto. El exterior, interior, y lmite de de una geometra vaca no estn definidos (es decir, se representan por un valor NULL). Una geometra vaca est definida para ser siempre simple, y tiene un rea de 0. Su dimensin. Una geometra puede tener una dimensin de 1, 0, 1, o 2: 1 para una geometra vaca. 0 para una geometra sin longitud ni rea. 1 para una geometra con longitud diferente de cero y rea igual a cero. 2 para una geometra con rea diferente de cero. Los objetos Point tienen una dimensin de cero. Los objetos LineString tienen una dimensin de 1. Los objetos Polygon tienen una dimensin de 2. Las dimensiones de los objetos MultiPoint, MultiLineString, y MultiPolygon son las mismas que las dimensiones de los elementos que los componen.
906
La clase Point
907
La clase Surface
908
La clase MultiPoint
909
La clase MultiPolygon
Ntese que las coordenadas del punto se especifican sin coma separadora. Una LineString con cuatro puntos:
LINESTRING(0 0, 10 10, 20 25, 50 60)
910
Ntese que los pares de coordenadas de los puntos estn separados por comas. Un Polygon con un anillo exterior y un anillo interior:
POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
Puede encontrar una gramtica que especifica las reglas formales para la escritura de valores WKT en el documento de especificacin OGC referenciado al principio de este captulo.
La representacin de componentes es como sigue: El orden de byte puede ser 0 o 1, para indicar almacenamiento tipo little-endian o big-endian. Los rdenes de byte little-endian y big-endian son tambin conocidos como Representacin de Datos de Red (Network Data Representation (NDR)) y Representacin Externa de Datos (External Data Representation (XDR)), respectivamente. El tipo WKB es un cdigo que indica el tipo de geometra. Los valores del 1 al 7 significan Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, y GeometryCollection. Un valor Point tiene coordenadas X e Y, cada una representada por un valor de doble precisin. Los valores WKB que representan valores geomtricos ms complejos son representados por estructuras de datos ms complejas, tal como se detalla en la especificacin OpenGIS.
911
GeomFromText(wkt[,srid]) , GeometryFromText(wkt[,srid]) Construye un valor geomtrico de cualquier tipo utilizando su representacin WKT y su SRID.
912
PolyFromText(wkt[,srid]) , PolygonFromText(wkt[,srid]) Construye un valor POLYGON utilizando su representacin WKT y su SRID. La especificacin OpenGIS tambin describe funciones opcionales para construir valores Polygon o MultiPolygon basados en la representacin WKT de una coleccin de anillos o valores LineString cerrados. Estos valores pueden interseccionarse. MySQL no implementa estas funciones: BdMPolyFromText(wkt,srid) Construye un valor MultiPolygon desde un valor MultiLineString en formato WKT conteniendo una coleccin arbitraria de valores LineString cerrados.
BdPolyFromText(wkt,srid) Construye un valor Polygon desde un valor MultiLineString en formato WKT conteniendo una coleccin arbitraria de valores LineString cerrados.
913
GeomFromWKB() accepts a WKB of any geometry type as its first argument. An implementation also provides type-specific construction functions for construction of geometry values of each geometry type. GeomCollFromWKB(wkb[,srid]) , GeometryCollectionFromWKB(wkb[,srid]) Construye un valor GEOMETRYCOLLECTION utilizando su representacin WKB y su SRID.
GeomFromWKB(wkb[,srid]) , GeometryFromWKB(wkb[,srid]) Construye un valor geomtrico de cualquier tipo utilizando su representacin WKB y su SRID.
PolyFromWKB(wkb[,srid]) , PolygonFromWKB(wkb[,srid]) Construye un valor POLYGON utilizando su representacin WKB y su SRID. La especificacin OpenGIS tambin describe funciones opcionales para construir valores Polygon o MultiPolygon basndose en la representacin WKB de una coleccin de anillos o valores LineString cerrados. Estos valores puede interseccionarse. MySQL no implementa estas funciones: BdMPolyFromWKB(wkb,srid) Construye un valor MultiPolygon desde un valor MultiLineString en formato WKB que contiene una coleccin arbitraria de valores LineString cerrados.
914
BdPolyFromWKB(wkb,srid) Construye un valor Polygon desde un valor MultiLineString en formato WKB que contiene una coleccin arbitraria de valores LineString cerrados.
LineString(pt1,pt2,...) Construye un valor LineString WKB desde varios parmetos WKB de tipo Point. Si alguno de los argumentos no es un Point WKB, el valor retornado es NULL. Si el nmero de parmetros Point es menor de dos, el valor retornado es NULL.
MultiLineString(ls1,ls2,...) Construye un valor MultiLineString WKB desde varios parmetos WKB de tipo LineString. Si alguno de los argumentos no es un LineString WKB, el valor retornado es NULL.
MultiPoint(pt1,pt2,...) Construye un valor MultiPoint WKB desde varios parmetos WKB de tipo Point. Si alguno de los argumentos no es un Point WKB, el valor retornado es NULL.
MultiPolygon(poly1,poly2,...) Construye un valor MultiPolygon WKB desde varios parmetos WKB de tipo Polygon. Si alguno de los argumentos no es un Polygon WKB, el valor retornado es NULL.
915
Polygon(ls1,ls2,...) Construye un valor Polygon WKB desde varios parmetros LineString WKB. Si alguno de los argumentos no representa el WKB de un LinearRing (es decir, un LineString que no es cerrado y simple), el valor retornado es NULL.
Utilice la sentencia ALTER TABLE para aadir o eliminar una columna espacial a o de una tabla ya existente:
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
Los ejemplos precedentes utilizan todos GeomFromText() para crear valores geomtricos. Tambin puede utilizar funciones especficas de tipo:
916
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));
Tenga en cuenta que si un programa de aplicacin cliente quiere utilizar representaciones WKB de valores geomtricos, es responsable de enviar dichas representaciones correctamente formadas en las consultas al servidor. De cualquier modo, hay diversas maneras de satisfacer este requerimiento. Por ejemplo: Insertar un valor POINT(1 1) con sintaxis hexadecimal literal:
mysql> INSERT INTO geom VALUES -> (GeomFromWKB(0x0101000000000000000000F03F000000000000F03F));
Una aplicacin ODBC puede enviar una representacin WKB, encapsulndola en un comodn utilizando un argumento de tipo BLOB:
INSERT INTO geom VALUES (GeomFromWKB(?))
Otras interfaces de programacin pueden soportar un sistema de comodines similar. En un programa en C, puede marcar un valor binario utilizando mysql_real_escape_string() e incluir el resultado en una consulta que se enva al servidor. Consulte Seccin 24.2.3.48, mysql_real_escape_string().
917
AsText(g) Convierte un valor en formato interno a su representacin WKT y devuelve la cadena resultante.
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) | +--------------------------+
GeomFromText(wkt[,srid]) Convierte un valor de texto desde su representacin WKT al formato interno de geometra y retorna el resultado. Tambin hay varias funciones especficas de cada tipo que estn disponibles, tales como PointFromText() y LineFromText(); consulte Seccin 18.4.2.1, Crear valores geomtricos utilizando funciones WKT.
GeomFromWKB(wkb[,srid]) Convierte un valor binario desde su representacin WKB al formato interno de geometra y retorna el resultado. Tambin hay varias funciones especficas de cada tipo que estn disponibles, tales 918
Funciones Geometry
como PointFromWKB() y LineFromWKB(); consulte Seccin 18.4.2.2, Crear valores geomtricos utilizando funciones WKB.
mysql> SELECT Dimension(GeomFromText('LineString(1 1,2 2)')); +------------------------------------------------+ | Dimension(GeomFromText('LineString(1 1,2 2)')) | +------------------------------------------------+ | 1 | +------------------------------------------------+
Envelope(g) Retorna el rectngulo mnimo que circunscribe (Minimum Bounding Rectangle (MBR)) el valor geomtrico g. El resultado que se retorna es de tipo Polygon.
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)) | +-------------------------------------------------------+
El polgono est definido por los puntos de la esquina de la caja que lo circunscribe:
POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
GeometryType(g) Retorna en una cadena el nombre del tipo de la geometra de la que la instancia g es miembro. El nombre corresponde a una de las subclases instanciables de Geometry.
mysql> SELECT GeometryType(GeomFromText('POINT(1 1)')); +------------------------------------------+ | GeometryType(GeomFromText('POINT(1 1)')) | +------------------------------------------+ | POINT | +------------------------------------------+
919
Funciones Geometry
SRID(g) Retorna un entero que indica el Identificador de Sistema de Referencia Espacial del valor geomtrico g. En MySQL, el valor SRID es simplemente un entero asociado con el valor geometrico. Todos los clculos se realizan asumiendo una geometra Eucldea (planar).
mysql> SELECT SRID(GeomFromText('LineString(1 1,2 2)',101)); +-----------------------------------------------+ | SRID(GeomFromText('LineString(1 1,2 2)',101)) | +-----------------------------------------------+ | 101 | +-----------------------------------------------+
La especificacin OpenGIS tambin define las siguientes funciones, que MySQL no implementa: Boundary(g) Retorna una geometra que es el cierre del lmite combinacional del valor geomtrico g.
IsEmpty(g) Retorna 1 si el valor geomtrico g corresponde a la geometra vaca, 0 si no est vaca, y -1 si el argumento es NULL. Si la geometra est vaca, representa el conjunto de puntos vaco.
IsSimple(g) Actualmente esta funcin es un comodn y no debera ser utilizada. Si se implementara, su comportamiento ser como el que se detalla en el siguiente prrafo. Retorna 1 si el valor geomtrico g no tiene puntos geomtricos anmalos, tales como autointerseccin o auto-tangencia. IsSimple() retorna 0 si el argumento no es simple, y -1 si es NULL. La descripcin de cada clase geomtrica instanciable mencionada anteriormente en este captulo incluye las condiciones especficas que provcan que una instancia de una clase sea clasificada como no simple.
920
Funciones Geometry
Y(p) Retorna el valor de la coordenada Y del punto p como un nmero de doble precisin.
mysql> SELECT Y(GeomFromText('Point(56.7 53.34)')); +--------------------------------------+ | Y(GeomFromText('Point(56.7 53.34)')) | +--------------------------------------+ | 53.34 | +--------------------------------------+
GLength(ls) Devuelve la longitud del valor LineString ls como un nmero de doble precisin en su sistema de referencia espacial asociado.
mysql> SET @ls = 'LineString(1 1,2 2,3 3)'; mysql> SELECT GLength(GeomFromText(@ls)); +----------------------------+ | GLength(GeomFromText(@ls)) | +----------------------------+ | 2.8284271247462 | +----------------------------+
IsClosed(ls) Retorna 1 si el valor LineString ls es cerrado (es decir, su punto inicial StartPoint() y punto final EndPoint() tienen el mismo valor). Retorna 0 si ls es no cerrado, y -1 si es NULL.
mysql> SET @ls = 'LineString(1 1,2 2,3 3)'; mysql> SELECT IsClosed(GeomFromText(@ls)); +-----------------------------+ | IsClosed(GeomFromText(@ls)) | +-----------------------------+ | 0 | +-----------------------------+
921
Funciones Geometry
PointN(ls,n) Retorna el punto e-n-simo en el valor Linestring ls. Los nmeros de punto comienzan por 1.
mysql> SET @ls = 'LineString(1 1,2 2,3 3)'; mysql> SELECT AsText(PointN(GeomFromText(@ls),2)); +-------------------------------------+ | AsText(PointN(GeomFromText(@ls),2)) | +-------------------------------------+ | POINT(2 2) | +-------------------------------------+
StartPoint(ls) Retorna el Point que es el punto inicial del valor LineString ls.
mysql> SET @ls = 'LineString(1 1,2 2,3 3)'; mysql> SELECT AsText(StartPoint(GeomFromText(@ls))); +---------------------------------------+ | AsText(StartPoint(GeomFromText(@ls))) | +---------------------------------------+ | POINT(1 1) | +---------------------------------------+
La especificacin OpenGIS tambin define la siguiente funcin, que MySQL no implementa: IsRing(ls) Retorna 1 si el valor LineString ls es cerrado (es decir, que sus puntos inicial y final tienen el mismo valor) y es simple (no pasa a travs del mismo punto ms de una vez). Retorna 0 si ls no es un anillo, y -1 si es NULL.
922
Funciones Geometry
IsClosed(mls) Retorna 1 si el valor MultiLineString mls es cerrado (es decir, los valores del punto inicial y el punto final de cada LineString en mls son iguales entre s). Retorna 0 si mls es no cerrado, y -1 si es NULL.
mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))'; mysql> SELECT IsClosed(GeomFromText(@mls)); +------------------------------+ | IsClosed(GeomFromText(@mls)) | +------------------------------+ | 0 | +------------------------------+
ExteriorRing(poly) Retorna el anillo exterior del valor Polygon poly como un LineString.
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(ExteriorRing(GeomFromText(@poly))); +-------------------------------------------+ | AsText(ExteriorRing(GeomFromText(@poly))) | +-------------------------------------------+ | LINESTRING(0 0,0 3,3 3,3 0,0 0) | +-------------------------------------------+
InteriorRingN(poly,n) Retorna el e-n-simo anillo interior del valor Polygon poly como un LineString. Los nmeros de anillo comienzan en 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)) |
923
Funciones Geometry
La especificacin OpenGIS tambin define las siguientes funciones, que MySQL no implementa: Centroid(mpoly) Retorna el centroide matemtico del valor MultiPolygon mpoly como un Point. Este resultado no est garantizado que est contenido en el MultiPolygon.
PointOnSurface(mpoly) Retorna un valor Point del que se garantiza que est en el valor del MultiPolygon mpoly.
924
ConvexHull(g) Retorna una geometra que representa el borde convexo del valor geomtrico g.
Difference(g1,g2) Retorna una geometra que representa el conjunto de puntos resultado de la resta de los valores geomtricos g1 y g2.
Intersection(g1,g2)
925
Retorna una geometra que representa el conjunto de puntos resultado de la interseccin de los valores geomtricos g1 y g2.
SymDifference(g1,g2) Retorna una geometra que representa el conjunto de puntos resultado de la resta simtrica de los valores geomtricos g1 y g2.
Union(g1,g2) Retorna una geometra que representa el conjunto de puntos resultado de la unin de los valores geomtricos g1 y g2.
MBRDisjoint(g1,g2) Retorna 1 o 0 para indicar si los rectngulos mnimos que circunscriben a las geometras g1 y g2 son disjuntas (no se interseccionan), o no.
MBREqual(g1,g2) Retorna 1 o 0 para indicar si el rectngulo mnimo que circunscribe a las dos geometras g1 y g2 es o no es el mismo.
MBRIntersects(g1,g2)
926
Retorna 1 o 0 para indicar si los rectngulos mnimos que circunscriben a las geometras g1 y g2 se interseccionan o no.
MBROverlaps(g1,g2) Retorna 1 o 0 para indicar si los rectngulos mnimos que circunscriben a las geometras g1 y g2 se sobreponen o no.
MBRTouches(g1,g2) Retorna 1 o 0 para indicar si los rectngulos mnimos que circunscriben a las geometras g1 y g2 se tocan o no.
MBRWithin(g1,g2) Retorna 1 o 0 para indicar si el rectngulo mnimo que circunscribe a la geometra g1 se encuentra o no dentro del rectngulo mnimo que circunscribe a la geometra g2.
mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'); mysql> SET @g2 = GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))'); mysql> SELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1); +--------------------+--------------------+ | MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) | +--------------------+--------------------+ | 1 | 0 | +--------------------+--------------------+
Crosses(g1,g2) Retorna 1 si g1 cruza espacialmente a g2. Retorna NULL si g1 es un Polygon o un MultiPolygon, o si g2 es un Point o un MultiPoint. En cualquier otro caso, retorna 0. El trmino cruza espacialmente denota una relacin espacial entre dos geometras dadas que tiene las siguientes propiedades:
927
Las dos geometras se interseccionan La interseccin resulta en una geometra que tiene una dimensin que es una unidad menor que la dimensin mxima de las dos geometras dadas Su interseccin no es igual a ninguna de las dos geometras dadas.
Disjoint(g1,g2) Retorna 1 o 0 para indicar si g1 es o no espacialmente disjunto (no intersecciona) con g2.
Distance(g1,g2) Retorna un nmero de doble precisin que representa la distancia ms corta entre los puntos de ambas geometras.
Overlaps(g1,g2) Retorna 1 o 0 para indicar si g1 se superpone espacialmente o no a g2. El trmino superpone espacialmente se utiliza si dos geometras interseccionan y la interseccin resultante es una geometra de las mismas dimensiones pero no igual a ninguna de las geometras dadas.
Related(g1,g2,pattern_matrix) Retorna 1 o 0 paa indicar si la relacin espacial especificada por pattern_matrix existe entre g1 y g2. Retorna -1 si los argumentos son NULL. La matriz de patrones (pattern_matrix) es una cadena. Su especificacin se explicar aqu si la funcin llega a ser implementada.
Touches(g1,g2) Retorna 1 o 0 para indicar si g1 toca espacialmente o no a g2. Dos geometras se tocan espacialmente si los interiores de las dos geometras no interseccionan, pero el lmite de una de ellas intersecciona con el lmite o el interior de la otra.
928
Para eliminar ndices espaciales, utilice ALTER TABLE o DROP INDEX: Con ALTER TABLE:
mysql> ALTER TABLE geom DROP INDEX g;
Ejemplo: Suponga una tabla geom que contiene ms de 32000 geometras, que estn almacenadas en la columna g del tipo GEOMETRY. La tabla tambin tiene una columna AUTO_INCREMENT llamada fid para almacenar valores de ID de objetos.
mysql> DESCRIBE geom; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | fid | int(11) | | PRI | NULL | auto_increment | | g | geometry | | | | | +-------+----------+------+-----+---------+----------------+
929
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)
Utilicemos EXPLAIN para comprobar en qu manera se ejecuta esta consulta (la columna id ha sido eliminada para que el listado quede mejor maquetado en la pgina):
mysql> EXPLAIN SELECT fid,AsText(g) FROM geom WHERE mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))'),g +-------------+-------+-------+---------------+------+---------+------+------+-------------+ | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +-------------+-------+-------+---------------+------+---------+------+------+-------------+ | SIMPLE | geom | range | g | g | 32 | NULL | 50 | Using where | +-------------+-------+-------+---------------+------+---------+------+------+-------------+ 1 row in set (0.00 sec)
mysql> EXPLAIN SELECT fid,AsText(g) FROM g IGNORE INDEX (g) WHERE mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))'),g +-------------+-------+------+---------------+------+---------+------+-------+-------------+ | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +-------------+-------+------+---------------+------+---------+------+-------+-------------+
930
| 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)
Cuando el ndice no se utiliza, el tiempo de ejecucin de esta consulta crece de 0.00 segundos a 0.46 segundos. En versiones futuras, los ndice espaciales podrn tambin ser utilizados para optimizar otras funciones. Consulte Seccin 18.5.4, Funciones para probar relaciones espaciales entre objetos geomtricos.
La funcin OpenGIS Length() sobre LineString y MultiLineString actualmente debe llamarse en MySQL como GLength()
931
El problema es que existe una funcin SQL Length() que calcula la longitud de las cadenas de caracteres, y a veces no es posible distinguir cundo la funcin ha sido llamada en un contexto textual o espacial. Necesitamos resolver esto de alguna manera, o decidirnos por cambiar el nombre de la funcin.
932
933
934
[characteristic ...] routine_body CREATE FUNCTION sp_name ([parameter[,...]]) RETURNS type [characteristic ...] routine_body parameter: [ IN | OUT | INOUT ] param_name type type: Any valid MySQL data type characteristic: LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string' routine_body: procedimientos almacenados o comandos SQL vlidos
Estos comandos crean una rutina almacenada. Desde MySQL 5.0.3, para crear una rutina, es necesario tener el permiso CREATE ROUTINE , y los permisos ALTER ROUTINE y EXECUTE se asignan automticamente a su creador. Si se permite logueo binario necesita tambin el permisos SUPER como se describe en Seccin 19.3, Registro binario de procedimientos almacenados y disparadores. Por defecto, la rutina se asocia con la base de datos actual. Para asociar la rutina explcitamente con una base de datos, especifique el nombre como db_name.sp_name al crearlo. Si el nombre de rutina es el mismo que el nombre de una funcin de SQL, necesita usar un espacio entre el nombre y el siguiente parntesis al definir la rutina, o hay un error de sintaxis. Esto tambin es cierto cuando invoca la rutina posteriormente. La clusula RETURNS puede especificarse slo con FUNCTION, donde es obligatorio. Se usa para indicar el tipo de retorno de la funcin, y el cuerpo de la funcin debe contener un comando RETURN value. La lista de parmetros entre parntesis debe estar siempre presente. Si no hay parmetros, se debe usar una lista de parmetros vaca () . Cada parmetro es un parmetro IN por defecto. Para especificar otro tipo de parmetro, use la palabra clave OUT o INOUT antes del nombre del parmetro. Especificando IN, OUT, o INOUT slo es valido para una PROCEDURE. El comando CREATE FUNCTION se usa en versiones anteriores de MySQL para soportar UDFs (User Defined Functions) (Funciones Definidas por el Usuario). Consulte Seccin 27.2, Aadir nuevas funciones a MySQL. UDFs se soportan, incluso con la existencia de procedimientos almacenados. Un UDF puede tratarse como una funcin almacenada externa. Sin embargo, tenga en cuenta que los procedimientos almacenados comparten su espacio de nombres con UDFs. Un marco para procedimientos almacenados externos se introducir en el futuro. Esto permitira escribir procedimientos almacenados en lenguajes distintos a SQL. Uno de los primeros lenguajes a soportar ser PHP ya que el motor central de PHP es pequeo, con flujos seguros y puede empotrarse fcilmente. Como el marco es pblico, se espera soportar muchos otros lenguajes. Un procedimiento o funcin se considera determinista si siempre produce el mismo resultado para los mismos parmetros de entrada, y no determinista en cualquier otro caso. Si no se da ni DETERMINISTIC ni NOT DETERMINISTIC por defecto es NOT DETERMINISTIC. Para replicacin, use la funcin NOW() (o su sinnimo) o RAND() no hace una rutina no determinista necesariamente. Para NOW(), el log binario incluye el tiempo y hora y replica correctamente. RAND() tambin replica correctamente mientras se invoque slo una vez dentro de una rutina. (Puede considerar el tiempo y hora de ejecucin de la rutina y una semilla de nmero aleatorio como entradas implcitas que son idnticas en el maestro y el esclavo.)
935
Actualmente, la caracterstica DETERMINISTIC se acepta, pero no la usa el optimizador. Sin embargo, si se permite el logueo binario, esta caracterstica afecta si MySQL acepta definicin de rutinas. Consulte Seccin 19.3, Registro binario de procedimientos almacenados y disparadores. Varias caractersticas proporcionan informacin sobre la naturaleza de los datos usados por la rutina. CONTAINS SQL indica que la rutina no contiene comandos que leen o escriben datos. NO SQL indica que la rutina no contiene comandos SQL . READS SQL DATA indica que la rutina contiene comandos que leen datos, pero no comandos que escriben datos. MODIFIES SQL DATA indica que la rutina contiene comandos que pueden escribir datos. CONTAINS SQL es el valor por defecto si no se dan explcitamente ninguna de estas caractersticas. La caracterstica SQL SECURITY puede usarse para especificar si la rutina debe ser ejecutada usando los permisos del usuario que crea la rutina o el usuario que la invoca. El valor por defecto es DEFINER. Esta caracterstica es nueva en SQL:2003. El creador o el invocador deben tener permisos para acceder a la base de datos con la que la rutina est asociada. Desde MySQL 5.0.3, es necesario tener el permiso EXECUTE para ser capaz de ejecutar la rutina. El usuario que debe tener este permiso es el definidor o el invocador, en funcin de cmo la caracterstica SQL SECURITY . MySQL almacena la variable de sistema sql_mode que est en efecto cuando se crea la rutina, y siempre ejecuta la rutina con esta inicializacin. La clusula COMMENT es una extensin de MySQL, y puede usarse para describir el procedimiento almacenado. Esta informacin se muestra con los comandos SHOW CREATE PROCEDURE y SHOW CREATE FUNCTION . MySQL permite a las rutinas que contengan comandos DDL (tales como CREATE y DROP) y comandos de transaccin SQL (como COMMIT). Esto no lo requiere el estndar, y por lo tanto, es especfico de la implementacin. Los procedimientos almacenados no pueden usar LOAD DATA INFILE. Nota: Actualmente, los procedimientos almacenados creados con CREATE FUNCTION no pueden tener referencias a tablas. (Esto puede incluir algunos comandos SET que pueden contener referencias a tablas, por ejemplo SET a:= (SELECT MAX(id) FROM t), y por otra parte no pueden contener comandos SELECT , por ejemplo SELECT 'Hello world!' INTO var1.) Esta limitacin se elminar en breve. Los comandos que retornan un conjunto de resultados no pueden usarse desde una funcin almacenada. Esto incluye comandos SELECT que no usan INTO para tratar valores de columnas en variables, comandos SHOW y otros comandos como EXPLAIN. Para comandos que pueden determinarse al definir la funcin para que retornen un conjunto de resultados, aparece un mensaje de error Not allowed to return a result set from a function (ER_SP_NO_RETSET_IN_FUNC). Para comandos que puede determinarse slo en tiempo de ejecucin si retornan un conjunto de resultados, aparece el error PROCEDURE %s can't return a result set in the given context (ER_SP_BADSELECT). El siguiente es un ejemplo de un procedimiento almacenado que use un parmetro OUT . El ejemplo usa el cliente mysql y el comando delimiter para cambiar el delimitador del comando de ; a // mientras se define el procedimiento . Esto permite pasar el delimitador ; usado en el cuerpo del procedimiento a travs del servidor en lugar de ser interpretado por el mismo mysql.
mysql> delimiter // mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM t; -> END -> // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> CALL simpleproc(@a);
936
Query OK, 0 rows affected (0.00 sec) mysql> SELECT @a; +------+ | @a | +------+ | 3 | +------+ 1 row in set (0.00 sec)
Al usar el comando delimiter, debe evitar el uso de la antibarra ('\') ya que es el carcter de escape de MySQL. El siguiente es un ejemplo de funcin que toma un parmetro, realiza una operacin con una funcin SQL, y retorna el resultado:
mysql> delimiter // mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) -> RETURN CONCAT('Hello, ',s,'!'); -> // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> SELECT hello('world'); +----------------+ | hello('world') | +----------------+ | Hello, world! | +----------------+ 1 row in set (0.00 sec)
Si el comando RETURN en un procedimiento almacenado retorna un valor con un tipo distinto al especificado en la clusula RETURNS de la funcin, el valor de retorno se coherciona al tipo apropiado. Por ejemplo, si una funcin retorna un valor ENUM o SET, pero el comando RETURN retorna un entero, el valor retornado por la funcin es la cadena para el miembro de ENUM correspondiente de un conjunto de miembros SET .
Este comando puede usarse para cambiar las caractersticas de un procedimiento o funcin almacenada. Debe tener el permiso ALTER ROUTINE para la rutina desde MySQL 5.0.3. El permiso se otorga automticamente al creador de la rutina. Si est activado el logueo binario, necesitar el permiso SUPER , como se describe en Seccin 19.3, Registro binario de procedimientos almacenados y disparadores. Pueden especificarse varios cambios con ALTER PROCEDURE o ALTER FUNCTION.
Este comando se usa para borrar un procedimiento o funcin almacenado. Esto es, la rutina especificada se borra del servidor. Debe tener el permiso ALTER ROUTINE para las rutinas desde MySQL 5.0.3. Este permiso se otorga automticamente al creador de la rutina. La clusula IF EXISTS es una extensin de MySQL . Evita que ocurra un error si la funcin o procedimiento no existe. Se genera una advertencia que puede verse con SHOW WARNINGS.
937
Este comando es una extensin de MySQL . Similar a SHOW CREATE TABLE, retorna la cadena exacta que puede usarse para recrear la rutina nombrada.
mysql> SHOW CREATE FUNCTION test.hello\G *************************** 1. row *************************** Function: hello sql_mode: Create Function: CREATE FUNCTION `test`.`hello`(s CHAR(20)) RETURNS CHAR(50) RETURN CONCAT('Hello, ',s,'!')
Este comando es una extensin de MySQL . Retorna caractersticas de rutinas, como el nombre de la base de datos, nombre, tipo, creador y fechas de creacin y modificacin. Si no se especifica un patrn, le lista la informacin para todos los procedimientos almacenados, en funcin del comando que use.
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:
Tambin puede obtener informacin de rutinas almacenadas de la tabla ROUTINES en INFORMATION_SCHEMA. Consulte Seccin 22.1.14, La tabla INFORMATION_SCHEMA ROUTINES.
El comando CALL invoca un procedimiento definido prviamente con CREATE PROCEDURE. CALL puede pasar valores al llamador usando parmetros declarados como OUT o INOUT . Tambin retorna el nmero de registros afectados, que con un programa cliente puede obtenerse a nivel SQL llamando la funcin ROW_COUNT() y desde C llamando la funcin de la API C mysql_affected_rows() .
La sintaxis BEGIN ... END se utiliza para escribir sentencias compuestas que pueden aparecer en el interior de procedimientos almacenados y triggers. Una sentencia compuesta puede contener mltiples sentencias, encerradas por las palabras BEGIN y END. lista_sentencias es una lista de una o ms sentencias. Cada sentencia dentro de lista_sentencias debe terminar con un punto y como (;) delimitador de sentencias. lista_sentencias es opcional, lo que significa que la sentencia compuesta vaca (BEGIN END es correcta. El uso de mltiples sentencias requiere que el cliente pueda enviar cadenas de sentencias que contengan el delimitador ;. Esto se gestiona en el cliente de lnea de comandos mysql con el
938
Sentencia DECLARE
comando delimiter. Cambiar el delimitador de fin de sentencia ; (por ejemplo con //) permite utilizar ; en el cuerpo de una rutina. Vase por ejemplo Seccin 19.2.1, CREATE PROCEDURE y CREATE FUNCTION. Un comando compuesto puede etiquetarse. No se puede poner end_label a no ser que tambin est presente begin_label , y si ambos estn, deben ser iguales. La clusula opcional [NOT] ATOMIC no est soportada todava. Esto significa que no hay un punto transaccional al inicio del bloque de instrucciones y la clusula BEGIN usada en este contexto no tiene efecto en la transaccin actual.
Este comando se usa para declarar variables locales. Para proporcionar un valor por defecto para la variable, incluya una clusula DEFAULT . El valor puede especificarse como expresin, no necesita ser una constante. Si la clusula DEFAULT no est presente, el valor inicial es NULL. La visibilidad de una variable local es dentro del bloque BEGIN ... END donde est declarado. Puede usarse en bloques anidados excepto aqullos que declaren una variable con el mismo nombre.
El comando SET en procedimientos almacenados es una versin extendida del comando general SET. Las variables referenciadas pueden ser las declaradas dentro de una rutina, o variables de servidor globales. El comando SET en procedimientos almacenados se implemnta como parte de la sintaxis SET pre-existente. Esto permite una sintaxis extendida de SET a=x, b=y, ... donde distintos tipos de variables (variables declaradas local y globalmente y variables de sesin del servidor) pueden mezclarse. Esto permite combinaciones de variables locales y algunas opciones que tienen sentido slo para variables de sistema; en tal caso, las opciones se reconocen pero se ignoran.
Esta sintaxis SELECT almacena columnas seleccionadas directamente en variables. Por lo tanto, slo un registro puede retornarse.
SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
939
Este comando especifica condiciones que necesitan tratamiento especfico. Asocia un nombre con una condicin de error especfica. El nombre puede usarse subsecuentemente en un comando DECLARE HANDLER . Consulte Seccin 19.2.10.2, DECLARE handlers. Adems de valores SQLSTATE , los cdigos de error MySQL se soportan.
Este comando especifica handlers que pueden tratar una o varias condiciones. Si una de estas condiciones ocurren, el comando especificado se ejecuta. Para un handler CONTINUE , contina la rutina actual tras la ejecucin del comando del handler. Para un handler EXIT , termina la ejecucin del comando compuesto BEGIN...END actual. El handler de tipo UNDO todava no se soporta. SQLWARNING es una abreviacin para todos los cdigos SQLSTATE que comienzan con 01. NOT FOUND es una abreviacin para todos los cdigos SQLSTATE que comienzan con 02. SQLEXCEPTION es una abreviacin para todos los cdigos SQLSTATE no tratados por SQLWARNING o NOT FOUND. Adems de los valores SQLSTATE , los cdigos de error MySQL se soportan. Por ejemplo:
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 SQLSTATE '23000' SET @x2 = 1; -> SET @x = 1; -> INSERT INTO test.t VALUES (1); -> SET @x = 2; -> INSERT INTO test.t VALUES (1);
940
Cursores
-> 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)
Tenga en cuenta que @x es 3, lo que muestra que MySQL se ha ejecutado al final del procedimiento. Si la lnea DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; no est presente, MySQL habra tomado la ruta por defecto (EXIT) tras el segundo INSERT fallido debido a la restriccin PRIMARY KEY , y SELECT @x habra retornado 2.
19.2.11. Cursores
Se soportan cursores simples dentro de procedimientos y funciones almacenadas. La sintaxis es la de SQL empotrado. Los cursores no son sensibles, son de slo lectura, y no permiten scrolling. No sensible significa que el servidor puede o no hacer una copia de su tabla de resultados. Los cursores deben declararse antes de declarar los handlers, y las variables y condiciones deben declararse antes de declarar cursores o handlers. Por ejemplo:
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
Este comando declara un cursor. Pueden definirse varios cursores en una rutina, pero cada cursor en un bloque debe tener un nombre nico. El comando SELECT no puede tener una clusula INTO .
941
Este comando trata el siguiente registro (si existe) usando el cursor abierto que se especifique, y avanza el puntero del cursor. Si no existen ms registros disponibles, ocurrir una condicin de Sin Datos con el valor SQLSTATE 02000. Puede configurar un manejador (handler) para detectar esta condicin (o para una condicin NOT FOUND). Vea un ejemplo en la seccin Seccin 19.2.11, Cursores.
Este comando cierra un cursor abierto prviamente. Si no se cierra explcitamente, un cursor se cierra al final del comando compuesto en que se declara.
19.2.12.1. Sentencia IF
IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list] ... [ELSE statement_list] END IF
IF implementa un constructor condicional bsico. Si search_condition se evala a cierto, el comando SQL correspondiente listado se ejectua. Si no coincide ninguna search_condition se ejecuta el comando listado en la clusula ELSE. statement_list puede consistir en varios comandos. Tenga en cuenta que tambin hay una funcin IF(), que difiere del commando IF descrito aqu. Consulte Seccin 12.2, Funciones de control de flujo.
O:
CASE WHEN search_condition THEN statement_list [WHEN search_condition THEN statement_list] ... [ELSE statement_list] END CASE
942
El comando CASE para procedimientos almacenados implementa un constructor condicional complejo. Si una search_condition se evala a cierto, el comando SQL correspondiente se ejecuta. Si no coincide ninguna condicin de bsqueda, el comando en la clusula ELSE se ejecuta. Nota: La sitaxis de un comando CASE mostrado aqu para uso dentro de procedimientos almacenados difiere ligeramente de la expresin CASE SQL descrita en Seccin 12.2, Funciones de control de flujo. El comando CASE no puede tener una clusula ELSE NULL y termina con END CASE en lugar de END.
LOOP implementa un constructor de bucle simple que permite ejecucin repetida de comandos particulares. El comando dentro del bucle se repite hasta que acaba el bucle, usualmente con un comando LEAVE . Un comando LOOP puede etiquetarse. end_label no puede darse hasta que est presente begin_label , y si ambos lo estn, deben ser el mismo.
Este comando se usa para abandonar cualquier control de flujo etiquetado. Puede usarse con BEGIN ... END o bucles.
ITERATE slo puede aparecer en comandos LOOP, REPEAT, y WHILE . ITERATE significa vuelve a hacer el bucle. Por ejemplo:
CREATE PROCEDURE doiterate(p1 INT) BEGIN label1: LOOP SET p1 = p1 + 1; IF p1 < 10 THEN ITERATE label1; END IF; LEAVE label1; END LOOP label1; SET @x = p1; END
El comando/s dentro de un comando REPEAT se repite hasta que la condicin search_condition es cierta. Un comando REPEAT puede etiquetarse. end_label no puede darse a no ser que begin_label est presente, y si lo estn, deben ser el mismo. Por ejemplo:
mysql> delimiter // mysql> CREATE PROCEDURE dorepeat(p1 INT)
943
-> 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)
El comado/s dentro de un comando WHILE se repite mientras la condicin search_condition es cierta. Un comando WHILE puede etiquetarse. end_label no puede darse a no ser que begin_label tambin est presente, y si lo estn, deben ser el mismo. Por ejemplo:
CREATE PROCEDURE dowhile() BEGIN DECLARE v1 INT DEFAULT 5; WHILE v1 > 0 DO ... SET v1 = v1 - 1; END WHILE; END
944
pero los comandos invocados desde procedimientos almacenados se loguean. Suponga que ejecuta los siguientes comandos:
CREATE PROCEDURE mysp INSERT INTO t VALUES(1); CALL mysp;
Para este ejemplo, slo el comando INSERT aparecer en el log binario. Los comandos CREATE PROCEDURE y CALL no aparecern. La ausencia de comandos relacionados con rutinas en el log binario significa que procedimientos almacenados no se replican correctamente. Tambin significa que para operaciones de recuperacin de datos, re-ejectuar eventos en el log binario no recupera procedimientos almacenados. Para tratar estos temas de replicacin y recuperacin de datos, se cambi el logueo de procedimientos almacenados en MySQL 5.0.6. Sin embargo, este cambio provoca nuevos temas, que se presentan en la siguiente discusin. A no ser que se diga lo contrario, estas notas asumen que no ha activado el logueo binario arrancando el servidor con la opcin --log-bin . (Si el log binario no se activa, la replicacin no es posible, ni est disponible el log binario para replicacin de datos.) Consulte Seccin 5.10.3, El registro binario (Binary Log). Las caractersticas de logueo binario para comandos de procedimientos almacenados se describen en la siguiente lista. Algunos de los iconos indican problemas que debera conocer, pero en algunos casos, hay inicializaciones de servidor que puede modificar o soluciones que puede usar. Los comandos CREATE PROCEDURE, CREATE FUNCTION, ALTER PROCEDURE, y ALTER FUNCTION se escriben en el log binario, como lo son CALL, DROP PROCEDURE, y DROP FUNCTION. Sin embargo, hay implicaciones de seguridad para replicacin: para crear una rutina, un usuario debe tener el permiso CREATE ROUTINE , pero un usuario que tenga este permiso puede escribir una rutina para realizar cualquier accin en un servidor esclavo ya que el flujo SQL en el esclavo corre con todos los permisos. Por ejemplo, si el maestro y el esclavo tienen valores de ID del servidor de 1 y 2 respectivamente, un usuario en el maestro puede crear e invocar procedimientos como sigue:
mysql> mysql> -> -> -> -> mysql> mysql> delimiter // CREATE PROCEDURE mysp () BEGIN IF @@server_id=2 THEN DROP DATABASE accounting; END IF; END; // delimiter ; CALL mysp();
Los comandos CREATE PROCEDURE y CALL se escriben en el log binario, as que los ejecutar el esclavo. Ya que el flujo SQL del esclavo tiene todos los permisos, borra la base de datos accounting . Para evitar este peligro en servidores con logueo binario activado, MySQL 5.0.6 introduce el requerimiento que los creadores de procedimientos almacenados y funciones deben tener el permiso SUPER , adems del permiso CREATE ROUTINE requerido. Similarmente, para usar ALTER PROCEDURE o ALTER FUNCTION, debe tener el permiso SUPER adems del permiso ALTER ROUTINE . Sin el permiso SUPER ocurre un error:
ERROR 1419 (HY000): You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_routine_creators variable)
Puede no querer forzar el requerimiento en los creadores de rutinas que deben tener el permiso SUPER. Por ejemplo, todos los usuarios con el permiso CREATE ROUTINE en su sistema pueden ser desarrolladores de aplicaciones con experiencia. Para desactivar el requerimiento de SUPER, cambie la variable de sistema global log_bin_trust_routine_creators a 1. Por defecto, esta variable vale 0, pero puede cambiarla as:
945
Puede activar esta variable usando la opcin --log-bin-trust-routine-creators al arrancar el servidor. Si el logueo binario no est activado, log_bin_trust_routine_creators no se aplica y no se ncesita el permiso SUPER para creacin de rutinas. Una rutina no-determinista que realiza actualizaciones no es repetible, que puede tener dos efectos no deseables: El esclavo ser distinto al maestro. Los datos restaurados sern distintos a los originales. Para tratar estos problemas, MySQL fuerza los siguientes requerimientos: En un servidor maestro, la creacin y alteracin de una rutina se rehsa a no ser que la rutina se declare como determinista o que no modifique datos. Esto significa que cuando crea una rutina, debe declarar que es determinista o que no cambia datos. Dos conjuntos de caractersticas de rutinas se aplica aqu: DETERMINISTIC y NOT DETERMINISTIC indican si una rutina siempre produce el mismo resultado para entradas dadas. Por defecto es NOT DETERMINISTIC si no se da ninguna caracterstica, as que debe especificar DETERMINISTIC explcitamente para declarar que la rutina es determinista. El uso de las funciones NOW() (o sus sinnimos) o RAND() no hacen una rutina no-determinista necesariamente. Para NOW(), el log binario incluye la fecha y hora y replica correctamente. RAND() tambin replica correctamente mientras se invoque slo una vez dentro de una rutina. (Puede considerar la fecha y hora de ejecucin de la rutina y la semilla de nmeros aleatorios como entradas implcitas que son idnticas en el maestro y el esclavo.) CONTAINS SQL, NO SQL, READS SQL DATA, y MODIFIES SQL proporciona informacin acerca de si la rutina lee o escribe datos. Tanto NO SQL o READS SQL DATA indican que una rutina no cambia datos, pero debe especificar uno de estos explcitamente ya que por defecto es CONTAINS SQL si ninguna de estas caractersticas se da. Por defecto, para que un comando CREATE PROCEDURE o CREATE FUNCTION sea aceptado, DETERMINISTIC o NO SQL y READS SQL DATA deben especificarse explcitamente. De otro modo ocurre un error:
ERROR 1418 (HY000): This routine 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_routine_creators variable)
Si asigna a log_bin_trust_routine_creators 1, el requerimiento que la rutina sea determinista o que no modifique datos se elimina. Tenga en cuenta que la naturaleza de una rutina se basa en la honestidad del creador: MySQL no comprueba que una rutina declarada DETERMINISTIC no contenga comandos que produzcan productos no deterministas. Un comando CALL se escribe en el log binario si la rutina no retorna error, pero no en otro caso. Cuando una rutina que modifica datos falla, obtiene esta advertencia:
ERROR 1417 (HY000): 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
Este logueo del comportamiento tiene un potencial para causar problemas. Si una rutina modifica parcialmente una tabla no transaccional (tal como una tabla MyISAM ) y retorna un error, el log
946
binario no refleja estos cambios. Para protegerse de esto, debe usar trablas transaccionales en la rutina y modificar las tablas dentro de transacciones. Si usa la palabra clave IGNORE con INSERT, DELETE, o UPDATE para ignorar errores dentro de una rutina, una actualizacin parcial puede ocurrir sin producir error. Tales comandos se loguean y se replican normalmente. Si una funcin almacenada se invoca dentro de un comando tal como SELECT que no modifica datos, la ejecucin de la funcin no se escribe en el log binario, incluso si la funcin misma modifica datos. Este comportamiento de logueo tiene potencial para causar problemas. Suponga que una funcin myfunc() se define as:
CREATE FUNCTION myfunc () RETURNS INT BEGIN INSERT INTO t (i) VALUES(1); RETURN 0; END;
Dada esta definicin, el comando siguiente modifica la tabla t porque myfunc() modifica t, pero el comando no se escribe en el log binario porque es un SELECT:
SELECT myfunc();
Una solucin de este problema es invocar funciones que actualizan dentro de comandos que hacen actualizaciones. Tenga en cuenta que aunque el comando DO a veces se ejecuta como efecto colateral de evaluar una expresin, DO no es una solucin aqu porque no est escrito en el log binario. Los comandos ejecutados dentro de una rutina no se escriben en el log binario. Suponga que ejectua los siguientes comandos:
CREATE PROCEDURE mysp INSERT INTO t VALUES(1); CALL mysp;
Para este ejemplo, los comandos CREATE PROCEDURE y CALL aparecern en el log binario. El comando INSERT no aparecer. Esto arregla el problema que ocurre antes de MySQL 5.0.6 en que los comandos CREATE PROCEDURE y CALL no se loguearon y INSERT se logue. En servidores esclavos, la siguiente limitacin se aplica cuando se determina qu eventos del maestro se replican: reglas --replicate-*-table no se aplican a comandos CALL o a comandos dentro de rutinas: Las reglas en estos casos siempre retornan replica! Los disparadores son similares a los procedimientos almacenados, as que las notas precedentes tambin se aplican a disparadores con las siguientes excepciones: CREATE TRIGGER no tiene una caracterstica DETERMINISTIC opcional, as que los disparadores se asumen como deterministas. Sin embargo, esta hiptesis puede ser invlida en algunos casos . Por ejemplo, la funcin UUID() no es determinista (y no replica). Debe ser cuidadoso acerca de usar tales funciones y disparadores. Los disparadores actualmente no actualizan tablas, pero lo harn en el futuro. Por esta razn, los mensajes de error similares a los de los procedimientos almacenados ocurren con CREATE TRIGGER si no tiene el permiso SUPER y log_bin_trust_routine_creators es 0. Los temas tratados en esta seccin son resultado del hecho que el logueo binario se hace a nivel de comandos SQL. MySQL 5.1 introducir logueo binario a nivel de registro, lo que ocurre en un nivel ms granular que especifica qu cambios hacer a registros individuales como resultado de ejecutar comandos SQL.
947
948
A partir de MySQL 5.0.2 se incorpor el soporte bsico para disparadores (triggers). Un disparador es un objeto con nombre dentro de una base de datos el cual se asocia con una tabla y se activa cuando ocurre en sta un evento en particular. Por ejemplo, las siguientes sentencias crean una tabla y un disparador para sentencias INSERT dentro de la tabla. El disparador suma los valores insertados en una de las columnas de la tabla:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount;
Este captulo describe la sintaxis para crear y eliminar disparadores, y muestra algunos ejemplos de cmo utilizarlos. Las restricciones en el uso de disparadores se tratan en Apndice H, Restricciones en caractersticas de MySQL. En Seccin 19.3, Registro binario de procedimientos almacenados y disparadores se describe la forma en que se realiza el registro binario (binary logging) para los disparadores.
Un disparador es un objeto con nombre en una base de datos que se asocia con una tabla, y se activa cuando ocurre un evento en particular para esa tabla. El disparador queda asociado a la tabla nombre_tabla. Esta debe ser una tabla permanente, no puede ser una tabla TEMPORARY ni una vista. momento_disp es el momento en que el disparador entra en accin. Puede ser BEFORE (antes) o AFTER (despues), para indicar que el disparador se ejecute antes o despus que la sentencia que lo activa. evento_disp indica la clase de sentencia que activa al disparador. Puede ser INSERT, UPDATE, o DELETE. Por ejemplo, un disparador BEFORE para sentencias INSERT podra utilizarse para validar los valores a insertar. No puede haber dos disparadores en una misma tabla que correspondan al mismo momento y sentencia. Por ejemplo, no se pueden tener dos disparadores BEFORE UPDATE. Pero s es posible tener los disparadores BEFORE UPDATE y BEFORE INSERT o BEFORE UPDATE y AFTER UPDATE. sentencia_disp es la sentencia que se ejecuta cuando se activa el disparador. Si se desean ejecutar mltiples sentencias, deben colocarse entre BEGIN ... END, el constructor de sentencias compuestas. Esto adems posibilita emplear las mismas sentencias permitidas en rutinas almacenadas. Consulte Seccin 19.2.7, Sentencia compuesta BEGIN ... END. Note: Antes de MySQL 5.0.10, los disparadores no podan contener referencias directas a tablas por su nombre. A partir de MySQL 5.0.10, se pueden escribir disparadores como el llamado testref, que se muestra en este ejemplo:
949
CREATE TABLE test1(a1 INT); CREATE TABLE test2(a2 INT); CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); CREATE TABLE test4( a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0 ); DELIMITER | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END | DELIMITER ; INSERT INTO test3 (a3) VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL); INSERT INTO test4 (a4) VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);
950
| 6 | | 9 | | 10 | +----+ 5 rows in set (0.00 sec) mysql> SELECT * FROM test4; +----+------+ | a4 | b4 | +----+------+ | 1 | 3 | | 2 | 0 | | 3 | 1 | | 4 | 2 | | 5 | 0 | | 6 | 0 | | 7 | 1 | | 8 | 1 | | 9 | 0 | | 10 | 0 | +----+------+ 10 rows in set (0.00 sec)
Las columnas de la tabla asociada con el disparador pueden referenciarse empleando los alias OLD y NEW. OLD.nombre_col hace referencia a una columna de una fila existente, antes de ser actualizada o borrada. NEW.nombre_col hace referencia a una columna en una nueva fila a punto de ser insertada, o en una fila existente luego de que fue actualizada. El uso de SET NEW.nombre_col = valor necesita que se tenga el privilegio UPDATE sobre la columna. El uso de SET nombre_var = NEW.nombre_col necesita el privilegio SELECT sobre la columna. Nota: Actualmente, los disparadores no son activados por acciones llevadas a cabo en cascada por las restricciones de claves extranjeras. Esta limitacin se subsanar tan pronto como sea posible. La sentencia CREATE TRIGGER necesita el privilegio SUPER. Esto se agreg en MySQL 5.0.2.
Elimina un disparador. El nombre de esquema es opcional. Si el esquema se omite, el disparador se elimina en el esquema actual. Anteriormente a la versin 5.0.10 de MySQL, se requera el nombre de tabla en lugar del nombre de esquema. (nom_tabla.nom_disp). Nota: cuando se actualice desde una versin anterior de MySQL 5 a MySQL 5.0.10 o superior, se deben eliminar todos los disparadores antes de actualizar y volver a crearlos despus, o DROP TRIGGER no funcionar luego de la actualizacin. La sentencia DROP TRIGGER necesita que se posea el privilegio SUPER, que se introdujo en MySQL 5.0.2.
951
Utilizacin de disparadores
Un disparador se asocia con una tabla y se define para que se active al ocurrir una sentencia INSERT, DELETE, o UPDATE sobre dicha tabla. Puede tambin establecerse que se active antes o despues de la sentencia en cuestin. Por ejemplo, se puede tener un disparador que se active antes de que un registro sea borrado, o despus de que sea actualizado. Para crear o eliminar un disparador, se emplean las sentencias CREATE TRIGGER y DROP TRIGGER. La sintaxis de las mismas se describe en Seccin 20.1, Sintaxis de CREATE TRIGGER y Seccin 20.2, Sintaxis de DROP TRIGGER. Este es un ejemplo sencillo que asocia un disparador con una tabla para cuando reciba sentencias INSERT. Acta como un acumulador que suma los valores insertados en una de las columnas de la tabla. La siguiente sentencia crea la tabla y un disparador asociado a ella:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account -> FOR EACH ROW SET @sum = @sum + NEW.amount;
La sentencia CREATE TRIGGER crea un disparador llamado ins_sum que se asocia con la tabla account. Tambin se incluyen clusulas que especifican el momento de activacin, el evento activador, y qu hacer luego de la activacin: La palabra clave BEFORE indica el momento de accin del disparador. En este caso, el disparador debera activarse antes de que cada registro se inserte en la tabla. La otra palabra clave posible aqui es AFTER. La plabra clave INSERT indica el evento que activar al disparador. En el ejemplo, la sentencia INSERT causar la activacin. Tambin pueden crearse disparadores para sentencias DELETE y UPDATE. Las sentencia siguiente, FOR EACH ROW, define lo que se ejecutar cada vez que el disparador se active, lo cual ocurre una vez por cada fila afectada por la sentencia activadora. En el ejemplo, la sentencia activada es un sencillo SET que acumula los valores insertados en la columna amount. La sentencia se refiere a la columna como NEW.amount, lo que significa el valor de la columna amount que ser insertado en el nuevo registro. Para utilizar el disparador, se debe establecer el valor de la variable acumulador a cero, ejecutar una sentencia INSERT, y ver qu valor presenta luego la variable.
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 | +-----------------------+
En este caso, el valor de @sum luego de haber ejecutado la sentencia INSERT es 14.98 + 1937.50 - 100, o 1852.48. Para eliminar el disparador, se emplea una sentencia DROP TRIGGER. El nombre del disparador debe incluir el nombre de la tabla:
mysql> DROP TRIGGER account.ins_sum;
Debido a que un disparador est asociado con una tabla en particular, no se pueden tener mltiples disparadores con el mismo nombre dentro de una tabla. Tambin se debera tener en cuenta que el espacio de nombres de los disparadores puede cambiar en el futuro de un nivel de tabla a un nivel de base de datos, es decir, los nombres de disparadores ya no slo deberan ser nicos para cada tabla sino para toda la base de datos. Para una mejor compatibilidad con desarrollos futuros, se debe intentar emplear nombres de disparadores que no se repitan dentro de la base de datos.
952
Utilizacin de disparadores
Adicionalmente al requisito de nombres nicos de disparador en cada tabla, hay otras limitaciones en los tipos de disparadores que pueden crearse. En particular, no se pueden tener dos disparadores para una misma tabla que sean activados en el mismo momento y por el mismo evento. Por ejemplo, no se pueden definir dos BEFORE INSERT o dos AFTER UPDATE en una misma tabla. Es improbable que esta sea una gran limitacin, porque es posible definir un disparador que ejecute mltiples sentencias empleando el constructor de sentencias compuestas BEGIN ... END luego de FOR EACH ROW. (Ms adelante en esta seccin puede verse un ejemplo). Tambin hay limitaciones sobre lo que puede aparecer dentro de la sentencia que el disparador ejecutar al activarse: El disparador no puede referirse a tablas directamente por su nombre, incluyendo la misma tabla a la que est asociado. Sin embargo, se pueden emplear las palabras clave OLD y NEW. OLD se refiere a un registro existente que va a borrarse o que va a actualizarse antes de que esto ocurra. NEW se refiere a un registro nuevo que se insertar o a un registro modificado luego de que ocurre la modificacin. El disparador no puede invocar procedimientos almacenados utilizando la sentencia CALL. (Esto significa, por ejemplo, que no se puede utilizar un procedimiento almacenado para eludir la prohibicin de referirse a tablas por su nombre). El disparador no puede utilizar sentencias que inicien o finalicen una transaccin, tal como START TRANSACTION, COMMIT, o ROLLBACK. Las palabras clave OLD y NEW permiten acceder a columnas en los registros afectados por un disparador. (OLD y NEW no son sensibles a maysculas). En un disparador para INSERT, solamente puede utilizarse NEW.nom_col; ya que no hay una versin anterior del registro. En un disparador para DELETE slo puede emplearse OLD.nom_col, porque no hay un nuevo registro. En un disparador para UPDATE se puede emplear OLD.nom_col para referirse a las columnas de un registro antes de que sea actualizado, y NEW.nom_col para referirse a las columnas del registro luego de actualizarlo. Una columna precedida por OLD es de slo lectura. Es posible hacer referencia a ella pero no modificarla. Una columna precedida por NEW puede ser referenciada si se tiene el privilegio SELECT sobre ella. En un disparador BEFORE, tambin es posible cambiar su valor con SET NEW.nombre_col = valor si se tiene el privilegio de UPDATE sobre ella. Esto significa que un disparador puede usarse para modificar los valores antes que se inserten en un nuevo registro o se empleen para actualizar uno existente. En un disparador BEFORE, el valor de NEW para una columna AUTO_INCREMENT es 0, no el nmero secuencial que se generar en forma automtica cuando el registro sea realmente insertado. OLD y NEW son extensiones de MySQL para los disparadores. Empleando el constructor BEGIN ... END, se puede definir un disparador que ejecute sentencias mltiples. Dentro del bloque BEGIN, tambin pueden utilizarse otras sintaxis permitidas en rutinas almacenadas, tales como condicionales y bucles. Como sucede con las rutinas almacenadas, cuando se crea un disparador que ejecuta sentencias mltiples, se hace necesario redefinir el delimitador de sentencias si se ingresar el disparador a travs del programa mysql, de forma que se pueda utilizar el caracter ';' dentro de la definicin del disparador. El siguiente ejemplo ilustra estos aspectos. En l se crea un disparador para UPDATE, que verifica los valores utilizados para actualizar cada columna, y modifica el valor para que se encuentre en un rango de 0 a 100. Esto debe hacerse en un disparador BEFORE porque los valores deben verificarse antes de emplearse para actualizar el registro:
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;
953
Utilizacin de disparadores
Podra parecer ms fcil definir una rutina almacenada e invocarla desde el disparador utilizando una simple sentencia CALL. Esto sera ventajoso tambin si se deseara invocar la misma rutina desde distintos disparadores. Sin embargo, una limitacin de los disparadores es que no pueden utilizar CALL. Se debe escribir la sentencia compuesta en cada CREATE TRIGGER donde se la desee emplear. MySQL gestiona los errores ocurridos durante la ejecucin de disparadores de esta manera: Si lo que falla es un disparador BEFORE, no se ejecuta la operacin en el correspondiente registro. Un disparador AFTER se ejecuta solamente si el disparador BEFORE (de existir) y la operacin se ejecutaron exitosamente. Un error durante la ejecucin de un disparador BEFORE o AFTER deriva en la falla de toda la sentencia que provoc la invocacin del disparador. En tablas transaccionales, la falla de un disparador (y por lo tanto de toda la sentencia) debera causar la cancelacin (rollback) de todos los cambios realizados por esa sentencia. En tablas no transaccionales, cualquier cambio realizado antes del error no se ve afectado.
954
Las vistas (incluyendo vistas actualizables) fueron introducidas en la versin 5.0 del servidor de base de datos MySQL En este captulo se tratan los siguientes temas: Creacin o modificacin de vistas con CREATE VIEW o ALTER VIEW Eliminacin de vistas con DROP VIEW Obtencin de informacin de definicin de una vista (metadatos) con SHOW CREATE VIEW Para obtener informacin sobre las restricciones en el uso de vistas consulte Apndice H, Restricciones en caractersticas de MySQL. Si ha actualizado a MySQL 5.0.1 desde una versin anterior, debera actualizar las tablas de permisos para que contengan los privilegios relacionados con vistas. Consulte Seccin 2.10.2, Aumentar la versin de las tablas de privilegios.
Esta sentencia modifica la definicin de una vista existente. La sintaxis es semejante a la empleada en CREATE VIEW. Consulte Seccin 21.2, Sintaxis de CREATE VIEW. Se requiere que posea los permisos CREATE VIEW y DELETE para la vista, y algn privilegio en cada columna seleccionada por la sentencia SELECT. Esta sentencia se introdujo en MySQL 5.0.1.
Esta sentencia crea una vista nueva o reemplaza una existente si se incluye la clusula OR REPLACE. La sentencia_select es una sentencia SELECT que proporciona la definicin de la vista. Puede estar dirigida a tablas de la base o a otras vistas. Se requiere que posea el permiso CREATE VIEW para la vista, y algn privilegio en cada columna seleccionada por la sentencia SELECT. Para columnas incluidas en otra parte de la sentencia SELECT debe poseer el privilegio SELECT. Si est presente la clusula OR REPLACE, tambin deber tenerse el privilegio DELETE para la vista. Toda vista pertenece a una base de datos. Por defecto, las vistas se crean en la base de datos actual. Pera crear una vista en una base de datos especfica, indquela con base_de_datos.nombre_vista al momento de crearla.
955
Las tablas y las vistas comparten el mismo espacio de nombres en la base de datos, por eso, una base de datos no puede contener una tabla y una vista con el mismo nombre. Al igual que las tablas, las vistas no pueden tener nombres de columnas duplicados. Por defecto, los nombres de las columnas devueltos por la sentencia SELECT se usan para las columnas de la vista . Para dar explcitamente un nombre a las columnas de la vista utilice la clsula columnas para indicar una lista de nombres separados con comas. La cantidad de nombres indicados en columnas debe ser igual a la cantidad de columnas devueltas por la sentencia SELECT. Las columnas devueltas por la sentencia SELECT pueden ser simples referencias a columnas de la tabla, pero tambien pueden ser expresiones conteniendo funciones, constantes, operadores, etc. Los nombres de tablas o vistas sin calificar en la sentencia SELECT se interpretan como pertenecientes a la base de datos actual. Una vista puede hacer referencia a tablas o vistas en otras bases de datos precediendo el nombre de la tabla o vista con el nombre de la base de datos apropiada. Las vistas pueden crearse a partir de varios tipos de sentencias SELECT. Pueden hacer referencia a tablas o a otras vistas. Pueden usar combinaciones, UNION, y subconsultas. El SELECT inclusive no necesita hacer referencia a otras tablas. En el siguiente ejemplo se define una vista que selecciona dos columnas de otra tabla, as como una expresin calculada a partir de ellas:
mysql> CREATE TABLE t (qty INT, price INT); mysql> INSERT INTO t VALUES(3, 50); mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t; mysql> SELECT * FROM v; +------+-------+-------+ | qty | price | value | +------+-------+-------+ | 3 | 50 | 150 | +------+-------+-------+
La definicin de una vista est sujeta a las siguientes limitaciones: La sentencia SELECT no puede contener una subconsulta en su clusula FROM. La sentencia SELECT no puede hacer referencia a variables del sistema o del usuario. La sentencia SELECT no puede hacer referencia a parmetros de sentencia preparados. Dentro de una rutina almacenada, la definicin no puede hacer referencia a parmetros de la rutina o a variables locales. Cualquier tabla o vista referenciada por la definicin debe existir. Sin embargo, es posible que despus de crear una vista, se elimine alguna tabla o vista a la que se hace referencia. Para comprobar la definicin de una vista en busca de problemas de este tipo, utilice la sentencia CHECK TABLE. La definicin no puede hacer referencia a una tabla TEMPORARY, y tampoco se puede crear una vista TEMPORARY. Las tablas mencionadas en la definicin de la vista deben existir siempre. No se puede asociar un disparador con una vista. En la definicin de una vista est permitido ORDER BY, pero es ignorado si se seleccionan columnas de una vista que tiene su propio ORDER BY. Con respecto a otras opciones o clusulas incluidas en la definicin, las mismas se agregan a las opciones o clusulas de cualquier sentencia que haga referencia a la vista creada, pero el efecto
956
es indefinido. Por ejemplo, si la definicin de una vista incluye una clusula LIMIT, y se hace una seleccin desde la vista utilizando una sentencia que tiene su propia clusula LIMIT, no est definido cul se aplicar. El mismo principio se extiende a otras opciones como ALL, DISTINCT, o SQL_SMALL_RESULT que se ubican a continuacin de la palabra reservada SELECT, y a clusulas como INTO, FOR UPDATE, LOCK IN SHARE MODE, y PROCEDURE. Si se crea una vista y luego se modifica el entorno de proceso de la consulta a traves de la modificacin de variables del sistema, puede afectar los resultados devueltos por la vista:
mysql> CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65)); Query OK, 0 rows affected (0.00 sec) mysql> SET NAMES 'latin1'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM v; +-------------------+---------------------+ | CHARSET(CHAR(65)) | COLLATION(CHAR(65)) | +-------------------+---------------------+ | latin1 | latin1_swedish_ci | +-------------------+---------------------+ 1 row in set (0.00 sec) mysql> SET NAMES 'utf8'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM v; +-------------------+---------------------+ | CHARSET(CHAR(65)) | COLLATION(CHAR(65)) | +-------------------+---------------------+ | utf8 | utf8_general_ci | +-------------------+---------------------+ 1 row in set (0.00 sec)
La clusula opcional ALGORITHM es una extensin de MySQL al SQL estndar. ALGORITHM puede tomar tres valores: MERGE, TEMPTABLE, o UNDEFINED. El algoritmo por defecto es UNDEFINED si no se encuentra presente la clusula ALGORITHM. El algoritmo afecta la manera en que MySQL procesa la vista. Para MERGE, el texto de una sentencia que haga referencia a la vista y la definicin de la vista son mezclados de forma que parte de la definicin de la vista reemplaza las partes correspondientes de la consulta. Para TEMPTABLE, los resultados devueltos por la vista son colocados en una tabla temporal, la cual es luego utilizada para ejecutar la sentencia. Para UNDEFINED, MySQL determina el algoritmo que utilizar. En ese caso se prefiere MERGE por sobre TEMPTABLE si es posible, ya que MERGE por lo general es ms eficiente y porque la vista no puede ser actualizable si se emplea una tabla temporal. Una razn para elegir explcitamente TEMPTABLE es que los bloqueos en tablas subyacentes pueden ser liberados despues que la tabla temporal fue creada, y antes de que sea usada para terminar el procesamiento de la sentencia. Esto podra resultar en una liberacin del bloqueo ms rpida que en el algoritmo MERGE, de modo que otros clientes que utilicen la vista no estarn bloqueados mucho tiempo. El algoritmo de una vista puede ser UNDEFINED en tres situaciones: No se encuentra presente una clusula ALGORITHMen la sentencia CREATE VIEW. La sentencia CREATE VIEW tiene explcitamente una clusula ALGORITHM = UNDEFINED. Se especific ALGORITHM = MERGE para una vista que solamente puede ser procesada usando una tabla temporal. En este caso, MySQL emite una advertencia y establece el algoritmo en UNDEFINED.
957
Como se dijo anteriormente, MERGE provoca que las partes correspondientes de la definicin de la vista se combinen dentro de la sentencia que hace referencia a la vista. El siguiente ejemplo muestra brevemente cmo funciona el algoritmo MERGE. El ejemplo asume que hay una vista v_merge con esta definicin:
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS SELECT c1, c2 FROM t WHERE c3 > 100;
MySQL la gestiona del siguiente modo: v_merge se convierte en t * se convierte en vc1, vc2, que corresponden a c1, c2 Se agrega la clusula WHERE de la vista La sentencia ejecutada resulta ser:
SELECT c1, c2 FROM t WHERE c3 > 100;
Esta sentencia se gestiona en forma similar a la anterior, a excepcin de que vc1 < 100 se convierte en c1 < 100 y la clusula WHERE de la vista se agrega a la clusula WHERE de la sentencia empleando un conector AND (y se agregan parntesis para asegurarse que las partes de la clusula se ejecutarn en el orden de precedencia correcto). La sentencia ejecutada resulta ser:
SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100);
Necesariamente, la sentencia a ejecutar tiene una clusula WHERE con esta forma:
WHERE (WHERE de la sentencia) AND (WHERE de la vista)
El algoritmo MERGE necesita una relacin uno-a-uno entre los registros de la vista y los registros de la tabla subyacente. Si esta relacin no se sostiene, debe emplear una tabla temporal en su lugar. No se tendr una relacin uno-a-uno si la vista contiene cualquiera de estos elementos: Funciones agregadas (SUM(), MIN(), MAX(), COUNT(), etctera) DISTINCT GROUP BY HAVING UNION o UNION ALL Hace referencia solamente a valores literales (en tal caso, no hay una tabla subyacente) Algunas vistas son actualizables. Esto significa que se las puede emplear en sentencias como UPDATE, DELETE, o INSERT para actualizar el contenido de la tabla subyacente. Para que una vista sea actualizable, debe haber una relacin uno-a-uno entre los registros de la vista y los registros de la tabla subyacente. Hay otros elementos que impiden que una vista sea actualizable. Ms especficamente, una vista no ser actualizable si contiene: Funciones agregadas (SUM(), MIN(), MAX(), COUNT(), etctera) DISTINCT
958
GROUP BY HAVING UNION o UNION ALL Una subconsulta en la lista de columnas del SELECT Join Una vista no actualizable en la clusula FROM Una subconsulta en la clusula WHERE que hace referencia a una tabla en la clusula FROM Hace referencia solamente a valores literales (en tal caso no hay una) tabla subyacenta para actualizar. ALGORITHM = TEMPTABLE (utilizar una tabla temporal siempre resulta en una vista no actualizable) Con respecto a la posibilidad de agregar registros mediante sentencias INSERT, es necesario que las columnas de la vista actualizable tambin cumplan los siguientes requisitos adicionales: No debe haber nombres duplicados entre las columnas de la vista. La vista debe contemplar todas las columnas de la tabla en la base de datos que no tengan indicado un valor por defecto. Las columnas de la vista deben ser referencias a columnas simples y no columnas derivadas. Una columna derivada es una que deriva de una expresin. Estos son algunos ejemplos de columnas derivadas:
3.14159 col1 + 3 UPPER(col2) col3 / col4 (subquery)
No puede insertar registros en una vista conteniendo una combinacin de columnas simples y derivadas, pero puede actualizarla si actualiza nicamente las columnas no derivadas. Considere esta vista:
CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;
En esta vista no pueden agregarse registros porque col2 es derivada de una expresin. Pero ser actualizable si no intenta actualizar col2. Esta actualizacin es posible:
UPDATE v SET col1 = 0;
Esta actualizacin no es posible porque se intenta realizar sobre una columna derivada:
UPDATE v SET col2 = 0;
A veces, es posible que una vista compuesta por mltiples tablas sea actualizable, asumiendo que es procesada con el algoritmo MERGE. Para que esto funcione, la vista debe usar inner join (no outer join o UNION). Adems, solamente puede actualizarse una tabla de la definicin de la vista, de forma que la clusula SET debe contener columnas de slo una tabla de la vista. Las vistas que utilizan UNION ALL no se pueden actualizar aunque tericamente fuese posible hacerlo, debido a que en la implementacin se emplean tablas temporales para procesarlas. En vistas compuestas por mltiples tablas, INSERT funcionar si se aplica sobre una nica tabla. DELETE no est soportado. La clusula WITH CHECK OPTION puede utilizarse en una vista actualizable para evitar inserciones o actualizaciones excepto en los registros en que la clusula WHERE de la sentencia_select se evale como true.
959
En la clusula WITH CHECK OPTION de una vista actualizable, las palabras reservadas LOCAL y CASCADED determinan el alcance de la verificacin cuando la vista est definida en trminos de otras vistas. LOCAL restringe el CHECK OPTION slo a la vista que est siendo definida. CASCADED provoca que las vistas subyacentes tambin sean verificadas. Si no se indica, el valor por defecto es CASCADED. Considere las siguientes definiciones de tabla y vistas:
mysql> mysql> -> mysql> -> mysql> -> CREATE TABLE t1 (a INT); CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2 WITH CHECK OPTION; CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0 WITH LOCAL CHECK OPTION; CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0 WITH CASCADED CHECK OPTION;
Las vistas v2 y v3 estan definidas en trminos de otra vista, v1. v2 emplea check option LOCAL, por lo que las inserciones slo atraviesan la verificacin de v2 . v3 emplea check option CASCADED de modo que las inserciones no solamente atraviesan su propia verificacin sino tambien las de las vistas subyacentes. Las siguientes sentencias demuestran las diferencias:
ql> INSERT INTO v2 VALUES (2); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO v3 VALUES (2); ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'
La posibilidad de actualizacin de las vistas puede verse afectada por el valor de la variable del sistema updatable_views_with_limit. Consulte Seccin 5.3.3, Variables de sistema del servidor. La sentencia CREATE VIEW fue introducida en MySQL 5.0.1. La clusula WITH CHECK OPTION fue implementada en MySQL 5.0.2. INFORMATION_SCHEMA contiene una tabla VIEWS de la cual puede obtenerse informacin sobre los objetos de las vistas. Consulte Seccin 22.1.15, La tabla INFORMATION_SCHEMA VIEWS.
DROP VIEW elimina una o ms vistas de la base de datos. Se debe poseer el privilegio DROP en cada vista a eliminar. La clusula IF EXISTS se emplea para evitar que ocurra un error por intentar eliminar una vista inexistente. Cuando se utiliza esta clusula, se genera una NOTE por cada vista inexistente. Consulte Seccin 13.5.4.22, Sintaxis de SHOW WARNINGS. RESTRICT y CASCADE son ignoradas. Esta sentencia se introdujo en MySQL 5.0.1.
960
961
962
964 965 965 966 967 968 968 969 969 970 970 970 971 971 972 973 973 975 975
963
Explicacin: El comando pide una lista de todas las tablas en la base de datos db5, en orden alfabtico inverso, mostrando tres informaciones: el nombre de la tabla, su tipo y su motor. INFORMATION_SCHEMA es la base de datos de informacin, que almacena informacin acerca de todas las otras bases de datos que mantiene el servidor MySQL . Dentro del INFORMATION_SCHEMA hay varias tablas de slo lectura. En realidad son vistas, no tablas, as que no puede ver ningn fichero asociado con ellas. Cada usuario MySQL tiene derecho a acceder a estas tablas, pero slo a los registros que se corresponden a los objetos a los que tiene permiso de acceso. Ventajas de SELECT El comando SELECT ... FROM INFORMATION_SCHEMA es una forma ms consistente de proporcionar acceso a la informacin proporcionada por los comandos SHOW que soporta MySQL (SHOW DATABASES, SHOW TABLES, y as). Usar SELECT tiene las siguientes ventajas, en comparacin a SHOW: Cumple las reglas de Codd. Esto es, todo acceso se hace por tabla. Nadie necesita aprender una nueva sintaxis. Conocen cmo funciona SELECT , slo necesitan aprender los nombres de los objetos. El implementador no tiene que preocuparse de palabras clave. Hay millones de variaciones de la salida, en lugar de slo una. Esto proporciona flexibilidad a las aplicaciones con requerimientos cambiantes acerca de los metadatos que necesitan La migracin es ms fcil ya que todos los otros DBMS funcionan as. Sin embargo, como SHOW es popular entre los empleados y usuarios de MySQL, y como puede ser confuso si desaparece, las ventajas de una sintaxis convencional no es razn para eliminar SHOW. De hecho, hay mejoras a SHOW en MySQL 5.0. Se describen en Seccin 22.2, Extensiones a las sentencias SHOW. Estandars La implementacin de la estructura de tablas para el INFORMATION_SCHEMA en MySQL sigue el estndar ANSI/ISO SQL:2003 Parte 11 Schemata. Nuestra intencin es aproximar el cumplimiento de SQL:2003 caracterstica bsica F021 Basic information schema. Los usuarios de SQL Server 2000 (que tambin sigue el estndar) pueden ver una gran similitud. Sin embargo, MySQL omite varias columnas no relevantes para nuestra implementacin, y aade columnas que sn especficas de MySQL. Una de estas columnas es engine en la tabla INFORMATION_SCHEMA.TABLES. Aunque otros DBMS usan una variedad de nombres, como syscat o system, el nombre estndar es INFORMATION_SCHEMA. En efecto, tenemos una nueva base de datos llamada INFORMATION_SCHEMA, aunque no hay necesidad de hacer un fichero llamado as. Es posible seleccionar INFORMATION_SCHEMA como base de datos por defecto con un comando USE , pero la nica forma de acceder al contenido de sus tablas es con SELECT. No puede insertar, actualizar o borrar su contenido. Permisos No hay diferencia entre el requerimiento de permisos para (SHOW) y para SELECT . En cada caso, debe tener algn permiso de un objeto para consultar informacin acerca de el mismo.
Explicacin de las siguientes secciones En las siguientes secciones, tomamos tablas y columnas del INFORMATION_SCHEMA. Para cada columna, hay tres informaciones: Standard Name indica el nombre SQL estndar para la columna. SHOW name indica el nombre equivalente al comando SHOW ms parecido, si lo hay. Remarks proporciona informacin adicional donde sea aplicable. Para evitar usar nombres reservados del estndar o de DB2, SQL Server, o Oracle, hemos cambiado los nombres de las columnas marcados como extensin MySQL. (Por ejemplo, cambiamos COLLATION a TABLE_COLLATION en la tabla TABLES .) Consulte la lista de palabras reservadas al final del artculo: http://www.dbazine.com/gulutzan5.shtml. La definicin para columnas de caracteres (por ejemplo, TABLES.TABLE_NAME), generalmente es VARCHAR(N) CHARACTER SET utf8 donde N es como mnimo 64. Cada seccin indica qu comando SHOW es equivalente al SELECT que proporciona informacin de INFORMATION_SCHEMA, o si no hay tal equivalente. Nota: Por ahora, hay algunas columnas no presentes y algunas que no funcionan. Estamos trabajando en ello y tratamos de actualizar la documentacin tal y como se producen los cambios.
SHOW name -
NULL
965
TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT Notas:
Table_... Table_... 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 Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL
TABLE_SCHEMA y TABLE_NAME son campos simples en SHOW , por ejemplo Table_in_db1. TABLE_TYPE debe ser BASE TABLE o VIEW. Si la tabla es temporal, entonces TABLE_TYPE = TEMPORARY. (No hay vistas temporales, as que no es ambguo.) La columna TABLE_ROWS es NULL si la tabla est en la base de datos INFORMATION_SCHEMA . No tneemos nada para el conjunto de caracteres por defecto de la tabla. TABLE_COLLATION se acerca, ya que los nombres de colacin comienzan con el nombre del conjunto de caracteres. Los siguientes comandos son equivalentes:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES [WHERE table_schema = 'db_name'] [WHERE|AND table_name LIKE 'wild'] SHOW TABLES [FROM db_name] [LIKE 'wild']
966
ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME COLLATION_NAME COLUMN_KEY EXTRA COLUMN_COMMENT Notas: Collation Key Extra Comment Type Type Default Null Type Type
En SHOW, el Type incluye valores de varias columnas COLUMNS distintas. ORDINAL_POSITION es necesario ya que puede algn da querer decir ORDER BY ORDINAL_POSITION. Al contrario que SHOW, SELECT no tiene ordenacin automtica. CHARACTER_OCTET_LENGTH debe ser el mismo que CHARACTER_MAXIMUM_LENGTH, excepto para conjuntos de caracteres de mltiples bytes. CHARACTER_SET_NAME puede derivarse de Collation. Por ejemplo, si dice SHOW FULL COLUMNS FROM t, y ve en la columna Collation un valor de latin1_swedish_ci, el conjunto de caracteres es lo que hay antes del primer subrayado: latin1. Los siguientes comandos son casi equivalentes:
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]
967
Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL Extensin MySQL
No hay una tabla estndar para ndices. La lista precedente es similar a lo que retorna SQL Server 2000 para sp_statistics, excepto que hemos cambiado el nombre QUALIFIER con CATALOG y OWNER con SCHEMA. Claramente, la tabla precedente y la salida de SHOW INDEX se derivan del mismo padre. As que la correlacin est cercana. Los siguientes comandos son equivalentes:
SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name = 'tbl_name' [AND table_schema = 'db_name'] SHOW INDEX FROM tbl_name [FROM db_name]
968
SHOW name
PRIVILEGE_TYPE puede contener uno ( y slo uno ) de estos valores: SELECT, INSERT, UPDATE, REFERENCES, ALTER, INDEX, DROP, CREATE VIEW.
SHOW name
969
Remarks
Remarks
970
971
Por ejemplo, suponga que hay dos tablas llamadas t1 y t3 con las siguientes definiciones:
CREATE TABLE t1 ( s1 INT, s2 INT, s3 INT, PRIMARY KEY(s3) ) ENGINE=InnoDB; CREATE TABLE t3 ( s1 INT, s2 INT, s3 INT, KEY(s1), CONSTRAINT CO FOREIGN KEY (s2) REFERENCES t1(s3) ) ENGINE=InnoDB;
Para estas dos tablas, la tabla KEY_COLUMN_USAGE tiene dos registros: Un registro con CONSTRAINT_NAME='PRIMARY', TABLE_NAME='t1', COLUMN_NAME='s3', ORDINAL_POSITION=1, POSITION_IN_UNIQUE_CONSTRAINT=NULL. Un registro con CONSTRAINT_NAME='CO', TABLE_NAME='t3', COLUMN_NAME='s2', ORDINAL_POSITION=1, POSITION_IN_UNIQUE_CONSTRAINT=1. REFERENCED_TABLE_SCHEMA, REFERENCED_TABLE_NAME, y REFERENCED_COLUMN_NAME se aadieron en MySQL 5.0.6.
972
modified sql_mode comment definer Extensin MySQL Extensin MySQL Extensin MySQL
MySQL calcula EXTERNAL_LANGUAGE as: Si mysql.proc.language='SQL', entonces EXTERNAL_LANGUAGE es NULL En caso contrario, EXTERNAL_LANGUAGE es lo que hay en mysql.proc.language. Sin embargo, no tenemos idiomas externos de momento, as que siempre es NULL.
SHOW name
Remarks NULL
La columna CHECK_OPTION siempre tiene un valor de NONE. La columna IS_UPDATABLE es YES si la vista es actualizable, NO si la vista no es actualizable.
973
TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED Notas: Las columnas TRIGGER_SCHEMA y TRIGGER_NAME contienen el nombre de la base de datos en que se produce el dispardor, y el nombre del disparador, respectivamente. La columna EVENT_MANIPULATION contiene uno de los valores 'INSERT', 'DELETE', o 'UPDATE'. Como se explica en Captulo 20, Disparadores (triggers), cada disparador se asocia exactamente con una tabla. Las columnas EVENT_OBJECT_SCHEMA y EVENT_OBJECT_TABLE contienen la base de datos en que ocurre esta tabla, y el nombre de la tabla. El comando ACTION_ORDER contiene la posicin ordinal de la accin del disparador en la lista de todos los disparadores similares en la misma tabla. Actualmente, este valor siempre es 0, porque no es posible tener ms de un disparador con el mismo EVENT_MANIPULATION y ACTION_TIMING en la misma tabla. La columna ACTION_STATEMENT contiene el comando a ejecutarse cuando el disparador se invoca. Esto es lo mismo que el texto mostrado en la columna Statement de la salida de SHOW TRIGGERS. Tenga en cuenta que este texto usa codificacin UTF-8 . La columna ACTION_ORIENTATION siempre contiene el valor 'ROW'. La columna ACTION_TIMING contiene uno de los dos valores 'BEFORE' o 'AFTER'. Las columnas ACTION_REFERENCE_OLD_ROW y ACTION_REFERENCE_NEW_ROW contienen el antiguo y nuevo identificador de columna, respectivamente. Esto significa que ACTION_REFERENCE_OLD_ROW siempre contiene el valor 'OLD' y ACTION_REFERENCE_NEW_ROW siempre contiene el valor 'NEW'. Las siguientes columnas actualmente siempre contiene NULL: TRIGGER_CATALOG, EVENT_OBJECT_CATALOG, ACTION_CONDITION, ACTION_REFERENCE_OLD_TABLE, ACTION_REFERENCE_NEW_TABLE, y CREATED. Ejemplo, usando el disparador ins_sum definido en Seccin 20.3, Utilizacin de disparadores:
mysql> SELECT * FROM INFORMATION_SCHEMA.TRIGGERS\G *************************** 1. row ***************************
Table 0 NULL Statement ROW Timing NULL NULL OLD NEW NULL (0)
974
TRIGGER_CATALOG: TRIGGER_SCHEMA: TRIGGER_NAME: EVENT_MANIPULATION: EVENT_OBJECT_CATALOG: EVENT_OBJECT_SCHEMA: EVENT_OBJECT_TABLE: ACTION_ORDER: ACTION_CONDITION: ACTION_STATEMENT: ACTION_ORIENTATION: ACTION_TIMING: ACTION_REFERENCE_OLD_TABLE: ACTION_REFERENCE_NEW_TABLE: ACTION_REFERENCE_OLD_ROW: ACTION_REFERENCE_NEW_ROW: CREATED: 1 row in set (1.54 sec)
NULL test ins_sum INSERT NULL test account 0 NULL SET @sum = @sum + NEW.amount ROW BEFORE NULL NULL OLD NEW NULL
SHOW COLUMNS y DESCRIBE pueden mostrar informacin acerca de las columns en tablas INFORMATION_SCHEMA individuales.
975
La clusula WHERE , si est presente, se evala contra los nombres de columna mostrados por el comando SHOW. Por ejemplo, el comando SHOW COLLATION produce estas columnas de salida: Por ejemplo, el comando SHOW CHARACTER SET produce estas columnas de salida:
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 | ...
Para usar una clusula WHERE con SHOW CHARACTER SET, se referira a esos nombres de columna. Como ejemplo, el siguiente comando muestra informacin acerca de conjuntos de caracteres para los que la colacin por defecto contiene la cadena "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 | +---------+---------------------------+---------------------+--------+
976
MySQL 5 introduce matemticas de precisin, esto es, tratamiento numrico que proporciona resultados ms precisos y ms control sobre valores invlidos que en versiones anteriores de MySQL. La matemtica de precisin se basa en dos cambios de implementacin: La introduccin de nuevos modos SQL en MySQL 5.0.2 que controlan lo estricto que es el servidor para aceptar o rechazar datos invlidos. La introduccin en MySQL 5.0.3 de una biblioteca para aritmtica de punto fijo. Estos cambios tienen varias implicaciones para operaciones numricas: Clculos ms precisos. Para nmeros exactos, los clculos no introducen error en coma flotante. En su lugar, se usa precisin exacta. Por ejemplo, un nmero tal como .0001 se trata como un valor exacto en lugar de valor aproximado, y sumarlo 10,000 veces produce un resultado de 1, no un valor "cercano" a 1. Comportamiento bien definido para el redondeo. Para nmeros exactos, el resultado de ROUND() depende de sus argumentos, no de factores tales como el comportamiento de la biblioteca C subyacente. Independencia de plataforma mejorada. Las operaciones con nmeros exactos son los mismos entre distintas plataformas tales como Windows y Unix. Control sobre tratamiento de datos invlidos. Desbordamiento y divisin por cero pueden detectarse y tratarse como errores. Por ejemplo, puede tratar un valor que es demasiado grande para una columna como un error en lugar de truncarlo para adaptarlo al rango del tipo de datos. Similarmenet, puede tratar la divisin por cero como un error en lugar que como una operacin que produce un resultado de NULL. La eleccin de qu aproximacin seguir se determina mediante la variable de sistema sql_mode . Un resultado importante de estos cambios es que MySQL proporciona un mejor cumplimiento del estndar SQL. La siguiente discusin cubre varios aspectos de cmo funciona la matemtica de precisin (incluyendo posibles incompatibilidades con aplicaciones anteriores). Al final, se dan algunos ejemplos que demuestran cmo MySQL 5 trata operaciones numricas de forma ms precisa que anteriormente.
977
Literales numricos de valores exactos tienen una parte entera o fraccional, o ambas. Pueden tener signo. Ejemplos: 1, .2, 3.4, -5, -6.78, +9.10. Literales de valores numricos aproximados se representan en notacin cientfica con una mantisa y exponente. Una o ambas partes pueden tener signo. Ejemplos: 1.2E3, 1.2E-3, -1.2E3, -1.2E-3. Nmeros que parecen similares no necesitan ser ambos valores exactos o aproximados. Por ejemplo, 2.34 es un valor exacto (punto fijo), mientras que 2.34E0 es un valor aproximado (coma flotante). El tipo de datos DECIMAL es un tipo de punto fijo y los clculos son exactos. En MySQL, el tipo DECIMAL tiene varios sinnimos: NUMERIC, DEC, FIXED. El tipo entero tambin es un tipo de valor exacto. Los tipos de datos FLOAT y DOUBLE son tipos de coma flotante y los clculos son aproximados. En MySQL, los tipos sinnimos de FLOAT o DOUBLE son DOUBLE PRECISION y REAL.
978
Manejo de expresiones
Restantes 0 1 2 3 4 5 6 7 8 9
de Bytes 0 1 1 2 2 3 3 4 4 4
Como resultado del cambio de cadena de caracteres a formato numrico para almacenamiento DECIMAL, las columnas DECIMAL no necesitan un carcter '+' o dgito '0' precedente. Antes de MySQL 5.0.3, si insertaba '+0003.1' en una columna DECIMAL(5,1) , se almacenara como +0003.1. Desde MySQL 5.0.3, se almacena como 3.1. Aplicaciones que confan en el antiguo comportamiento deben modificarse teniendo en cuenta este cambio. El cambio de formato de almacenamiento tambin significa que las columnas DECIMAL no soportan la extensin no estndar que permita valores mayores que el rango implicado por la definicin de la columna. Antiguamente, se reservaba un byte para almacenar el carcter de signo. Para valores positivos que no necesitaban byte de signo, MySQL permita almacenar un byte extra. Por ejemplo, una columna DECIMAL(3,0) debe soportar un rango de al menos -999 a 999, pero MySQL debera permetir almacenar valores de 1000 a 9999 tambin, usando el byte de signo para almacenar un dgito extra. Esta extensin del rango superior de las columnas DECIMAL no se permite. En MySQL 5.0.3 y posteriores, una columna DECIMAL(M,D) permite como mucho MD dgitos a la izquierda del punto decimal. Esto puede resultar en una incompatibilidad si una aplicacin tiene confianza en que MySQL permita valores "demasiado grandes". El estndar SQL requiere que la precisin de NUMERIC(M,D) sean exactamente M dgitos. Para DECIMAL(M,D), requiere una precisin de al menos M dgitos, pero permite ms. En MySQL, DECIMAL(M,D) y NUMERIC(M,D) son los mismo y ambos tienen una precisin de exactamente M dgitos. Resumen de incompatibilidades: La siguiente lista resume las incompatibilidades resultantes de cambios de la columna DECIMAL y tratamiento de valores. Puede usarla como gua cuando al portar aplicaciones antiguas para usar con MySQL 5.0.3 y posteriores. Para DECIMAL(M,D), el mximo M es 64, no 254. Los clculos que implican valores decimales con valores exactos son precisos hasta 64 dgitos. Esto es menor que el nmero mximo de dgitos permitidos antes de MySQL 5.0.3 (254 dgitos), pero la precisin exacta es mayor. Los clculos anteriormente se hacan con punto flotante de doble precisin, que tiene una precisin de 52 bits (acerca de 15 dgitos decimales). La extensin no estndar MySQL del rango superior de columnas DECIMAL no se soporta. Los caracteres precedentes '+' y '0' no se almacenan.
979
Manejo de expresiones
se inserta un nmero con su valor exacto si est dentro del rango de la columna. Cuando se recibe, el valor debe ser el mismo que se insert. (Sin modo estricto, se permite truncar para INSERT.) El tratamiento de expresiones numricas depende de qu clase de valores contiene la expresin: Si hay presente algn valor aproximado, la expresin es aproximada y se evala usando aritmtica de punto flotante. Si no hay presente ningn valor aproximado, la expresin contiene slo valores exactos. Si algn valor exacto contiene una parte fraccional ( un valor a continuacin del punto decimal), la expresin se evala usando aritmtica exacta DECIMAL y una precisin de 64 dgitos. ("Exacto" esta sujeto a los lmites de lo que puede representarse en binario. 1.0/3.0 puede representarse como .333... con un nmero finito de dgitos, no como "exactamente un tercio", as que (1.0/3.0)*3.0 no se evala como "exactamente 1.0.") En otro caso, la expresin contiene slo valores enteros. La expresin es exacta y evaluada usando aritmtica entera y tiene la misma precisin que BIGINT (64 bits). Si una expresin numrica contiene cualquier cadena de caracteres, se convierten a valores de coma flotante y doble precisin y la expresin es aproximada. Las inserciones en columnas numricas estn afectadas por el modo SQL, controlada por la varible de sistema sql_mode. (Consulte Seccin 1.7.2, Seleccin de modos SQL.) La siguiente discusin menciona el modo estricto (seleccionado por los valores de modo STRICT_ALL_TABLES o STRICT_TRANS_TABLES) y ERROR_FOR_DIVISION_BY_ZERO. Para activar todas las restricciones, puede usar el modo TRADITIONAL, que incluye tanto el modo estricto como ERROR_FOR_DIVISION_BY_ZERO:
mysql> SET sql_mode='TRADITIONAL';
Si se inserta un nmero en una columna de tipo exacto (DECIMAL o entero), debe insertarse con su valor exacto si est dentro del rango de la columna. Si el valor tiene demasiados dgitos en la parte fraccional, se redondea y se genera una advertencia. El redondeo se hace como se describe en "Comportamiento del redondeo". Si el valor tiene demasiados dgitos en la parte entera, es demasiado grande y se trata como se explica a continuacin: Si el modo estricto no est activado, el valor se trunca al valor legal ms cercano y se genera una advertencia. Si el modo estricto est activo, se genera un error de desbordamiento. Desbordamiento inferior no se deteca, as que su tratamiento no est definido. Por defecto, la divisin por cero produce un resultado de NULL y ninguna advertencia. Con el modo SQL ERROR_FOR_DIVISION_BY_ZERO activado, MySQL trata la divisin por cero de forma distinta: Si el modo estricto no est activo, aparece una advertencia. Si el modo estricto est activo, las inserciones y actualizaciones con divisiones por cero estn prohibidas y ocurre un error. En otras palabras, inserciones y actualizaciones que impliquen expresiones que realizan divisiones por cero pueden tratarse como errores, pero esto requiere ERROR_FOR_DIVISION_BY_ZERO adems del modo estricto. Suponga que tenemos este comando:
INSERT INTO t SET i = 1/0;
980
Cmo se redondea
Resultado No advertencia, no error, i es NULL No advertencia, no error, i es NULL Advertencia, no error, i es NULL Error, no se inserta el registro
Para inserciones de cadenas de caracteres en columnas numricas, las conversiones de cadenas a nmeros se tratan como se muestra si la cadena tiene contenido no numrico: Una cadena que no comienza con un nmero no puede usarse como nmero y produce un error en modo estricto, o una advertencia en otro caso. Esto incluye la cadena vaca. Una cadena que comienza con un nmero puede convertirse, pero se trunca la parte no numrica final. Esto produce un error en modo estricto, o una advertencia en otro caso.
Para inserciones en una columna DECIMAL, el objetivo es un tipo de datos exacto, as que el redondea usa "redondeo al alza" independientemente de si el valor a ser insertado es exacto o aproximado:
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 | +------+ | 3 | | 3 | +------+
981
Ejemplo 1. Los nmeros se usan con su valor exacto tal y como se da cuando es posible. Antes de MySQL 5.0.3, los nmeros tratados como valores en coma flotante producen valores inexactos:
mysql> SELECT .1 + .2 = .3; +--------------+ | .1 + .2 = .3 | +--------------+ | 0 | +--------------+
Desde MySQL 5.0.3, los nmeros se usan tal y como se dan cuando es posible:
mysql> SELECT .1 + .2 = .3; +--------------+ | .1 + .2 = .3 | +--------------+ | 1 | +--------------+
Otra forma de ver la diferencia en el tratamiento de valores aproximados y exactos es aadir un pequeo nmero en una suma muchas veces. Considere el siguiente procedimiento aproximado, que aade .0001 a una variable 1000 veces.
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 suma de ambos d y f lgicamente debe ser 1, pero eso es cierto slo para clculos decimales. El clculo de coma flotante introduce pequeos errores:
+--------+------------------+ | d | f | +--------+------------------+ | 1.0000 | 0.99999999999991 | +--------+------------------+
Ejemplo 2. La multiplicacin se hace con la escala requerida por el estndar SQL. Esto es, para dos nmeros X1 y X2 con escala S1 y S2, la escala del resultado es S1 + S2. Antes de MySQL 5.0.3, esto es lo que ocurre:
mysql> SELECT .01 * .01; +-----------+ | .01 * .01 | +-----------+ | 0.00 | +-----------+
El valor mostrado es incorrecto. El valor se calcula correctamente en este caso, pero no se muestra en la escala requerida. Para comprobar que el valor calculado realmente es .0001, pruebe:
982
mysql> SELECT .01 * .01 + .0000; +-------------------+ | .01 * .01 + .0000 | +-------------------+ | 0.0001 | +-------------------+
Ejemplo 3. El comportamiento del redondeo est bien definido. Antes de MySQL 5.0.3, el comportamiento para el redondeo (por ejemplo con la funcin ROUND() ) depende de la implementacin de la biblioteca C subyacente. Esto provoca inconsistencias entre plataformas. Por ejemplo, puede obtener un valor distinto en Windows y en Linux, o un valor distinto en mquinas x86 y PowerPc. Desde MySQL 5.0.3, el redondeo se realiza as: El redondeo para columnas DECIMAL y de valor exacto usa la regla de "redondeo hacia arriba". Los valoeres con una parte fraccional de .5 o mayor se redondean al entero ms cercano y ms lejano al cero, como se muestra aqu:
mysql> SELECT ROUND(2.5), ROUND(-2.5); +------------+-------------+ | ROUND(2.5) | ROUND(-2.5) | +------------+-------------+ | 3 | -3 | +------------+-------------+
El redondeo de valores en coma flotante todava usa la biblioteca C, que en muchos sistemas usa la regla "redondeo al nmero par ms cercano". Los valores con cualquier parte fraccional se redondean al entero par ms cercano:
mysql> SELECT ROUND(2.5E0), ROUND(-2.5E0); +--------------+---------------+ | ROUND(2.5E0) | ROUND(-2.5E0) | +--------------+---------------+ | 2 | -2 | +--------------+---------------+
Ejemplo 4. Para inserciones en tablas, un valor demasiado grande provoca un desbordamiento y un error, no se trunca a un valor legal. (Esto requiere modo estricto.) Antes de MySQL 5.0.2, se truncaba a un valor legal:
mysql> CREATE TABLE t (i TINYINT); Query OK, 0 rows affected (0.00 sec) 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)
983
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)
Ejemplo 5. Para inserciones en tablas, la divisin por cero causa un error, no un resultado NULL. (Esto requiere modo estricto y ERROR_FOR_DIVISION_BY_ZERO.) Antes de MySQL 5.0.2, la divisin por cero tiene un resultado de 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)
Desde MySQL 5.0.2, la divisin por cero es un error si el modo SQL apropiado est activado:
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)
Ejemplo 6. En MySQL 4, literales de valores aproximados y exactos se convierten en valores de coma flotante y doble precisin:
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 | | +-------+-------------+------+-----+---------+-------+
En MySQL 5, el literal de valor aproximado todava se convierte en un valor de coma flotante, pero el literal de valor exacto se trata como 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 | | +-------+--------------+------+-----+---------+-------+
984
Ejemplo 7. Si el argumento de una funcin agregada es un tipo numrico exacto, el resultado debe serlo tambin, con una escala al menos igual a la del argumento. El resultado no debe siempre ser un valor double. Considere estos comandos:
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;
El resultado es un double independientemente del tipo del argumento. Resultado desde 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 | | +--------+---------------+------+-----+---------+-------+
El resultado es un double slo para el argumento de coma flotante. El resultado es un tipo exacto para argumentos con tipos exactos.
985
986
24.1.1. msql2mysql
En un principio, la API C de MySQL se desarroll con el fin de que fuera muy similar a la existente para el sistema de bases de datos mSQL. Debido a esto, los programas mSQL a menudo pueden
987
mysql_config
convertirse de manera relativamente sencilla para ser empleados con MySQL, cambiando los nombres de las funciones de la API C. La utilidad msql2mysql lleva a cabo la conversin de llamadas a funciones de la API C de mSQL hacia sus equivalentes en MySQL. msql2mysql trabaja directamente sobre el fichero original, por lo que debe hacerse una copia del mismo antes de intentar la conversin. Por ejemplo, msql2mysql puede emplearse de esta manera:
shell> cp client-prog.c client-prog.c.orig shell> msql2mysql client-prog.c client-prog.c converted
Then examine client-prog.c and make any post-conversion revisions that may be necessary. msql2mysql uses the replace utility to make the function name substitutions. See Seccin 8.12, La utilidad replace de cambio de cadenas de caracteres.
24.1.2. mysql_config
mysql_config provides you with useful information for compiling your MySQL client and connecting it to MySQL. mysql_config supports the following options: --cflags Compiler flags to find include files and critical compiler flags and defines used when compiling the libmysqlclient library. --include Compiler options to find MySQL include files. (Note that normally you would use --cflags instead of this option.) --libmysqld-libs, ---embedded Libraries and options required to link with the MySQL embedded server. --libs Libraries and options required to link with the MySQL client library. --libs_r Libraries and options required to link with the thread-safe MySQL client library. --port The default TCP/IP port number, defined when configuring MySQL. --socket The default Unix socket file, defined when configuring MySQL. --version Version number and version for the MySQL distribution. If you invoke mysql_config with no options, it displays a list of all options that it supports, and their values:
shell> mysql_config
988
La API C de MySQL
Usage: /usr/local/mysql/bin/mysql_config [options] Options: --cflags [-I/usr/local/mysql/include/mysql -mcpu=pentiumpro] --include [-I/usr/local/mysql/include/mysql] --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]
You can use mysql_config within a command line to include the value that it displays for a particular option. For example, to compile a MySQL client program, use mysql_config as follows:
shell> CFG=/usr/local/mysql/bin/mysql_config shell> sh -c "gcc -o progname `$CFG --cflags` progname.c `$CFG --libs`"
When you use mysql_config this way, be sure to invoke it within backtick ('`') characters. That tells the shell to execute it and substitute its output into the surrounding command.
MYSQL This structure represents a handle to one database connection. It is used for almost all MySQL functions. You should not try to make a copy of a MYSQL structure. There is no guarantee that such a copy will be usable.
MYSQL_RES This structure represents the result of a query that returns rows (SELECT, SHOW, DESCRIBE, EXPLAIN). The information returned from a query is called the result set in the remainder of this section.
MYSQL_ROW This is a type-safe representation of one row of data. It is currently implemented as an array of counted byte strings. (You cannot treat these as null-terminated strings if field values may contain binary data, because such values may contain null bytes internally.) Rows are obtained by calling mysql_fetch_row().
MYSQL_FIELD This structure contains information about a field, such as the field's name, type, and size. Its members are described in more detail here. You may obtain the MYSQL_FIELD structures for each field by calling mysql_fetch_field() repeatedly. Field values are not part of this structure; they are contained in a MYSQL_ROW structure.
MYSQL_FIELD_OFFSET This is a type-safe representation of an offset into a MySQL field list. (Used by mysql_field_seek().) Offsets are field numbers within a row, beginning at zero.
my_ulonglong The type used for the number of rows and for mysql_affected_rows(), mysql_num_rows(), and mysql_insert_id(). This type provides a range of 0 to 1.84e19. On some systems, attempting to print a value of type my_ulonglong does not work. To print such a value, convert it to unsigned long and use a %lu print format. Example:
printf ("Number of rows: %lu\n", (unsigned long) mysql_num_rows(result));
The MYSQL_FIELD structure contains the members listed here: char * name The name of the field, as a null-terminated string. char * table The name of the table containing this field, if it isn't a calculated field. For calculated fields, the table value is an empty string. char * def
990
The default value of this field, as a null-terminated string. This is set only if you use mysql_list_fields(). enum enum_field_types type The type of the field. The type value may be one of the MYSQL_TYPE_ symbols shown in the following table. Type Value MYSQL_TYPE_TINY MYSQL_TYPE_SHORT MYSQL_TYPE_LONG MYSQL_TYPE_INT24 MYSQL_TYPE_LONGLONG MYSQL_TYPE_DECIMAL MYSQL_TYPE_NEWDECIMAL MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE MYSQL_TYPE_TIMESTAMP MYSQL_TYPE_DATE MYSQL_TYPE_TIME MYSQL_TYPE_DATETIME MYSQL_TYPE_YEAR MYSQL_TYPE_STRING MYSQL_TYPE_VAR_STRING MYSQL_TYPE_BLOB MYSQL_TYPE_SET MYSQL_TYPE_ENUM MYSQL_TYPE_NULL MYSQL_TYPE_CHAR Type Description TINYINT field SMALLINT field INTEGER field MEDIUMINT field BIGINT field DECIMAL or NUMERIC field Precision math DECIMAL or NUMERIC field (MySQL 5.0.3 and up) FLOAT field DOUBLE or REAL field TIMESTAMP field DATE field TIME field DATETIME field YEAR field CHAR field VARCHAR field BLOB or TEXT field (use max_length to determine the maximum length) SET field ENUM field NULL-type field Deprecated; use MYSQL_TYPE_TINY instead
You can use the IS_NUM() macro to test whether a field has a numeric type. Pass the type value to IS_NUM() and it evaluates to TRUE if the field is numeric:
if (IS_NUM(field->type)) printf("Field is numeric\n");
unsigned int length The width of the field, as specified in the table definition. unsigned int max_length The maximum width of the field for the result set (the length of the longest field value for the rows actually in the result set). If you use mysql_store_result() or mysql_list_fields(), this contains the maximum length for the field. If you use mysql_use_result(), the value of this variable is zero. unsigned int flags
991
Different bit-flags for the field. The flags value may have zero or more of the following bits set: Flag Value NOT_NULL_FLAG PRI_KEY_FLAG UNIQUE_KEY_FLAG MULTIPLE_KEY_FLAG UNSIGNED_FLAG ZEROFILL_FLAG BINARY_FLAG AUTO_INCREMENT_FLAG ENUM_FLAG SET_FLAG BLOB_FLAG TIMESTAMP_FLAG Flag Description Field can't be NULL Field is part of a primary key Field is part of a unique key Field is part of a non-unique key Field has the UNSIGNED attribute Field has the ZEROFILL attribute Field has the BINARY attribute Field has the AUTO_INCREMENT attribute Field is an ENUM (deprecated) Field is a SET (deprecated) Field is a BLOB or TEXT (deprecated) Field is a TIMESTAMP (deprecated)
Use of the BLOB_FLAG, ENUM_FLAG, SET_FLAG, and TIMESTAMP_FLAG flags is deprecated because they indicate the type of a field rather than an attribute of its type. It is preferable to test field->type against MYSQL_TYPE_BLOB, MYSQL_TYPE_ENUM, MYSQL_TYPE_SET, or MYSQL_TYPE_TIMESTAMP instead. The following example illustrates a typical use of the flags value:
if (field->flags & NOT_NULL_FLAG) printf("Field can't be null\n");
You may use the following convenience macros to determine the boolean status of the flags value: Flag Status IS_NOT_NULL(flags) IS_PRI_KEY(flags) IS_BLOB(flags) Description True if this field is defined as NOT NULL True if this field is a primary key True if this field is a BLOB or TEXT (deprecated; test field->type instead)
992
Creates a database. This function is deprecated; use the SQL statement CREATE DATABASE instead. Seeks to an arbitrary row number in a query result set. Does a DBUG_PUSH with the given string. Drops a database. This function is deprecated; use the SQL statement DROP DATABASE instead. Makes the server write debug information to the log. Determines whether the last row of a result set has been read. This function is deprecated; mysql_errno() or mysql_error() may be used instead. Returns the error number for the most recently invoked MySQL function. Returns the error message for the most recently invoked MySQL function. Escapes special characters in a string for use in an SQL statement. Returns the type of the next table field. Returns the type of a table field, given a field number. Returns an array of all field structures. Returns the lengths of all columns in the current row. Fetches the next row from the result set. Puts the column cursor on a specified column. Returns the number of result columns for the most recent statement. Returns the position of the field cursor used for the last mysql_fetch_field(). Frees memory used by a result set. Returns client version information as a string. Returns client version information as an integer. Returns a string describing the connection. Returns version number of server as an integer (new in 4.1). Returns the protocol version used by the connection. Returns the server version number. Returns information about the most recently executed query. Gets or initializes a MYSQL structure. Returns the ID generated for an AUTO_INCREMENT column by the previous query. Kills a given thread. Finalize MySQL C API library. Initialize MySQL C API library. Returns database names matching a simple regular expression. Returns field names matching a simple regular expression. Returns a list of the current server threads. Returns table names matching a simple regular expression. Returns the number of columns in a result set. Returns the number of rows in a result set.
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_library_end() mysql_library_init() mysql_list_dbs() mysql_list_fields() mysql_list_processes() mysql_list_tables() mysql_num_fields() mysql_num_rows()
993
mysql_options() mysql_ping() mysql_query() mysql_real_connect() mysql_real_escape_string() mysql_real_query() mysql_reload() mysql_row_seek() mysql_row_tell() mysql_select_db() mysql_server_end() mysql_server_init() 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()
Sets connect options for mysql_connect(). Checks whether the connection to the server is working, reconnecting as necessary. Executes an SQL query specified as a null-terminated string. Connects to a MySQL server. Escapes special characters in a string for use in an SQL statement, taking into account the current charset of the connection. Executes an SQL query specified as a counted string. Tells the server to reload the grant tables. Seeks to a row offset in a result set, using value returned from mysql_row_tell(). Returns the row cursor position. Selects a database. Finalize embedded server library. Initialize embedded server library. Sets an option for the connection (like multi-statements). Returns the SQLSTATE error code for the last error. Shuts down the database server. Returns the server status as a string. Retrieves a complete result set to the client. Returns the current thread ID. Returns 1 if the clients are compiled as thread-safe. Initiates a row-by-row result set retrieval. Returns the warning count for the previous SQL statement. Commits the transaction. Rolls back the transaction. Toggles autocommit mode on/off. Checks whether any more results exist. Returns/initiates the next result in multiple-statement executions.
Application programs should use this general outline for interacting with MySQL: 1. Initialize the MySQL library by calling mysql_library_init(). The library can be either the mysqlclient C client library or the mysqld embedded server library, depending on whether the application was linked with the -libmysqlclient or -libmysqld flag. 2. Initialize a connection handler by calling mysql_init() and connect to the server by calling mysql_real_connect(). 3. Issue SQL statements and process their results. (The following discussion provides more information about how to do this.) 4. Close the connection to the MySQL server by calling mysql_close(). 5. End use of the MySQL library by calling mysql_library_end(). The purpose of calling mysql_library_init() and mysql_library_end() is to provide proper initialization and finalization of the MySQL library. For applications that are linked with the client library, they provide improved memory management. If you don't call mysql_library_end(), a block of memory remains allocated. (This does not increase the amount of memory used by the application, but
994
some memory leak detectors will complain about it.) For applications that are linked with the embedded server, these calls start and stop the server. mysql_library_init() and mysql_library_end() are available as of MySQL 4.1.10 and 5.0.3. These actually are #define symbols that make them equivalent to mysql_server_init() and mysql_server_end(), but the names more clearly indicate that they should be called when beginning and ending use of a MySQL library no matter whether the application uses the mysqlclient or mysqld library. For older versions of MySQL, you can call mysql_server_init() and mysql_server_end() instead. If you like, the call to mysql_library_init() may be omitted, because mysql_init() will invoke it automatically as necessary. To connect to the server, call mysql_init() to initialize a connection handler, then call mysql_real_connect() with that handler (along with other information such as the hostname, username, and password). Upon connection, mysql_real_connect() sets the reconnect flag (part of the MYSQL structure) to a value of 1 in versions of the API strictly older than 5.0.3, of 0 in newer versions. A value of 1 for this flag indicates, in the event that a query cannot be performed because of a lost connection, to try reconnecting to the server before giving up. When you are done with the connection, call mysql_close() to terminate it. While a connection is active, the client may send SQL queries to the server using mysql_query() or mysql_real_query(). The difference between the two is that mysql_query() expects the query to be specified as a null-terminated string whereas mysql_real_query() expects a counted string. If the string contains binary data (which may include null bytes), you must use mysql_real_query(). For each non-SELECT query (for example, INSERT, UPDATE, DELETE), you can find out how many rows were changed (affected) by calling mysql_affected_rows(). For SELECT queries, you retrieve the selected rows as a result set. (Note that some statements are SELECT-like in that they return rows. These include SHOW, DESCRIBE, and EXPLAIN. They should be treated the same way as SELECT statements.) There are two ways for a client to process result sets. One way is to retrieve the entire result set all at once by calling mysql_store_result(). This function acquires from the server all the rows returned by the query and stores them in the client. The second way is for the client to initiate a row-by-row result set retrieval by calling mysql_use_result(). This function initializes the retrieval, but does not actually get any rows from the server. In both cases, you access rows by calling mysql_fetch_row(). With mysql_store_result(), mysql_fetch_row() accesses rows that have previously been fetched from the server. With mysql_use_result(), mysql_fetch_row() actually retrieves the row from the server. Information about the size of the data in each row is available by calling mysql_fetch_lengths(). After you are done with a result set, call mysql_free_result() to free the memory used for it. The two retrieval mechanisms are complementary. Client programs should choose the approach that is most appropriate for their requirements. In practice, clients tend to use mysql_store_result() more commonly. An advantage of mysql_store_result() is that because the rows have all been fetched to the client, you not only can access rows sequentially, you can move back and forth in the result set using mysql_data_seek() or mysql_row_seek() to change the current row position within the result set. You can also find out how many rows there are by calling mysql_num_rows(). On the other hand, the memory requirements for mysql_store_result() may be very high for large result sets and you are more likely to encounter out-of-memory conditions. An advantage of mysql_use_result() is that the client requires less memory for the result set because it maintains only one row at a time (and because there is less allocation overhead,
995
mysql_use_result() can be faster). Disadvantages are that you must process each row quickly to avoid tying up the server, you don't have random access to rows within the result set (you can only access rows sequentially), and you don't know how many rows are in the result set until you have retrieved them all. Furthermore, you must retrieve all the rows even if you determine in mid-retrieval that you've found the information you were looking for. The API makes it possible for clients to respond appropriately to queries (retrieving rows only as necessary) without knowing whether or not the query is a SELECT. You can do this by calling mysql_store_result() after each mysql_query() (or mysql_real_query()). If the result set call succeeds, the query was a SELECT and you can read the rows. If the result set call fails, call mysql_field_count() to determine whether a result was actually to be expected. If mysql_field_count() returns zero, the query returned no data (indicating that it was an INSERT, UPDATE, DELETE, etc.), and was not expected to return rows. If mysql_field_count() is non-zero, the query should have returned rows, but didn't. This indicates that the query was a SELECT that failed. See the description for mysql_field_count() for an example of how this can be done. Both mysql_store_result() and mysql_use_result() allow you to obtain information about the fields that make up the result set (the number of fields, their names and types, etc.). You can access field information sequentially within the row by calling mysql_fetch_field() repeatedly, or by field number within the row by calling mysql_fetch_field_direct(). The current field cursor position may be changed by calling mysql_field_seek(). Setting the field cursor affects subsequent calls to mysql_fetch_field(). You can also get information for fields all at once by calling mysql_fetch_fields(). For detecting and reporting errors, MySQL provides access to error information by means of the mysql_errno() and mysql_error() functions. These return the error code or error message for the most recently invoked function that can succeed or fail, allowing you to determine when an error occurred and what it was.
/* incorrect */
/* incorrect */
When a function returns an error, the Errors subsection of the function description lists the possible types of errors. You can find out which of these occurred by calling mysql_errno(). A string representation of the error may be obtained by calling mysql_error().
24.2.3.1. mysql_affected_rows()
my_ulonglong mysql_affected_rows(MYSQL *mysql) Description Returns the number of rows changed by the last UPDATE, deleted by the last DELETE or inserted by the last INSERT statement. May be called immediately after mysql_query() for UPDATE,
996
DELETE, or INSERT statements. For SELECT statements, mysql_affected_rows() works like mysql_num_rows(). Return Values An integer greater than zero indicates the number of rows affected or retrieved. Zero indicates that no records were updated for an UPDATE statement, no rows matched the WHERE clause in the query or that no query has yet been executed. -1 indicates that the query returned an error or that, for a SELECT query, mysql_affected_rows() was called prior to calling mysql_store_result(). Because mysql_affected_rows() returns an unsigned value, you can check for -1 by comparing the return value to (my_ulonglong)-1 (or to (my_ulonglong)~0, which is equivalent). Errors None. Example
mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"); printf("%ld products updated",(long) mysql_affected_rows(&mysql));
If you specify the flag CLIENT_FOUND_ROWS when connecting to mysqld, mysql_affected_rows() returns the number of rows matched by the WHERE statement for UPDATE statements. Note that when you use a REPLACE command, mysql_affected_rows() returns 2 if the new row replaced an old row. This is because in this case one row was inserted after the duplicate was deleted. If you use INSERT ... ON DUPLICATE KEY UPDATE to insert a row, mysql_affected_rows() returns 1 if the row is inserted as a new row and 2 if an existing row is updated.
24.2.3.2. mysql_change_user()
my_bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db) Description Changes the user and causes the database specified by db to become the default (current) database on the connection specified by mysql. In subsequent queries, this database is the default for table references that do not include an explicit database specifier. This function was introduced in MySQL 3.23.3. mysql_change_user() fails if the connected user cannot be authenticated or doesn't have permission to use the database. In this case the user and database are not changed The db parameter may be set to NULL if you don't want to have a default database. Starting from MySQL 4.0.6 this command always performs a ROLLBACK of any active transactions, closes all temporary tables, unlocks all locked tables and resets the state as if one had done a new connect. This happens even if the user didn't change. Return Values Zero for success. Non-zero if an error occurred. Errors The same that you can get from mysql_real_connect().
997
CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred. ER_UNKNOWN_COM_ERROR The MySQL server doesn't implement this command (probably an old server). ER_ACCESS_DENIED_ERROR The user or password was wrong. ER_BAD_DB_ERROR The database didn't exist. ER_DBACCESS_DENIED_ERROR The user did not have access rights to the database. ER_WRONG_DB_NAME The database name was too long. Example
if (mysql_change_user(&mysql, "user", "password", "new_database")) { fprintf(stderr, "Failed to change user. Error: %s\n", mysql_error(&mysql)); }
24.2.3.3. mysql_character_set_name()
const char *mysql_character_set_name(MYSQL *mysql) Description Returns the default character set for the current connection. Return Values The default character set Errors None.
24.2.3.4. mysql_close()
void mysql_close(MYSQL *mysql) 998
Description Closes a previously opened connection. mysql_close() also deallocates the connection handle pointed to by mysql if the handle was allocated automatically by mysql_init() or mysql_connect(). Return Values None. Errors None.
24.2.3.5. mysql_connect()
MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd) Description This function is deprecated. It is preferable to use mysql_real_connect() instead. mysql_connect() attempts to establish a connection to a MySQL database engine running on host. mysql_connect() must complete successfully before you can execute any of the other API functions, with the exception of mysql_get_client_info(). The meanings of the parameters are the same as for the corresponding parameters for mysql_real_connect() with the difference that the connection parameter may be NULL. In this case the C API allocates memory for the connection structure automatically and frees it when you call mysql_close(). The disadvantage of this approach is that you can't retrieve an error message if the connection fails. (To get error information from mysql_errno() or mysql_error(), you must provide a valid MYSQL pointer.) Return Values Same as for mysql_real_connect(). Errors Same as for mysql_real_connect().
24.2.3.6. mysql_create_db()
int mysql_create_db(MYSQL *mysql, const char *db) Description Creates the database named by the db parameter. This function is deprecated. It is preferable to use mysql_query() to issue an SQL CREATE DATABASE statement instead. Return Values Zero if the database was created successfully. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC
999
Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred. Example
if(mysql_create_db(&mysql, "my_database")) { fprintf(stderr, "Failed to create new database. mysql_error(&mysql)); }
Error: %s\n",
24.2.3.7. mysql_data_seek()
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset) Description Seeks to an arbitrary row in a query result set. The offset value is a row number and should be in the range from 0 to mysql_num_rows(result)-1. This function requires that the result set structure contains the entire result of the query, so mysql_data_seek() may be used only in conjunction with mysql_store_result(), not with mysql_use_result(). Return Values None. Errors None.
24.2.3.8. mysql_debug()
void mysql_debug(const char *debug) Description Does a DBUG_PUSH with the given string. mysql_debug() uses the Fred Fish debug library. To use this function, you must compile the client library to support debugging. See Seccin D.1, Depurar un servidor MySQL. See Seccin D.2, Depuracin de un cliente MySQL. Return Values None. Errors None.
1000
Example The call shown here causes the client library to generate a trace file in /tmp/client.trace on the client machine:
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 Drops the database named by the db parameter. This function is deprecated. It is preferable to use mysql_query() to issue an SQL DROP DATABASE statement instead. Return Values Zero if the database was dropped successfully. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred. Example
if(mysql_drop_db(&mysql, "my_database")) fprintf(stderr, "Failed to drop the database: Error: %s\n", mysql_error(&mysql));
24.2.3.10. mysql_dump_debug_info()
int mysql_dump_debug_info(MYSQL *mysql) Description Instructs the server to write some debug information to the log. For this to work, the connected user must have the SUPER privilege. Return Values Zero if the command was successful. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC 1001
Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.11. mysql_eof()
my_bool mysql_eof(MYSQL_RES *result) Description This function is deprecated. mysql_errno() or mysql_error() may be used instead. mysql_eof() determines whether the last row of a result set has been read. If you acquire a result set from a successful call to mysql_store_result(), the client receives the entire set in one operation. In this case, a NULL return from mysql_fetch_row() always means the end of the result set has been reached and it is unnecessary to call mysql_eof(). When used with mysql_store_result(), mysql_eof() always returns true. On the other hand, if you use mysql_use_result() to initiate a result set retrieval, the rows of the set are obtained from the server one by one as you call mysql_fetch_row() repeatedly. Because an error may occur on the connection during this process, a NULL return value from mysql_fetch_row() does not necessarily mean the end of the result set was reached normally. In this case, you can use mysql_eof() to determine what happened. mysql_eof() returns a non-zero value if the end of the result set was reached and zero if an error occurred. Historically, mysql_eof() predates the standard MySQL error functions mysql_errno() and mysql_error(). Because those error functions provide the same information, their use is preferred over mysql_eof(), which is deprecated. (In fact, they provide more information, because mysql_eof() returns only a boolean value whereas the error functions indicate a reason for the error when one occurs.) Return Values Zero if no error occurred. Non-zero if the end of the result set has been reached. Errors None. Example The following example shows how you might use mysql_eof():
mysql_query(&mysql,"SELECT * FROM some_table"); result = mysql_use_result(&mysql); while((row = mysql_fetch_row(result))) { // do something with data } if(!mysql_eof(result)) // mysql_fetch_row() failed due to an error
1002
However, you can achieve the same effect with the standard MySQL error functions:
mysql_query(&mysql,"SELECT * FROM some_table"); result = mysql_use_result(&mysql); while((row = mysql_fetch_row(result))) { // do something with data } if(mysql_errno(&mysql)) // mysql_fetch_row() failed due to an error { fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); }
24.2.3.12. mysql_errno()
unsigned int mysql_errno(MYSQL *mysql) Description For the connection specified by mysql, mysql_errno() returns the error code for the most recently invoked API function that can succeed or fail. A return value of zero means that no error occurred. Client error message numbers are listed in the MySQL errmsg.h header file. Server error message numbers are listed in mysqld_error.h. In the MySQL source distribution you can find a complete list of error messages and error numbers in the file Docs/mysqld_error.txt. The server error codes also are listed at Captulo 26, Manejo de errores en MySQL. Note that some functions like mysql_fetch_row() don't set mysql_errno() if they succeed. A rule of thumb is that all functions that have to ask the server for information reset mysql_errno() if they succeed. Return Values An error code value for the last mysql_xxx() call, if it failed. zero means no error occurred. Errors None.
24.2.3.13. mysql_error()
const char *mysql_error(MYSQL *mysql) Description For the connection specified by mysql, mysql_error() returns a null-terminated string containing the error message for the most recently invoked API function that failed. If a function didn't fail, the return value of mysql_error() may be the previous error or an empty string to indicate no error. A rule of thumb is that all functions that have to ask the server for information reset mysql_error() if they succeed. For functions that reset mysql_errno(), the following two tests are equivalent:
if(mysql_errno(&mysql)) { // an error occurred } if(mysql_error(&mysql)[0] != '\0')
1003
{ // an error occurred }
The language of the client error messages may be changed by recompiling the MySQL client library. Currently you can choose error messages in several different languages. See Seccin 5.9.2, Escoger el idioma de los mensajes de error. Return Values A null-terminated character string that describes the error. An empty string if no error occurred. Errors None.
24.2.3.14. mysql_escape_string()
You should use mysql_real_escape_string() instead! This function is identical to mysql_real_escape_string() except that mysql_real_escape_string() takes a connection handler as its first argument and escapes the string according to the current character set. mysql_escape_string() does not take a connection argument and does not respect the current charset setting.
24.2.3.15. mysql_fetch_field()
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result) Description Returns the definition of one column of a result set as a MYSQL_FIELD structure. Call this function repeatedly to retrieve information about all columns in the result set. mysql_fetch_field() returns NULL when no more fields are left. mysql_fetch_field() is reset to return information about the first field each time you execute a new SELECT query. The field returned by mysql_fetch_field() is also affected by calls to mysql_field_seek(). If you've called mysql_query() to perform a SELECT on a table but have not called mysql_store_result(), MySQL returns the default blob length (8KB) if you call mysql_fetch_field() to ask for the length of a BLOB field. (The 8KB size is chosen because MySQL doesn't know the maximum length for the BLOB. This should be made configurable sometime.) Once you've retrieved the result set, field->max_length contains the length of the largest value for this column in the specific query. Return Values The MYSQL_FIELD structure for the current column. NULL if no columns are left. Errors None. Example
MYSQL_FIELD *field; while((field = mysql_fetch_field(result))) { printf("field name %s\n", field->name); }
1004
24.2.3.16. mysql_fetch_fields()
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) Description Returns an array of all MYSQL_FIELD structures for a result set. Each structure provides the field definition for one column of the result set. Return Values An array of MYSQL_FIELD structures for all columns of a result set. Errors None. Example
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("Field %u is %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 Given a field number fieldnr for a column within a result set, returns that column's field definition as a MYSQL_FIELD structure. You may use this function to retrieve the definition for an arbitrary column. The value of fieldnr should be in the range from 0 to mysql_num_fields(result)-1. Return Values The MYSQL_FIELD structure for the specified column. Errors None. Example
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("Field %u is %s\n", i, field->name); }
24.2.3.18. mysql_fetch_lengths()
unsigned long *mysql_fetch_lengths(MYSQL_RES *result)
1005
Description Returns the lengths of the columns of the current row within a result set. If you plan to copy field values, this length information is also useful for optimization, because you can avoid calling strlen(). In addition, if the result set contains binary data, you must use this function to determine the size of the data, because strlen() returns incorrect results for any field containing null characters. The length for empty columns and for columns containing NULL values is zero. To see how to distinguish these two cases, see the description for mysql_fetch_row(). Return Values An array of unsigned long integers representing the size of each column (not including any terminating null characters). NULL if an error occurred. Errors mysql_fetch_lengths() is valid only for the current row of the result set. It returns NULL if you call it before calling mysql_fetch_row() or after retrieving all rows in the result. Example
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("Column %u is %lu bytes in length.\n", i, lengths[i]); } }
24.2.3.19. mysql_fetch_row()
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) Description Retrieves the next row of a result set. When used after mysql_store_result(), mysql_fetch_row() returns NULL when there are no more rows to retrieve. When used after mysql_use_result(), mysql_fetch_row() returns NULL when there are no more rows to retrieve or if an error occurred. The number of values in the row is given by mysql_num_fields(result). If row holds the return value from a call to mysql_fetch_row(), pointers to the values are accessed as row[0] to row[mysql_num_fields(result)-1]. NULL values in the row are indicated by NULL pointers. The lengths of the field values in the row may be obtained by calling mysql_fetch_lengths(). Empty fields and fields containing NULL both have length 0; you can distinguish these by checking the pointer for the field value. If the pointer is NULL, the field is NULL; otherwise, the field is empty. Return Values A MYSQL_ROW structure for the next row. NULL if there are no more rows to retrieve or if an error occurred. Errors
1006
Note that error is not reset between calls to mysql_fetch_row() CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred. Example
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) If you are using a version of MySQL earlier than Version 3.22.24, you should use unsigned int mysql_num_fields(MYSQL *mysql) instead. Description Returns the number of columns for the most recent query on the connection. The normal use of this function is when mysql_store_result() returned NULL (and thus you have no result set pointer). In this case, you can call mysql_field_count() to determine whether mysql_store_result() should have produced a non-empty result. This allows the client program to take proper action without knowing whether the query was a SELECT (or SELECT-like) statement. The example shown here illustrates how this may be done. See Seccin 24.2.13.1, Por qu mysql_store_result() a veces devuelve NULL despus de que mysql_query() haya dado un resultado?. Return Values An unsigned integer representing the number of columns in a result set. Errors None. Example
MYSQL_RES *result; unsigned int num_fields; unsigned int num_rows; if (mysql_query(&mysql,query_string)) { // error
1007
} else // query succeeded, process any data returned by it { result = mysql_store_result(&mysql); if (result) // there are rows { num_fields = mysql_num_fields(result); // retrieve rows, then call mysql_free_result(result) } else // mysql_store_result() returned nothing; should it have? { if(mysql_field_count(&mysql) == 0) { // query does not return data // (it was not a SELECT) num_rows = mysql_affected_rows(&mysql); } else // mysql_store_result() should have returned data { fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); } } }
An alternative is to replace the mysql_field_count(&mysql) call with mysql_errno(&mysql). In this case, you are checking directly for an error from mysql_store_result() rather than inferring from the value of mysql_field_count() whether the statement was a SELECT.
24.2.3.21. mysql_field_seek()
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset) Description Sets the field cursor to the given offset. The next call to mysql_fetch_field() retrieves the field definition of the column associated with that offset. To seek to the beginning of a row, pass an offset value of zero. Return Values The previous value of the field cursor. Errors None.
24.2.3.22. mysql_field_tell()
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result) Description Returns the position of the field cursor used for the last mysql_fetch_field(). This value can be used as an argument to mysql_field_seek(). Return Values The current offset of the field cursor. Errors None.
1008
24.2.3.23. mysql_free_result()
void mysql_free_result(MYSQL_RES *result) Description Frees the memory allocated for a result set by mysql_store_result(), mysql_use_result(), mysql_list_dbs(), etc. When you are done with a result set, you must free the memory it uses by calling mysql_free_result(). Do not attempt to access a result set after freeing it. Return Values None. Errors None.
24.2.3.24. mysql_get_character_set_info()
void mysql_get_character_set_info(MYSQL *mysql, MY_CHARSET_INFO *cs) Description This function provides information about the default client character set. The default character set may be changed with the mysql_set_character_set() function. This function was added in MySQL 5.0.10. Example
if (!mysql_set_character_set_name(&mysql, "utf8")) { MY_CHARSET_INFO cs; mysql_get_character_set_info(&mysql, &cs); printf("character set information:\n"); printf("character set name: %s\n", cs->name); printf("collation name: %s\n", cs->csname); printf("comment: %s\n", cs->comment); printf("directory: %s\n", cs->dir); printf("multi byte character min. length: %s\n", cs->mbminlen); printf("multi byte character max. length: %s\n", cs->mbmaxlen); }
24.2.3.25. mysql_get_client_info()
char *mysql_get_client_info(void) Description Returns a string that represents the client library version. Return Values A character string that represents the MySQL client library version. Errors None.
24.2.3.26. mysql_get_client_version()
1009
unsigned long mysql_get_client_version(void) Description Returns an integer that represents the client library version. The value has the format XYYZZ where X is the major version, YY is the release level, and ZZ is the version number within the release level. For example, a value of 40102 represents a client library version of 4.1.2. This function was added in MySQL 4.0.16. Return Values An integer that represents the MySQL client library version. Errors None.
24.2.3.27. mysql_get_host_info()
char *mysql_get_host_info(MYSQL *mysql) Description Returns a string describing the type of connection in use, including the server hostname. Return Values A character string representing the server hostname and the connection type. Errors None.
24.2.3.28. mysql_get_proto_info()
unsigned int mysql_get_proto_info(MYSQL *mysql) Description Returns the protocol version used by current connection. Return Values An unsigned integer representing the protocol version used by the current connection. Errors None.
24.2.3.29. mysql_get_server_info()
char *mysql_get_server_info(MYSQL *mysql) Description Returns a string that represents the server version number. Return Values A character string that represents the server version number.
1010
Errors None.
24.2.3.30. mysql_get_server_version()
unsigned long mysql_get_server_version(MYSQL *mysql) Description Returns the version number of the server as an integer. This function was added in MySQL 4.1.0. Return Values A number that represents the MySQL server version in this format:
major_version*10000 + minor_version *100 + sub_version
For example, 4.1.2 is returned as 40102. This function is useful in client programs for quickly determining whether some version-specific server capability exists. Errors None.
24.2.3.31. mysql_hex_string()
unsigned long mysql_hex_string(char *to, const char *from, unsigned long length) Description This function is used to create a legal SQL string that you can use in a SQL statement. See Seccin 9.1.1, Cadenas de caracteres. The string in from is encoded to hexadecimal format, with each character encoded as two hexadecimal digits. The result is placed in to and a terminating null byte is appended. The string pointed to by from must be length bytes long. You must allocate the to buffer to be at least length*2+1 bytes long. When mysql_hex_string() returns, the contents of to is a nullterminated string. The return value is the length of the encoded string, not including the terminating null character. The return value can be placed into an SQL statement using either 0xvalue or X'value' format. However, the return value does not include the 0x or X'...'. The caller must supply whichever of those is desired. mysql_hex_string() was added in MySQL 4.0.23 and 4.1.8. Example
char query[1000],*end; end end end end end = strmov(query,"INSERT INTO test_table values("); = strmov(end,"0x"); += mysql_hex_string(end,"What's this",11); = strmov(end,",0x"); += mysql_hex_string(end,"binary data: \0\r\n",16);
1011
*end++ = ')'; if (mysql_real_query(&mysql,query,(unsigned int) (end - query))) { fprintf(stderr, "Failed to insert row, Error: %s\n", mysql_error(&mysql)); }
The strmov() function used in the example is included in the mysqlclient library and works like strcpy() but returns a pointer to the terminating null of the first parameter. Return Values The length of the value placed into to, not including the terminating null character. Errors None.
24.2.3.32. mysql_info()
char *mysql_info(MYSQL *mysql) Description Retrieves a string providing information about the most recently executed query, but only for the statements listed here. For other statements, mysql_info() returns NULL. The format of the string varies depending on the type of query, as described here. The numbers are illustrative only; the string contains values appropriate for the query. INSERT INTO ... SELECT ... String format: Records: 100 Duplicates: 0 Warnings: 0 INSERT INTO ... VALUES (...),(...),(...)... String format: Records: 3 Duplicates: 0 Warnings: 0 LOAD DATA INFILE ... String format: Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 ALTER TABLE String format: Records: 3 Duplicates: 0 Warnings: 0 UPDATE String format: Rows matched: 40 Changed: 40 Warnings: 0 Note that mysql_info() returns a non-NULL value for INSERT ... VALUES only for the multiplerow form of the statement (that is, only if multiple value lists are specified). Return Values A character string representing additional information about the most recently executed query. NULL if no information is available for the query. Errors None.
24.2.3.33. mysql_init()
1012
MYSQL *mysql_init(MYSQL *mysql) Description Allocates or initializes a MYSQL object suitable for mysql_real_connect(). If mysql is a NULL pointer, the function allocates, initializes, and returns a new object. Otherwise, the object is initialized and the address of the object is returned. If mysql_init() allocates a new object, it is freed when mysql_close() is called to close the connection. Return Values An initialized MYSQL* handle. NULL if there was insufficient memory to allocate a new object. Errors In case of insufficient memory, NULL is returned.
24.2.3.34. mysql_insert_id()
my_ulonglong mysql_insert_id(MYSQL *mysql) Description Returns the value generated for an AUTO_INCREMENT column by the previous INSERT or UPDATE statement. Use this function after you have performed an INSERT statement into a table that contains an AUTO_INCREMENT field. More precisely, mysql_insert_id() is updated under these conditions: INSERT statements that store a value into an AUTO_INCREMENT column. This is true whether the value is automatically generated by storing the special values NULL or 0 into the column, or is an explicit non-special value. In the case of a multiple-row INSERT statement, mysql_insert_id() returns the first automatically generated AUTO_INCREMENT value; if no such value is generated, it returns the last last explicit value inserted into the AUTO_INCREMENT column. INSERT statements that generate an AUTO_INCREMENT value by inserting LAST_INSERT_ID(expr) into any column. INSERT statements that generate an AUTO_INCREMENT value by updating any column to LAST_INSERT_ID(expr). The value of mysql_insert_id() is not affected by statements such as SELECT that return a result set. If the previous statement returned an error, the value of mysql_insert_id() is undefined. Note that mysql_insert_id() returns 0 if the previous statement does not use an AUTO_INCREMENT value. If you need to save the value for later, be sure to call mysql_insert_id() immediately after the statement that generates the value. The value of mysql_insert_id() is affected only by statements issued within the current client connection. It is not affected by statements issued by other clients. See Seccin 12.9.3, Funciones de informacin. Also note that the value of the SQL LAST_INSERT_ID() function always contains the most recently generated AUTO_INCREMENT value, and is not reset between statements because the value of that function is maintained in the server. Another difference is that LAST_INSERT_ID() is not updated if you set an AUTO_INCREMENT column to a specific non-special value.
1013
The reason for the difference between LAST_INSERT_ID() and mysql_insert_id() is that LAST_INSERT_ID() is made easy to use in scripts while mysql_insert_id() tries to provide a little more exact information of what happens to the AUTO_INCREMENT column. Return Values Described in the preceding discussion. Errors None.
24.2.3.35. mysql_kill()
int mysql_kill(MYSQL *mysql, unsigned long pid) Description Asks the server to kill the thread specified by pid. Return Values Zero for success. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.36. mysql_library_init()
int mysql_library_init(int argc, char **argv, char **groups) Description This is a synonym for the mysql_server_init() function. It was added in MySQL 4.1.10 and 5.0.3. See Seccin 24.2.2, Panormica de funciones de la API C for usage information.
24.2.3.37. mysql_library_end()
void mysql_library_end(void) Description This is a synonym for the mysql_server_end() function. It was added in MySQL 4.1.10 and 5.0.3. See Seccin 24.2.2, Panormica de funciones de la API C for usage information. 1014
24.2.3.38. mysql_list_dbs()
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild) Description Returns a result set consisting of database names on the server that match the simple regular expression specified by the wild parameter. wild may contain the wildcard characters '%' or '_', or may be a NULL pointer to match all databases. Calling mysql_list_dbs() is similar to executing the query SHOW databases [LIKE wild]. You must free the result set with mysql_free_result(). Return Values A MYSQL_RES result set for success. NULL if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_OUT_OF_MEMORY Out of memory. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.39. mysql_list_fields()
MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild) Description Returns a result set consisting of field names in the given table that match the simple regular expression specified by the wild parameter. wild may contain the wildcard characters '%' or '_', or may be a NULL pointer to match all fields. Calling mysql_list_fields() is similar to executing the query SHOW COLUMNS FROM tbl_name [LIKE wild]. Note that it's recommended that you use SHOW COLUMNS FROM tbl_name instead of mysql_list_fields(). You must free the result set with mysql_free_result(). Return Values A MYSQL_RES result set for success. NULL if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC
1015
Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.40. mysql_list_processes()
MYSQL_RES *mysql_list_processes(MYSQL *mysql) Description Returns a result set describing the current server threads. This is the same kind of information as that reported by mysqladmin processlist or a SHOW PROCESSLIST query. You must free the result set with mysql_free_result(). Return Values A MYSQL_RES result set for success. NULL if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.41. mysql_list_tables()
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild) Description Returns a result set consisting of table names in the current database that match the simple regular expression specified by the wild parameter. wild may contain the wildcard characters '%' or '_', or may be a NULL pointer to match all tables. Calling mysql_list_tables() is similar to executing the query SHOW tables [LIKE wild]. You must free the result set with mysql_free_result(). Return Values
1016
A MYSQL_RES result set for success. NULL if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.42. mysql_num_fields()
unsigned int mysql_num_fields(MYSQL_RES *result) Or: unsigned int mysql_num_fields(MYSQL *mysql) The second form doesn't work on MySQL 3.22.24 or newer. To pass a MYSQL* argument, you must use unsigned int mysql_field_count(MYSQL *mysql) instead. Description Returns the number of columns in a result set. Note that you can get the number of columns either from a pointer to a result set or to a connection handle. You would use the connection handle if mysql_store_result() or mysql_use_result() returned NULL (and thus you have no result set pointer). In this case, you can call mysql_field_count() to determine whether mysql_store_result() should have produced a non-empty result. This allows the client program to take proper action without knowing whether or not the query was a SELECT (or SELECT-like) statement. The example shown here illustrates how this may be done. See Seccin 24.2.13.1, Por qu mysql_store_result() a veces devuelve NULL despus de que mysql_query() haya dado un resultado?. Return Values An unsigned integer representing the number of columns in a result set. Errors None. Example
MYSQL_RES *result; unsigned int num_fields; unsigned int num_rows; if (mysql_query(&mysql,query_string)) { // error
1017
} else // query succeeded, process any data returned by it { result = mysql_store_result(&mysql); if (result) // there are rows { num_fields = mysql_num_fields(result); // retrieve rows, then call mysql_free_result(result) } else // mysql_store_result() returned nothing; should it have? { if (mysql_errno(&mysql)) { fprintf(stderr, "Error: %s\n", mysql_error(&mysql)); } else if (mysql_field_count(&mysql) == 0) { // query does not return data // (it was not a SELECT) num_rows = mysql_affected_rows(&mysql); } } }
An alternative (if you know that your query should have returned a result set) is to replace the mysql_errno(&mysql) call with a check whether mysql_field_count(&mysql) is = 0. This happens only if something went wrong.
24.2.3.43. mysql_num_rows()
my_ulonglong mysql_num_rows(MYSQL_RES *result) Description Returns the number of rows in the result set. The use of mysql_num_rows() depends on whether you use mysql_store_result() or mysql_use_result() to return the result set. If you use mysql_store_result(), mysql_num_rows() may be called immediately. If you use mysql_use_result(), mysql_num_rows() does not return the correct value until all the rows in the result set have been retrieved. Return Values The number of rows in the result set. Errors None.
24.2.3.44. mysql_options()
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg) Description Can be used to set extra connect options and affect behavior for a connection. This function may be called multiple times to set several options. mysql_options() should be called after mysql_init() and before mysql_connect() or mysql_real_connect(). The option argument is the option that you want to set; the arg argument is the value for the option. If the option is an integer, then arg should point to the value of the integer.
1018
Possible option values: Option MYSQL_INIT_COMMAND Argument Type char * Function Command to execute when connecting to the MySQL server. Will automatically be re-executed when reconnecting. Use the compressed client/server protocol. For an application linked against libmysqld, this allows the library to guess whether to use the embedded server or a remote server. Guess means that if the hostname is set and is not localhost, it uses a remote server. This behavior is the default. MYSQL_OPT_USE_EMBEDDED_CONNECTION and MYSQL_OPT_USE_REMOTE_CONNECTION can be used to override it. This option is ignored for applications linked against libmysqlclient. If no pointer is given or if pointer points to an unsigned int != 0 the command LOAD LOCAL INFILE is enabled. Use named pipes to connect to a MySQL server on NT.
Not used
MYSQL_OPT_LOCAL_INFILE
MYSQL_OPT_NAMED_PIPE MYSQL_OPT_PROTOCOL
Not used
unsigned int * Type of protocol to use. Should be one of the enum values of mysql_protocol_type defined in mysql.h. New in 4.1.0. unsigned int * Timeout for reads from server (works currently only on Windows on TCP/IP connections). New in 4.1.1. char * For an application linked against linked against libmysqld (with libmysqld compiled with authentication support), this means that the user is considered to have connected from the specified IP address (specified as a string) for authentication purposes. This option is ignored for applications linked against libmysqlclient. For an application linked against libmysqld, this forces the use of the embedded server for the connection. This option is ignored for applications linked against libmysqlclient. For an application linked against libmysqld, this forces the use of a remote server for the connection.
MYSQL_OPT_READ_TIMEOUT
MYSQL_OPT_SET_CLIENT_IP
1019
This option is ignored for applications linked against libmysqlclient. MYSQL_OPT_USE_RESULT MYSQL_OPT_WRITE_TIMEOUT Not used This option is new in 4.1.1, but is unused.
unsigned int * Timeout for writes to server (works currently only on Windows on TCP/IP connections). New in 4.1.1. char * char * Read options from the named option file instead of from my.cnf. Read options from the named group from my.cnf or the file specified with MYSQL_READ_DEFAULT_FILE. Enable or disable reporting of data truncation errors for prepared statements via MYSQL_BIND.error. (Default: disabled) New in 5.0.3. Whether to connect to a server that does not support the new 4.1.1 password hashing. New in 4.1.1. The pathname to the directory that contains character set definition files. The name of the character set to use as the default character set. Named of shared memory object for communication to server. Should be same as the option -sharedmemory-base-name used for the mysqld server you want's to connect to. New in 4.1.0.
MYSQL_READ_DEFAULT_FILE MYSQL_READ_DEFAULT_GROUP
MYSQL_REPORT_DATA_TRUNCATION
my_bool *
MYSQL_SECURE_AUTH
my_bool*
Note that the client group is always read if you use MYSQL_READ_DEFAULT_FILE or MYSQL_READ_DEFAULT_GROUP. The specified group in the option file may contain the following options: Option connect-timeout compress database debug disable-local-infile host init-command interactive-timeout Description Connect timeout in seconds. On Linux this timeout is also used for waiting for the first answer from the server. Use the compressed client/server protocol. Connect to this database if no database was specified in the connect command. Debug options. Disable use of LOAD DATA LOCAL. Default hostname. Command to execute when connecting to MySQL server. Will automatically be re-executed when reconnecting. Same as specifying CLIENT_INTERACTIVE to mysql_real_connect(). See Seccin 24.2.3.47, mysql_real_connect(). If no argument or argument != 0 then enable use of LOAD DATA LOCAL.
local-infile[=(0|1)]
1020
max_allowed_packet multi-results multi-statements password pipe protocol={TCP | SOCKET | PIPE | MEMORY} port return-found-rows shared-memory-basename=name socket user
Max size of packet client can read from server. Allow multiple result sets from multiple-statement executions or stored procedures. New in 4.1.1. Allow the client to send multiple statements in a single string (separated by ';'). New in 4.1.9. Default password. Use named pipes to connect to a MySQL server on NT. The protocol to use when connecting to server (New in 4.1)
Default port number. Tell mysql_info() to return found rows instead of updated rows when using UPDATE. Shared memory name to use to connect to server (default is "MYSQL"). New in MySQL 4.1. Default socket file. Default user.
Note that timeout has been replaced by connect-timeout, but timeout still works for a while. For more information about option files, see Seccin 4.3.2, Usar ficheros de opciones. Return Values Zero for success. Non-zero if you used an unknown option. Example
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, "Failed to connect to database: Error: %s\n", mysql_error(&mysql)); }
This code requests the client to use the compressed client/server protocol and read the additional options from the odbc section in the my.cnf file.
24.2.3.45. mysql_ping()
int mysql_ping(MYSQL *mysql) Description Checks whether the connection to the server is working. If the connection has gone down, an automatic reconnection is attempted. This function can be used by clients that remain idle for a long while, to check whether the server has closed the connection and reconnect if necessary. Return Values Zero if the connection to the server is alive. Non-zero if an error occurred. A non-zero return does not indicate whether the MySQL server itself is down; the connection might be broken for other reasons such as network problems.
1021
Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.46. mysql_query()
int mysql_query(MYSQL *mysql, const char *query) Description Executes the SQL query pointed to by the null-terminated string query. Normally, the string must consist of a single SQL statement and you should not add a terminating semicolon (';') or \g to the statement. If multiple-statement execution has been enabled, the string can contain several statements separated by semicolons. See Seccin 24.2.9, Tratamiento por parte de la API C de la ejecucin de mltiples consultas. mysql_query() cannot be used for queries that contain binary data; you should use mysql_real_query() instead. (Binary data may contain the '\0' character, which mysql_query() interprets as the end of the query string.) If you want to know whether the query should return a result set, you can use mysql_field_count() to check for this. See Seccin 24.2.3.20, mysql_field_count(). Return Values Zero if the query was successful. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.47. 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
1022
mysql_real_connect() attempts to establish a connection to a MySQL database engine running on host. mysql_real_connect() must complete successfully before you can execute any other API functions that require a valid MYSQL connection handle structure. The parameters are specified as follows: The first parameter should be the address of an existing MYSQL structure. Before calling mysql_real_connect() you must call mysql_init() to initialize the MYSQL structure. You can change a lot of connect options with the mysql_options() call. See Seccin 24.2.3.44, mysql_options(). The value of host may be either a hostname or an IP address. If host is NULL or the string "localhost", a connection to the local host is assumed. If the OS supports sockets (Unix) or named pipes (Windows), they are used instead of TCP/IP to connect to the server. The user parameter contains the user's MySQL login ID. If user is NULL or the empty string "", the current user is assumed. Under Unix, this is the current login name. Under Windows ODBC, the current username must be specified explicitly. See Seccin 25.1.3.2, Configuring a Connector/ ODBC DSN on Windows. The passwd parameter contains the password for user. If passwd is NULL, only entries in the user table for the user that have a blank (empty) password field are checked for a match. This allows the database administrator to set up the MySQL privilege system in such a way that users get different privileges depending on whether or not they have specified a password. Note: Do not attempt to encrypt the password before calling mysql_real_connect(); password encryption is handled automatically by the client API. db is the database name. If db is not NULL, the connection sets the default database to this value. If port is not 0, the value is used as the port number for the TCP/IP connection. Note that the host parameter determines the type of the connection. If unix_socket is not NULL, the string specifies the socket or named pipe that should be used. Note that the host parameter determines the type of the connection. The value of client_flag is usually 0, but can be set to a combination of the following flags in very special circumstances: Flag Name CLIENT_COMPRESS CLIENT_FOUND_ROWS CLIENT_IGNORE_SPACE CLIENT_INTERACTIVE Flag Description Use compression protocol. Return the number of found (matched) rows, not the number of affected rows. Allow spaces after function names. Makes all functions names reserved words. Allow interactive_timeout seconds (instead of wait_timeout seconds) of inactivity before closing the connection. The client's session wait_timeout variable is set to the value of the session interactive_timeout variable. Enable LOAD DATA LOCAL handling.
CLIENT_LOCAL_FILES
CLIENT_MULTI_STATEMENTS Tell the server that the client may send multiple statements in a single string (separated by ';'). If this flag is not set, multiplestatement execution is disabled. New in 4.1. CLIENT_MULTI_RESULTS Tell the server that the client can handle multiple result sets from multiple-statement executions or stored procedures. This is automatically set if CLIENT_MULTI_STATEMENTS is set. New in 4.1.
1023
CLIENT_NO_SCHEMA
Don't allow the db_name.tbl_name.col_name syntax. This is for ODBC. It causes the parser to generate an error if you use that syntax, which is useful for trapping bugs in some ODBC programs. The client is an ODBC client. This changes mysqld to be more ODBC-friendly. Use SSL (encrypted protocol). This option should not be set by application programs; it is set internally in the client library.
CLIENT_ODBC CLIENT_SSL
Return Values A MYSQL* connection handle if the connection was successful, NULL if the connection was unsuccessful. For a successful connection, the return value is the same as the value of the first parameter. Errors CR_CONN_HOST_ERROR Failed to connect to the MySQL server. CR_CONNECTION_ERROR Failed to connect to the local MySQL server. CR_IPSOCK_ERROR Failed to create an IP socket. CR_OUT_OF_MEMORY Out of memory. CR_SOCKET_CREATE_ERROR Failed to create a Unix socket. CR_UNKNOWN_HOST Failed to find the IP address for the hostname. CR_VERSION_ERROR A protocol mismatch resulted from attempting to connect to a server with a client library that uses a different protocol version. This can happen if you use a very old client library to connect to a new server that wasn't started with the --old-protocol option. CR_NAMEDPIPEOPEN_ERROR Failed to create a named pipe on Windows. CR_NAMEDPIPEWAIT_ERROR Failed to wait for a named pipe on Windows. CR_NAMEDPIPESETSTATE_ERROR Failed to get a pipe handler on Windows. CR_SERVER_LOST If connect_timeout > 0 and it took longer than connect_timeout seconds to connect to the server or if the server died while executing the init-command.
1024
Example
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)) { fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(&mysql)); }
By using mysql_options() the MySQL library reads the [client] and [your_prog_name] sections in the my.cnf file which ensures that your program works, even if someone has set up MySQL in some non-standard way. Note that upon connection, mysql_real_connect() sets the reconnect flag (part of the MYSQL structure) to a value of 1 in versions of the API strictly older than 5.0.3, of 0 in newer versions. A value of 1 for this flag indicates, in the event that a query cannot be performed because of a lost connection, to try reconnecting to the server before giving up.
24.2.3.48. mysql_real_escape_string()
unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length) Note that mysql must be a valid, open connection. This is needed because the escaping depends on the character set in use by the server. Description This function is used to create a legal SQL string that you can use in a SQL statement. See Seccin 9.1.1, Cadenas de caracteres. The string in from is encoded to an escaped SQL string, taking into account the current character set of the connection. The result is placed in to and a terminating null byte is appended. Characters encoded are NUL (ASCII 0), '\n', '\r', '\', ''', '"', and Control-Z (see Seccin 9.1, Valores literales). (Strictly speaking, MySQL requires only that backslash and the quote character used to quote the string in the query be escaped. This function quotes the other characters to make them easier to read in log files.) The string pointed to by from must be length bytes long. You must allocate the to buffer to be at least length*2+1 bytes long. (In the worst case, each character may need to be encoded as using two bytes, and you need room for the terminating null byte.) When mysql_real_escape_string() returns, the contents of to is a null-terminated string. The return value is the length of the encoded string, not including the terminating null character. If you need to change the character set of the connection, you should use the mysql_set_character_set() function rather than executing a SET NAMES (or SET CHARACTER SET) statement. mysql_set_character_set() works like SET NAMES but also affects the character set used by mysql_real_escape_string(), which SET NAMES does not. Example
char query[1000],*end; end = strmov(query,"INSERT INTO test_table values("); *end++ = '\''; end += mysql_real_escape_string(&mysql, end,"What's this",11); *end++ = '\''; *end++ = ','; *end++ = '\''; end += mysql_real_escape_string(&mysql, end,"binary data: \0\r\n",16);
1025
*end++ = '\''; *end++ = ')'; if (mysql_real_query(&mysql,query,(unsigned int) (end - query))) { fprintf(stderr, "Failed to insert row, Error: %s\n", mysql_error(&mysql)); }
The strmov() function used in the example is included in the mysqlclient library and works like strcpy() but returns a pointer to the terminating null of the first parameter. Return Values The length of the value placed into to, not including the terminating null character. Errors None.
24.2.3.49. mysql_real_query()
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length) Description Executes the SQL query pointed to by query, which should be a string length bytes long. Normally, the string must consist of a single SQL statement and you should not add a terminating semicolon (';') or \g to the statement. If multiple-statement execution has been enabled, the string can contain several statements separated by semicolons. See Seccin 24.2.9, Tratamiento por parte de la API C de la ejecucin de mltiples consultas. You must use mysql_real_query() rather than mysql_query() for queries that contain binary data, because binary data may contain the '\0' character. In addition, mysql_real_query() is faster than mysql_query() because it does not call strlen() on the query string. If you want to know whether the query should return a result set, you can use mysql_field_count() to check for this. See Seccin 24.2.3.20, mysql_field_count(). Return Values Zero if the query was successful. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.50. mysql_reload()
1026
int mysql_reload(MYSQL *mysql) Description Asks the MySQL server to reload the grant tables. The connected user must have the RELOAD privilege. This function is deprecated. It is preferable to use mysql_query() to issue an SQL FLUSH PRIVILEGES statement instead. Return Values Zero for success. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.51. mysql_row_seek()
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset) Description Sets the row cursor to an arbitrary row in a query result set. The offset value is a row offset that should be a value returned from mysql_row_tell() or from mysql_row_seek(). This value is not a row number; if you want to seek to a row within a result set by number, use mysql_data_seek() instead. This function requires that the result set structure contains the entire result of the query, so mysql_row_seek() may be used only in conjunction with mysql_store_result(), not with mysql_use_result(). Return Values The previous value of the row cursor. This value may be passed to a subsequent call to mysql_row_seek(). Errors None.
24.2.3.52. mysql_row_tell()
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result) Description 1027
Returns the current position of the row cursor for the last mysql_fetch_row(). This value can be used as an argument to mysql_row_seek(). You should use mysql_row_tell() only after mysql_store_result(), not after mysql_use_result(). Return Values The current offset of the row cursor. Errors None.
24.2.3.53. mysql_select_db()
int mysql_select_db(MYSQL *mysql, const char *db) Description Causes the database specified by db to become the default (current) database on the connection specified by mysql. In subsequent queries, this database is the default for table references that do not include an explicit database specifier. mysql_select_db() fails unless the connected user can be authenticated as having permission to use the database. Return Values Zero for success. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.54. mysql_set_character_set()
int mysql_set_character_set(MYSQL *mysql, char *csname) Description This function is used to set the default character set for the current connection. The string csname specifies a valid character set name. The connection collation becomes the default collation of the character set. This function works like the SET NAMES statement, but also sets the value of mysql>charset, and thus affects the character set used by mysql_real_escape_string() This function was added in MySQL 5.0.7. 1028
24.2.3.55. mysql_set_server_option()
int mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option) Description Enables or disables an option for the connection. option can have one of the following values: MYSQL_OPTION_MULTI_STATEMENTS_ON Enable multi statement support. MYSQL_OPTION_MULTI_STATEMENTS_OFF Disable multi statement support. This function was added in MySQL 4.1.1. Return Values Zero for success. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. ER_UNKNOWN_COM_ERROR The server didn't support mysql_set_server_option() (which is the case that the server is older than 4.1.1) or the server didn't support the option one tried to set.
24.2.3.56. mysql_shutdown()
int mysql_shutdown(MYSQL *mysql, enum enum_shutdown_level shutdown_level) Description Asks the database server to shut down. The connected user must have SHUTDOWN privileges. The shutdown_level argument was added in MySQL 4.1.3 (and 5.0.1). The MySQL server currently
1029
supports only one type (level of gracefulness) of shutdown; shutdown_level must be equal to SHUTDOWN_DEFAULT. Later we wil add more levels and then the shutdown_level argument will enable us to choose the desired level. MySQL servers and MySQL clients before and after 4.1.3 are compatible; MySQL servers newer than 4.1.3 accept the mysql_shutdown(MYSQL *mysql) call, and MySQL servers older than 4.1.3 accept the new mysql_shutdown() call. But dynamically linked executables which have been compiled with older versions of libmysqlclient headers, and call mysql_shutdown(), need to be used with the old libmysqlclient dynamic library. The shutdown process is described in Seccin 5.4, El proceso de cierre del servidor MySQL. Return Values Zero for success. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.57. mysql_sqlstate()
const char *mysql_sqlstate(MYSQL *mysql) Description Returns a null-terminated string containing the SQLSTATE error code for the last error. The error code consists of five characters. '00000' means no error. The values are specified by ANSI SQL and ODBC. For a list of possible values, see Captulo 26, Manejo de errores en MySQL. Note that not all MySQL errors are yet mapped to SQLSTATE's. The value 'HY000' (general error) is used for unmapped errors. This function was added to MySQL 4.1.1. Return Values A null-terminated character string containing the SQLSTATE error code. See Also See Seccin 24.2.3.12, mysql_errno(). See Seccin 24.2.3.13, mysql_error(). See Seccin 24.2.7.26, mysql_stmt_sqlstate().
24.2.3.58. mysql_ssl_set()
int mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher) 1030
Description mysql_ssl_set() is used for establishing secure connections using SSL. It must be called before mysql_real_connect(). mysql_ssl_set() does nothing unless OpenSSL support is enabled in the client library. mysql is the connection handler returned from mysql_init(). The other parameters are specified as follows: key is the pathname to the key file. cert is the pathname to the certificate file. ca is the pathname to the certificate authority file. capath is the pathname to a directory that contains trusted SSL CA certificates in pem format. cipher is a list of allowable ciphers to use for SSL encryption. Any unused SSL parameters may be given as NULL. Return Values This function always returns 0. If SSL setup is incorrect, mysql_real_connect() returns an error when you attempt to connect.
24.2.3.59. mysql_stat()
char *mysql_stat(MYSQL *mysql) Description Returns a character string containing information similar to that provided by the mysqladmin status command. This includes uptime in seconds and the number of running threads, questions, reloads, and open tables. Return Values A character string describing the server status. NULL if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.60. mysql_store_result()
MYSQL_RES *mysql_store_result(MYSQL *mysql)
1031
Description You must call mysql_store_result() or mysql_use_result() for every query that successfully retrieves data (SELECT, SHOW, DESCRIBE, EXPLAIN, CHECK TABLE, and so forth). You don't have to call mysql_store_result() or mysql_use_result() for other queries, but it does not do any harm or cause any notable performance degredation if you call mysql_store_result() in all cases. You can detect if the query didn't have a result set by checking if mysql_store_result() returns 0 (more about this later on). If you want to know whether the query should return a result set, you can use mysql_field_count() to check for this. See Seccin 24.2.3.20, mysql_field_count(). mysql_store_result() reads the entire result of a query to the client, allocates a MYSQL_RES structure, and places the result into this structure. mysql_store_result() returns a null pointer if the query didn't return a result set (if the query was, for example, an INSERT statement). mysql_store_result() also returns a null pointer if reading of the result set failed. You can check whether an error occurred by checking if mysql_error() returns a non-empty string, if mysql_errno() returns non-zero, or if mysql_field_count() returns zero. An empty result set is returned if there are no rows returned. (An empty result set differs from a null pointer as a return value.) Once you have called mysql_store_result() and got a result back that isn't a null pointer, you may call mysql_num_rows() to find out how many rows are in the result set. You can call mysql_fetch_row() to fetch rows from the result set, or mysql_row_seek() and mysql_row_tell() to obtain or set the current row position within the result set. You must call mysql_free_result() once you are done with the result set. See Seccin 24.2.13.1, Por qu mysql_store_result() a veces devuelve NULL despus de que mysql_query() haya dado un resultado?. Return Values A MYSQL_RES result structure with the results. NULL if an error occurred. Errors mysql_store_result() resets mysql_error() and mysql_errno() if it succeeds. CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_OUT_OF_MEMORY Out of memory. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR
1032
24.2.3.61. mysql_thread_id()
unsigned long mysql_thread_id(MYSQL *mysql) Description Returns the thread ID of the current connection. This value can be used as an argument to mysql_kill() to kill the thread. If the connection is lost and you reconnect with mysql_ping(), the thread ID changes. This means you should not get the thread ID and store it for later. You should get it when you need it. Return Values The thread ID of the current connection. Errors None.
24.2.3.62. mysql_use_result()
MYSQL_RES *mysql_use_result(MYSQL *mysql) Description You must call mysql_store_result() or mysql_use_result() for every query that successfully retrieves data (SELECT, SHOW, DESCRIBE, EXPLAIN). mysql_use_result() initiates a result set retrieval but does not actually read the result set into the client like mysql_store_result() does. Instead, each row must be retrieved individually by making calls to mysql_fetch_row(). This reads the result of a query directly from the server without storing it in a temporary table or local buffer, which is somewhat faster and uses much less memory than mysql_store_result(). The client allocates memory only for the current row and a communication buffer that may grow up to max_allowed_packet bytes. On the other hand, you shouldn't use mysql_use_result() if you are doing a lot of processing for each row on the client side, or if the output is sent to a screen on which the user may type a ^S (stop scroll). This ties up the server and prevent other threads from updating any tables from which the data is being fetched. When using mysql_use_result(), you must execute mysql_fetch_row() until a NULL value is returned, otherwise, the unfetched rows are returned as part of the result set for your next query. The C API gives the error Commands out of sync; you can't run this command now if you forget to do this! You may not use mysql_data_seek(), mysql_row_seek(), mysql_row_tell(), mysql_num_rows(), or mysql_affected_rows() with a result returned from mysql_use_result(), nor may you issue other queries until the mysql_use_result() has finished. (However, after you have fetched all the rows, mysql_num_rows() accurately returns the number of rows fetched.) You must call mysql_free_result() once you are done with the result set. Return Values A MYSQL_RES result structure. NULL if an error occurred.
1033
Errors mysql_use_result() resets mysql_error() and mysql_errno() if it succeeds. CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_OUT_OF_MEMORY Out of memory. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
24.2.3.63. mysql_warning_count()
unsigned int mysql_warning_count(MYSQL *mysql) Description Returns the number of warnings generated during execution of the previous SQL statement. This function was added in MySQL 4.1.0. Return Values The warning count. Errors None.
24.2.3.64. mysql_commit()
my_bool mysql_commit(MYSQL *mysql) Description Commits the current transaction. This function was added in MySQL 4.1.0. Return Values Zero if successful. Non-zero if an error occurred. Errors None.
24.2.3.65. mysql_rollback()
1034
my_bool mysql_rollback(MYSQL *mysql) Description Rolls back the current transaction. This function was added in MySQL 4.1.0. Return Values Zero if successful. Non-zero if an error occurred. Errors None.
24.2.3.66. mysql_autocommit()
my_bool mysql_autocommit(MYSQL *mysql, my_bool mode) Description Sets autocommit mode on if mode is 1, off if mode is 0. This function was added in MySQL 4.1.0. Return Values Zero if successful. Non-zero if an error occurred. Errors None.
24.2.3.67. mysql_more_results()
my_bool mysql_more_results(MYSQL *mysql) Description Returns true if more results exist from the currently executed query, and the application must call mysql_next_result() to fetch the results. This function was added in MySQL 4.1.0. Return Values TRUE (1) if more results exist. FALSE (0) if no more results exist. In most cases, you can call mysql_next_result() instead to test whether more results exist and initiate retrieval if so. See Seccin 24.2.9, Tratamiento por parte de la API C de la ejecucin de mltiples consultas. See Seccin 24.2.3.68, mysql_next_result(). Errors None.
24.2.3.68. mysql_next_result()
1035
int mysql_next_result(MYSQL *mysql) Description If more query results exist, mysql_next_result() reads the next query results and returns the status back to application. You must call mysql_free_result() for the preceding query if it returned a result set. After calling mysql_next_result() the state of the connection is as if you had called mysql_real_query() or mysql_query() for the next query. This means that you can call mysql_store_result(), mysql_warning_count(), mysql_affected_rows(), and so forth. If mysql_next_result() returns an error, no other statements are executed and there are no more results to fetch. See Seccin 24.2.9, Tratamiento por parte de la API C de la ejecucin de mltiples consultas. This function was added in MySQL 4.1.0. Return Values Return Value 0 -1 >0 Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. For example if you didn't call mysql_use_result() for a previous result set. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred. Description Successful and there are more results Successful and there are no more results An error occurred
Another advantage of prepared statements is that it uses a binary protocol that makes data transfer between client and server more efficient. The following statements can be used as prepared statements: CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, and most SHOW statements. Other statements are not yet supported.
length of *buffer when used with mysql_stmt_bind_param(), or the maximum number of data bytes that can be fetched into the buffer when used with mysql_stmt_bind_result(). unsigned long *length A pointer to an unsigned long variable that indicates the actual number of bytes of data stored in *buffer. length is used for character or binary C data. For input parameter data binding, length points to an unsigned long variable that indicates the length of the parameter value stored in *buffer; this is used by mysql_stmt_execute(). For output value binding, mysql_stmt_fetch() places the length of the column value that is returned into the variable that length points to. length is ignored for numeric and temporal data types because the length of the data value is determined by the buffer_type value. my_bool *is_null This member points to a my_bool variable that is true if a value is NULL, false if it is not NULL. For input, set *is_null to true to indicate that you are passing a NULL value as a statement parameter. For output, this value is set to true after you fetch a row if the result set column value returned from the statement is NULL. my_bool is_unsigned This member is used for integer types. (These correspond to the MYSQL_TYPE_TINY, MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG, and MYSQL_TYPE_LONGLONG type codes.) is_unsigned should be set to true for unsigned types and false for signed types. my_bool error For output, this member is used output to report data truncation errors. Truncation reporting must be enabled by calling mysql_options() with the MYSQL_REPORT_DATA_TRUNCATION option. When enabled, mysql_stmt_fetch() returns MYSQL_DATA_TRUNCATED and error is true in the MYSQL_BIND structures for parameters in which truncation occurred. Truncation indicates loss of sign or significant digits, or that a string was too long to fit in a column. The error member was added in MySQL 5.0.3. To use a MYSQL_BIND structure, you should zero its contents to initialize it, and then set the members just described appropriately. For example, to declare and initialize an array of three MYSQL_BIND structures, use this code:
MYSQL_BIND bind[3]; memset(bind, 0, sizeof(bind));
MYSQL_TIME This structure is used to send and receive DATE, TIME, DATETIME, and TIMESTAMP data directly to and from the server. This is done by setting the buffer_type member of a MYSQL_BIND structure to one of the temporal types, and setting the buffer member to point to a MYSQL_TIME structure. The MYSQL_TIME structure contains the following members:
unsigned int year The year. unsigned int month The month of the year.
1038
unsigned int day The day of the month. unsigned int hour The hour of the day. unsigned int minute The minute of the hour. unsigned int second The second of the minute. my_bool neg A boolean flag to indicate whether the time is negative.
unsigned long second_part The fractional part of the second. This member currently is unused.
Only those parts of a MYSQL_TIME structure that apply to a given type of temporal value are used: The year, month, and day elements are used for DATE, DATETIME, and TIMESTAMP values. The hour, minute, and second elements are used for TIME, DATETIME, and TIMESTAMP values. See Seccin 24.2.10, Manejo de valores de fecha y hora por parte de la API C. The following table shows the allowable values that may be specified in the buffer_type member of MYSQL_BIND structures. The table also shows those SQL types that correspond most closely to each buffer_type value, and, for numeric and temporal types, the corresponding C type. buffer_type Value 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 SQL Type TINYINT SMALLINT INT BIGINT FLOAT DOUBLE TIME DATE DATETIME TIMESTAMP CHAR VARCHAR TINYBLOB/TINYTEXT BLOB/TEXT MEDIUMBLOB/MEDIUMTEXT LONGBLOB/LONGTEXT C Type char short int int long long int float double MYSQL_TIME MYSQL_TIME MYSQL_TIME MYSQL_TIME
1039
Call mysql_stmt_init() to create a statement handle, then mysql_stmt_prepare to prepare it, mysql_stmt_bind_param() to supply the parameter data, and mysql_stmt_execute() to execute the statement. You can repeat the mysql_stmt_execute() by changing parameter values in the respective buffers supplied through mysql_stmt_bind_param().
1040
If the statement is a SELECT or any other statement that produces a result set, mysql_stmt_prepare() also returns the result set metadata information in the form of a MYSQL_RES result set through mysql_stmt_result_metadata(). You can supply the result buffers using mysql_stmt_bind_result(), so that the mysql_stmt_fetch() automatically returns data to these buffers. This is row-by-row fetching. You can also send the text or binary data in chunks to server using mysql_stmt_send_long_data(). See Seccin 24.2.7.25, mysql_stmt_send_long_data(). When statement execution has been completed, the statement handle must be closed using mysql_stmt_close() so that all resources associated with it can be freed. If you obtained a SELECT statement's result set metadata by calling mysql_stmt_result_metadata(), you should also free the metadata using mysql_free_result(). Execution Steps To prepare and execute a statement, an application follows these steps: 1. Create a prepared statement handle with msyql_stmt_init(). To prepare the statement on the server, call mysql_stmt_prepare() and pass it a string containing the SQL statement. 2. If the statement produces a result set, call mysql_stmt_result_metadata() to obtain the result set metadata. This metadata is itself in the form of result set, albeit a separate one from the one that contains the rows returned by the query. The metadata result set indicates how many columns are in the result and contains information about each column. 3. Set the values of any parameters using mysql_stmt_bind_param(). All parameters must be set. Otherwise, statement execution returns an error or produces unexpected results. 4. Call mysql_stmt_execute() to execute the statement. 5. If the statement produces a result set, bind the data buffers to use for retrieving the row values by calling mysql_stmt_bind_result(). 6. Fetch the data into the buffers row by row by calling mysql_stmt_fetch() repeatedly until no more rows are found. 7. Repeat steps 3 through 6 as necessary, by changing the parameter values and re-executing the statement. When mysql_stmt_prepare() is called, the MySQL client/server protocol performs these actions: The server parses the statement and sends the okay status back to the client by assigning a statement ID. It also sends total number of parameters, a column count, and its metadata if it is a result set oriented statement. All syntax and semantics of the statement are checked by the server during this call. The client uses this statement ID for the further operations, so that the server can identify the statement from among its pool of statements. When mysql_stmt_execute() is called, the MySQL client/server protocol performs these actions: The client uses the statement handle and sends the parameter data to the server. The server identifies the statement using the ID provided by the client, replaces the parameter markers with the newly supplied data, and executes the statement. If the statement produces a result set, the server sends the data back to the client. Otherwise, it sends an okay status and total number of rows changed, deleted, or inserted. When mysql_stmt_fetch() is called, the MySQL client/server protocol performs these actions:
1041
The client reads the data from the packet row by row and places it into the application data buffers by doing the necessary conversions. If the application buffer type is same as that of the field type returned from the server, the conversions are straightforward. If an error occurs, you can get the statement error code, error message, and SQLSTATE value using mysql_stmt_errno(), mysql_stmt_error(), and mysql_stmt_sqlstate(), respectively.
mysql_send_long_data() mysql_stmt_send_long_data() All functions that operate with a MYSQL_STMT structure begin with the prefix mysql_stmt_. Also in 4.1.2, 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.
24.2.7.1. mysql_stmt_affected_rows()
my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt) Description Returns the total number of rows changed, deleted, or inserted by the last executed statement. May be called immediately after mysql_stmt_execute() for UPDATE, DELETE, or INSERT statements. For SELECT statements, mysql_stmt_affected_rows() works like mysql_num_rows(). This function was added in MySQL 4.1.0. Return Values An integer greater than zero indicates the number of rows affected or retrieved. Zero indicates that no records were updated for an UPDATE statement, no rows matched the WHERE clause in the query, or that no query has yet been executed. -1 indicates that the query returned an error or that, for a SELECT query, mysql_stmt_affected_rows() was called prior to calling mysql_stmt_store_result(). Because mysql_stmt_affected_rows() returns an unsigned value, you can check for -1 by comparing the return value to (my_ulonglong)-1 (or to (my_ulonglong)~0, which is equivalent). See Seccin 24.2.3.1, mysql_affected_rows() for additional information on the return value. Errors None. Example
1042
For the usage of mysql_stmt_affected_rows(), refer to the Example from Seccin 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 Can be used to get the current value for a statement attribute. The option argument is the option that you want to get; the arg should point to a variable that should contain the option value. If the option is an integer, then arg should point to the value of the integer. See mysql_stmt_attr_set() for a list of options and option types. See Seccin 24.2.7.3, mysql_stmt_attr_set(). This function was added in MySQL 4.1.2. Return Values 0 if okay. Non-zero if option is unknown. Errors None.
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 Can be used to set affect behavior for a statement. This function may be called multiple times to set several options. The option argument is the option that you want to set; the arg argument is the value for the option. If the option is an integer, then arg should point to the value of the integer. Possible option values: Option STMT_ATTR_UPDATE_MAX_LENGTH Argument Type my_bool * Function If set to 1: Update metadata MYSQL_FIELD->max_length in mysql_stmt_store_result(). Type of cursor to open for statement when mysql_stmt_execute() is invoked. *arg can be CURSOR_TYPE_NO_CURSOR (the default) or CURSOR_TYPE_READ_ONLY. Number of rows to fetch from server at a time when using a cursor. *arg can be in the range from 1 to the maximum value of unsigned long. The default is 1.
STMT_ATTR_CURSOR_TYPE
unsigned long *
STMT_ATTR_PREFETCH_ROWS
unsigned long *
If you use the STMT_ATTR_CURSOR_TYPE option with CURSOR_TYPE_READ_ONLY, a cursor is opened for the statement when you invoke mysql_stmt_execute(). If there is already an open cursor from a previous mysql_stmt_execute() call, it closes the cursor before opening a new one.
1043
mysql_stmt_reset() also closes any open cursor before preparing the statement for re-execution. mysql_stmt_free_result() closes any open cursor. This function was added in MySQL 4.1.2. The STMT_ATTR_CURSOR_TYPE option was added in MySQL 5.0.2. The STMT_ATTR_PREFETCH_ROWS option was added in MySQL 5.0.6. Return Values 0 if okay. Non-zero if option is unknown. Errors None.
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() is used to bind data for the parameter markers in the SQL statement that was passed to mysql_stmt_prepare(). It uses MYSQL_BIND structures to supply the data. bind is the address of an array of MYSQL_BIND structures. The client library expects the array to contain an element for each '?' parameter marker that is present in the query. Suppose that you prepare the following statement:
INSERT INTO mytbl VALUES(?,?,?)
When you bind the parameters, the array of MYSQL_BIND structures must contain three elements, and can be declared like this:
MYSQL_BIND bind[3];
The members of each MYSQL_BIND element that should be set are described in Seccin 24.2.5, Tipos de datos de sentencias preparadas de la API C. This function was added in MySQL 4.1.2. Return Values Zero if the bind was successful. Non-zero if an error occurred. Errors CR_INVALID_BUFFER_USE Indicates if the bind is to supply the long data in chunks and if the buffer type is non string or binary. 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_param(), refer to the Example from Seccin 24.2.7.10, mysql_stmt_execute().
1044
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 column of the result set. If you do not bind columns to MYSQL_BIND structures, mysql_stmt_fetch() simply ignores the data fetch. 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 that 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 Seccin 24.2.5, Tipos de datos de sentencias preparadas de la API C. This function was added in MySQL 4.1.2. 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 Seccin 24.2.7.13, mysql_stmt_fetch().
24.2.7.6. mysql_stmt_close()
my_bool mysql_stmt_close(MYSQL_STMT *) Description Closes the prepared statement. mysql_stmt_close() also deallocates the statement handle pointed to by stmt. If the current statement has pending or unread results, this function cancels them so that the next query can be executed.
1045
This function was added in MySQL 4.1.0. Return Values Zero if the statement was freed successfully. Non-zero if an error occurred. Errors CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_UNKNOWN_ERROR An unknown error occurred. Example For the usage of mysql_stmt_close(), refer to the Example from Seccin 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 Seeks to an arbitrary row in a statement result set. The offset value is a row number and should be in the range from 0 to mysql_stmt_num_rows(stmt)-1. This function requires that the statement result set structure contains the entire result of the last executed query, so mysql_stmt_data_seek() may be used only in conjunction with mysql_stmt_store_result(). This function was added in MySQL 4.1.1. Return Values None. Errors None.
24.2.7.8. mysql_stmt_errno()
unsigned int mysql_stmt_errno(MYSQL_STMT *stmt) Description For the statement specified by stmt, mysql_stmt_errno() returns the error code for the most recently invoked statement API function that can succeed or fail. A return value of zero means that no error occurred. Client error message numbers are listed in the MySQL errmsg.h header file. Server error message numbers are listed in mysqld_error.h. In the MySQL source distribution you can find a complete list of error messages and error numbers in the file Docs/mysqld_error.txt. The server error codes also are listed at Captulo 26, Manejo de errores en MySQL. This function was added in MySQL 4.1.0. Return Values An error code value. Zero if no error occurred. Errors None.
1046
24.2.7.9. mysql_stmt_error()
const char *mysql_stmt_error(MYSQL_STMT *stmt) Description For the statement specified by stmt, mysql_stmt_error() returns a null-terminated string containing the error message for the most recently invoked statement API function that can succeed or fail. An empty string ("") is returned if no error occurred. This means the following two tests are equivalent:
if (mysql_stmt_errno(stmt)) { // an error occurred } if (mysql_stmt_error(stmt)[0]) { // an error occurred }
The language of the client error messages may be changed by recompiling the MySQL client library. Currently you can choose error messages in several different languages. This function was added in MySQL 4.1.0. Return Values A character string that describes the error. An empty string if no error occurred. Errors None.
24.2.7.10. mysql_stmt_execute()
int mysql_stmt_execute(MYSQL_STMT *stmt) Description mysql_stmt_execute() executes the prepared query associated with the statement handle. The currently bound parameter marker values are sent to server during this call, and the server replaces the markers with this newly supplied data. If the statement is an UPDATE, DELETE, or INSERT, the total number of changed, deleted, or inserted rows can be found by calling mysql_stmt_affected_rows(). If this is a statement such as SELECT that generates a result set, you must call mysql_stmt_fetch() to fetch the data prior to calling any other functions that result in query processing. For more information on how to fetch the results, refer to Seccin 24.2.7.13, mysql_stmt_fetch(). For statements that generate a result set, you can request that mysql_stmt_execute() open a cursor for the statement by calling mysql_stmt_attr_set() before executing the statement. If you execute a statement multiple times, mysql_stmt_execute() closes any open cursor before opening a new one. This function was added in MySQL 4.1.2. Cursor support was added in MySQL 5. Return Values Zero if execution was successful. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC
1047
Commands were executed in an improper order. CR_OUT_OF_MEMORY Out of memory. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred. Example The following example demonstrates how to create and populate a table using mysql_stmt_init(), mysql_stmt_prepare(), mysql_stmt_param_count(), mysql_stmt_bind_param(), mysql_stmt_execute(), and mysql_stmt_affected_rows(). The mysql variable is assumed to be a valid connection handle.
#define STRING_SIZE 50 #define DROP_SAMPLE_TABLE "DROP TABLE IF EXISTS test_table" #define CREATE_SAMPLE_TABLE "CREATE TABLE test_table(col1 INT,\ col2 VARCHAR(40),\ col3 SMALLINT,\ col4 TIMESTAMP)" #define INSERT_SAMPLE "INSERT INTO test_table(col1,col2,col3) VALUES(?,?,?)" MYSQL_STMT MYSQL_BIND my_ulonglong int short int char unsigned long my_bool *stmt; bind[3]; affected_rows; param_count; small_data; int_data; str_data[STRING_SIZE]; str_length; is_null;
if (mysql_query(mysql, DROP_SAMPLE_TABLE)) { fprintf(stderr, " DROP TABLE failed\n"); fprintf(stderr, " %s\n", mysql_error(mysql)); exit(0); } if (mysql_query(mysql, CREATE_SAMPLE_TABLE)) { fprintf(stderr, " CREATE TABLE failed\n"); fprintf(stderr, " %s\n", mysql_error(mysql)); exit(0); } /* Prepare an INSERT query with 3 parameters */ /* (the TIMESTAMP column is not named; the server */ /* sets it to the current date and time) */ stmt = mysql_stmt_init(mysql); if (!stmt) { fprintf(stderr, " mysql_stmt_init(), out of memory\n"); exit(0); } if (mysql_stmt_prepare(stmt, INSERT_SAMPLE, strlen(INSERT_SAMPLE))) {
1048
fprintf(stderr, " mysql_stmt_prepare(), INSERT failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } fprintf(stdout, " prepare, INSERT successful\n"); /* Get the parameter count from the statement */ param_count= mysql_stmt_param_count(stmt); fprintf(stdout, " total parameters in INSERT: %d\n", param_count); if (param_count != 3) /* validate parameter count */ { fprintf(stderr, " invalid parameter count returned by MySQL\n"); exit(0); } /* Bind the data for all 3 parameters */ memset(bind, 0, sizeof(bind)); /* INTEGER PARAM */ /* This is a number type, so there is no need to specify buffer_length */ bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&int_data; bind[0].is_null= 0; bind[0].length= 0; /* STRING PARAM */ bind[1].buffer_type= MYSQL_TYPE_STRING; bind[1].buffer= (char *)str_data; bind[1].buffer_length= STRING_SIZE; bind[1].is_null= 0; bind[1].length= &str_length; /* SMALLINT PARAM */ bind[2].buffer_type= MYSQL_TYPE_SHORT; bind[2].buffer= (char *)&small_data; bind[2].is_null= &is_null; bind[2].length= 0; /* Bind the buffers */ if (mysql_stmt_bind_param(stmt, bind)) { fprintf(stderr, " mysql_stmt_bind_param() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Specify the data values for the first row */ int_data= 10; /* integer */ strncpy(str_data, "MySQL", STRING_SIZE); /* string str_length= strlen(str_data); /* INSERT SMALLINT data as NULL */ is_null= 1; /* Execute the INSERT statement - 1*/ if (mysql_stmt_execute(stmt)) { fprintf(stderr, " mysql_stmt_execute(), 1 failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Get the total number of affected rows */ affected_rows= mysql_stmt_affected_rows(stmt); fprintf(stdout, " total affected rows(insert 1): %lu\n", (unsigned long) affected_rows); if (affected_rows != 1) /* validate affected rows */ { fprintf(stderr, " invalid affected rows by MySQL\n");
*/
1049
exit(0); } /* Specify data values for second row, then re-execute the statement */ int_data= 1000; strncpy(str_data, "The most popular Open Source database", STRING_SIZE); str_length= strlen(str_data); small_data= 1000; /* smallint */ is_null= 0; /* reset */ /* Execute the INSERT statement - 2*/ if (mysql_stmt_execute(stmt)) { fprintf(stderr, " mysql_stmt_execute, 2 failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Get the total rows affected */ affected_rows= mysql_stmt_affected_rows(stmt); fprintf(stdout, " total affected rows(insert 2): %lu\n", (unsigned long) affected_rows); if (affected_rows != 1) /* validate affected rows */ { fprintf(stderr, " invalid affected rows by MySQL\n"); exit(0); } /* Close the statement */ if (mysql_stmt_close(stmt)) { fprintf(stderr, " failed while closing the statement\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); }
Note: For complete examples on the use of prepared statement functions, refer to the file tests/ mysql_client_test.c. This file can be obtained from a MySQL source distribution or from the BitKeeper source repository.
24.2.7.11. mysql_stmt_free_result()
my_bool mysql_stmt_free_result(MYSQL_STMT *stmt) Description Releases memory associated with the result set produced by execution of the prepared statement. If there is a cursor open for the statement, mysql_stmt_free_result() closes it. This function was added in MySQL 4.1.1. Cursor support was added in MySQL 5. Return Values Zero if the result set was freed successfully. Non-zero if an error occurred. Errors
24.2.7.12. mysql_stmt_insert_id()
my_ulonglong mysql_stmt_insert_id(MYSQL_STMT *stmt) Description Returns the value generated for an AUTO_INCREMENT column by the prepared INSERT or UPDATE statement. Use this function after you have executed prepared INSERT statement into a table which contains an AUTO_INCREMENT field. See Seccin 24.2.3.34, mysql_insert_id() for more information.
1050
This function was added in MySQL 4.1.2. Return Values Value for AUTO_INCREMENT column which was automatically generated or explicitly set during execution of prepared statement, or value generated by LAST_INSERT_ID(expr) function. Return value is undefined if statement does not set AUTO_INCREMENT value. Errors None.
24.2.7.13. mysql_stmt_fetch()
int mysql_stmt_fetch(MYSQL_STMT *stmt) Description mysql_stmt_fetch() returns the next row in the result set. It can be called only while the result set exists, that is, after a call to mysql_stmt_execute() that creates a result set or after mysql_stmt_store_result(), which is called after mysql_stmt_execute() to buffer the entire result set. mysql_stmt_fetch() returns row data using the buffers bound by mysql_stmt_bind_result(). It returns the data in those buffers for all the columns in the current row set and the lengths are returned to the length pointer. All columns must be bound by the application before calling mysql_stmt_fetch(). If a fetched data value is a NULL value, the *is_null value of the corresponding MYSQL_BIND structure contains TRUE (1). Otherwise, the data and its length are returned in the *buffer and *length elements based on the buffer type specified by the application. Each numeric and temporal type has a fixed length, as listed in the following table. The length of the string types depends on the length of the actual data value, as indicated by 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_STRING MYSQL_TYPE_BLOB This function was added in MySQL 4.1.2. Return Values Return Value 0 1 MYSQL_NO_DATA Description Successful, the data has been fetched to application data buffers. Error occurred. Error code and message can be obtained by calling mysql_stmt_errno() and mysql_stmt_error(). No more rows/data exists Length 1 2 4 8 4 8 sizeof(MYSQL_TIME) sizeof(MYSQL_TIME) sizeof(MYSQL_TIME) data length data_length
1051
MYSQL_DATA_TRUNCATED
MYSQL_DATA_TRUNCATED is not returned unless truncation reporting is enabled with mysql_options(). To determine which parameters were truncated when this value is returned, check the error members of the MYSQL_BIND parameter structures. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_OUT_OF_MEMORY Out of memory. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred. CR_UNSUPPORTED_PARAM_TYPE The buffer type is MYSQL_TYPE_DATE, MYSQL_TYPE_TIME, MYSQL_TYPE_DATETIME, or MYSQL_TYPE_TIMESTAMP, but the data type is not DATE, TIME, DATETIME, or TIMESTAMP. All other unsupported conversion errors are returned from mysql_stmt_bind_result(). Example The following example demonstrates how to fetch data from a table using mysql_stmt_result_metadata(), mysql_stmt_bind_result(), and mysql_stmt_fetch(). (This example expects to retrieve the two rows inserted by the example shown in Seccin 24.2.7.10, mysql_stmt_execute().) The mysql variable is assumed to be a valid connection handle.
#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];
/* Prepare a SELECT query to fetch data from test_table */ stmt = mysql_stmt_init(mysql); if (!stmt) { fprintf(stderr, " mysql_stmt_init(), out of memory\n"); exit(0); } if (mysql_stmt_prepare(stmt, SELECT_SAMPLE, strlen(SELECT_SAMPLE))) { fprintf(stderr, " mysql_stmt_prepare(), SELECT failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
1052
exit(0); } fprintf(stdout, " prepare, SELECT successful\n"); /* Get the parameter count from the statement */ param_count= mysql_stmt_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); } /* Fetch result set meta information */ prepare_meta_result = mysql_stmt_result_metadata(stmt); if (!prepare_meta_result) { fprintf(stderr, " mysql_stmt_result_metadata(), returned no meta information\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Get total columns in the query */ 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 */ { fprintf(stderr, " invalid column count returned by MySQL\n"); exit(0); } /* Execute the SELECT query */ if (mysql_stmt_execute(stmt)) { fprintf(stderr, " mysql_stmt_execute(), failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Bind the result buffers for all 4 columns before fetching them */ memset(bind, 0, sizeof(bind)); /* 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_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]; /* Bind the result buffers */
1053
if (mysql_stmt_bind_result(stmt, bind)) { fprintf(stderr, " mysql_stmt_bind_result() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Now buffer all results to client */ if (mysql_stmt_store_result(stmt)) { fprintf(stderr, " mysql_stmt_store_result() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Fetch all rows */ row_count= 0; fprintf(stdout, "Fetching results ...\n"); while (!mysql_stmt_fetch(stmt)) { row_count++; fprintf(stdout, " row %d\n", row_count); /* column 1 */ fprintf(stdout, " column1 (integer) : "); if (is_null[0]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %d(%ld)\n", int_data, length[0]); /* column 2 */ fprintf(stdout, " column2 (string) : "); if (is_null[1]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %s(%ld)\n", str_data, length[1]); /* column 3 */ fprintf(stdout, " column3 (smallint) : "); if (is_null[2]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %d(%ld)\n", small_data, length[2]); /* column 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"); } /* Validate rows fetched */ fprintf(stdout, " total rows fetched: %d\n", row_count); if (row_count != 2) { fprintf(stderr, " MySQL failed to return all rows\n"); exit(0); } /* Free the prepared result metadata */ mysql_free_result(prepare_meta_result);
/* Close the statement */ if (mysql_stmt_close(stmt)) { fprintf(stderr, " failed while closing the statement\n");
1054
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) Description Fetch one column from the current result set row. bind provides the buffer where data should be placed. It should be set up the same way as for mysql_stmt_bind_result(). column indicates which column to fetch. The first column is numbered 0. offset is the offset within the data value at which to begin retrieving data. This can be used for fetching the data value in pieces. The beginning of the value is offset 0. This function was added in MySQL 4.1.2. Return Values Zero if the value was fetched successfully. Non-zero if an error occurred. Errors CR_INVALID_PARAMETER_NO Invalid column number. CR_NO_DATA The end of the result set has already been reached.
24.2.7.15. mysql_stmt_field_count()
unsigned int mysql_stmt_field_count(MYSQL_STMT *stmt) Description Returns the number of columns for the most recent statement for the statement handler. This value is zero for statements such as INSERT or DELETE that do not produce result sets. mysql_stmt_field_count() can be called after you have prepared a statement by invoking mysql_stmt_prepare(). This function was added in MySQL 4.1.3. Return Values An unsigned integer representing the number of columns in a result set. Errors None.
24.2.7.16. mysql_stmt_init()
MYSQL_STMT *mysql_stmt_init(MYSQL *mysql) Description Create a MYSQL_STMT handle. The handle should be freed with mysql_stmt_close(MYSQL_STMT *).
1055
This function was added in MySQL 4.1.2. Return values A pointer to a MYSQL_STMT structure in case of success. NULL if out of memory. Errors CR_OUT_OF_MEMORY Out of memory.
24.2.7.17. mysql_stmt_num_rows()
my_ulonglong mysql_stmt_num_rows(MYSQL_STMT *stmt) Description Returns the number of rows in the result set. The use of mysql_stmt_num_rows() depends on whether or not you used mysql_stmt_store_result() to buffer the entire result set in the statement handle. If you use mysql_stmt_store_result(), mysql_stmt_num_rows() may be called immediately. This function was added in MySQL 4.1.1. Return Values The number of rows in the result set. Errors None.
24.2.7.18. mysql_stmt_param_count()
unsigned long mysql_stmt_param_count(MYSQL_STMT *stmt) Description Returns the number of parameter markers present in the prepared statement. This function was added in MySQL 4.1.2. Return Values An unsigned long integer representing the number of parameters in a statement. Errors None. Example For the usage of mysql_stmt_param_count(), refer to the Example from Seccin 24.2.7.10, mysql_stmt_execute().
24.2.7.19. mysql_stmt_param_metadata()
MYSQL_RES *mysql_stmt_param_metadata(MYSQL_STMT *stmt) To be added. This function was added in MySQL 4.1.2.
1056
24.2.7.20. mysql_stmt_prepare()
int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, unsigned long length) Description Given the statement handle returned by mysql_stmt_init(), prepares the SQL statement pointed to by the string query and returns a status value. The string length should be given by the length argument. The string must consist of a single SQL statement. You should not add a terminating semicolon (';') or \g to the statement. The application can include one or more parameter markers in the SQL statement by embedding question mark ('?') characters into the SQL string at the appropriate positions. The markers are legal only in certain places in SQL statements. For example, they are allowed in the VALUES() list of an INSERT statement (to specify column values for a row), or in a comparison with a column in a WHERE clause to specify a comparison value. However, they are not allowed for identifiers (such as table or column names), or to specify both operands of a binary operator such as the = equal sign. The latter restriction is necessary because it would be impossible to determine the parameter type. In general, parameters are legal only in Data Manipulation Language (DML) statements, and not in Data Definition Language (DDL) statements. The parameter markers must be bound to application variables using mysql_stmt_bind_param() before executing the statement. This function was added in MySQL 4.1.2. Return Values Zero if the statement was prepared successfully. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_OUT_OF_MEMORY Out of memory. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query CR_UNKNOWN_ERROR An unknown error occurred. If the prepare operation was unsuccessful (that is, mysql_stmt_prepare() returns non-zero), the error message can be obtained by calling mysql_stmt_error(). Example
1057
For the usage of mysql_stmt_prepare(), refer to the Example from Seccin 24.2.7.10, mysql_stmt_execute().
24.2.7.21. mysql_stmt_reset()
my_bool mysql_stmt_reset(MYSQL_STMT *stmt) Description Reset the prepared statement on the client and server to state after prepare. This is mainly used to reset data sent with mysql_stmt_send_long_data(). Any open cursor for the statement is closed. To re-prepare the statement with another query, use mysql_stmt_prepare(). This function was added in MySQL 4.1.1. Cursor support was added in MySQL 5. Return Values Zero if the statement was reset successfully. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query CR_UNKNOWN_ERROR An unknown error occurred.
24.2.7.22. mysql_stmt_result_metadata()
MYSQL_RES *mysql_stmt_result_metadata(MYSQL_STMT *stmt) Description If a statement passed to mysql_stmt_prepare() is one that produces a result set, mysql_stmt_result_metadata() returns the result set metadata in the form of a pointer to a MYSQL_RES structure that can be used to process the meta information such as total number of fields and individual field information. This result set pointer can be passed as an argument to any of the field-based API functions that process result set metadata, such as: 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()
1058
The result set structure should be freed when you are done with it, which you can do by passing it to mysql_free_result(). This is similar to the way you free a result set obtained from a call to mysql_store_result(). The result set returned by mysql_stmt_result_metadata() contains only metadata. It does not contain any row results. The rows are obtained by using the statement handle with mysql_stmt_fetch(). This function was added in MySQL 4.1.2. Return Values A MYSQL_RES result structure. NULL if no meta information exists for the prepared query. Errors CR_OUT_OF_MEMORY Out of memory. CR_UNKNOWN_ERROR An unknown error occurred. Example For the usage of mysql_stmt_result_metadata(), refer to the Example from Seccin 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 Sets the row cursor to an arbitrary row in a statement result set. The offset value is a row offset that should be a value returned from mysql_stmt_row_tell() or from mysql_stmt_row_seek(). This value is not a row number; if you want to seek to a row within a result set by number, use mysql_stmt_data_seek() instead. This function requires that the result set structure contains the entire result of the query, so mysql_stmt_row_seek() may be used only in conjunction with mysql_stmt_store_result(). This function was added in MySQL 4.1.1. Return Values The previous value of the row cursor. This value may be passed to a subsequent call to mysql_stmt_row_seek(). Errors None.
24.2.7.24. mysql_stmt_row_tell()
MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT *stmt) Description Returns the current position of the row cursor for the last mysql_stmt_fetch(). This value can be used as an argument to mysql_stmt_row_seek(). You should use mysql_stmt_row_tell() only after mysql_stmt_store_result().
1059
This function was added in MySQL 4.1.1. Return Values The current offset of the row cursor. Errors None.
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 Allows an application to send parameter data to the server in pieces (or chunks). This function can be called multiple times to send the parts of a character or binary data value for a column, which must be one of the TEXT or BLOB data types. parameter_number indicates which parameter to associate the data with. Parameters are numbered beginning with 0. data is a pointer to a buffer containing data to be sent, and length indicates the number of bytes in the buffer. Note: The next mysql_stmt_execute() call ignores the bind buffer for all parameters that have been used with mysql_stmt_send_long_data() since last mysql_stmt_execute() or mysql_stmt_reset(). If you want to reset/forget the sent data, you can do it with mysql_stmt_reset(). See Seccin 24.2.7.21, mysql_stmt_reset(). This function was added in MySQL 4.1.2. Return Values Zero if the data is sent successfully to server. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_OUT_OF_MEMORY Out of memory. CR_UNKNOWN_ERROR An unknown error occurred. Example The following example demonstrates how to send the data for a TEXT column in chunks. It inserts the data value 'MySQL - The most popular Open Source database' into the text_column column. The mysql variable is assumed to be a valid connection handle.
#define INSERT_QUERY "INSERT INTO test_long_data(text_column) VALUES(?)" MYSQL_BIND bind[1];
1060
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; /* Bind the buffers */ if (mysql_stmt_bind_param(stmt, bind)) { fprintf(stderr, "\n param bind failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Supply data in chunks to server */ 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); } /* Supply the next piece of data */ 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); } /* Now, execute the query */ if (mysql_stmt_execute(stmt)) { fprintf(stderr, "\n mysql_stmt_execute failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); }
24.2.7.26. mysql_stmt_sqlstate()
const char *mysql_stmt_sqlstate(MYSQL_STMT *stmt) Description For the statement specified by stmt, mysql_stmt_sqlstate() returns a null-terminated string containing the SQLSTATE error code for the most recently invoked prepared statement API function that can succeed or fail. The error code consists of five characters. "00000" means no error. The values are specified by ANSI SQL and ODBC. For a list of possible values, see Captulo 26, Manejo de errores en MySQL. Note that not all MySQL errors are yet mapped to SQLSTATE's. The value "HY000" (general error) is used for unmapped errors. This function was added to MySQL 4.1.1. Return Values
1061
24.2.7.27. mysql_stmt_store_result()
int mysql_stmt_store_result(MYSQL_STMT *stmt) Description You must call mysql_stmt_store_result() for every statement that successfully produces a result set (SELECT, SHOW, DESCRIBE, EXPLAIN), and only if you want to buffer the complete result set by the client, so that the subsequent mysql_stmt_fetch() call returns buffered data. It is unnecessary to call mysql_stmt_store_result() for other statements, but if you do, it does not harm or cause any notable performance problem. You can detect whether the statement produced a result set by checking if mysql_stmt_result_metadata() returns NULL. For more information, refer to Seccin 24.2.7.22, mysql_stmt_result_metadata(). Note: MySQL doesn't by default calculate MYSQL_FIELD->max_length for all columns in mysql_stmt_store_result() because calculating this would slow down mysql_stmt_store_result() considerably and most applications doesn't need max_length. If you want max_length to be updated, you can call mysql_stmt_attr_set(MYSQL_STMT, STMT_ATTR_UPDATE_MAX_LENGTH, &flag) to enable this. See Seccin 24.2.7.3, mysql_stmt_attr_set(). This function was added in MySQL 4.1.0. Return Values Zero if the results are buffered successfully. Non-zero if an error occurred. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_OUT_OF_MEMORY Out of memory. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_SERVER_LOST The connection to the server was lost during the query. CR_UNKNOWN_ERROR An unknown error occurred.
1062
Prepared statements do not use the Query Cache, even in cases where a query does not contain any placeholders. See Seccin 5.12.1, Cmo opera la cach de consultas.
The multiple-statement capability can be used with mysql_query() or mysql_real_query(). It cannot be used with the prepared statement interface. Prepared statement handles are defined to work only with strings that contain a single statement.
1063
3. Fill in the members of the MYSQL_TIME structure that are appropriate for the type of temporal value you're passing. Use mysql_stmt_bind_param() to bind the parameter data to the statement. Then you can call mysql_stmt_execute(). To retrieve temporal values, the procedure is similar, except that you set the buffer_type member to the type of value you expect to receive, and the buffer member to the address of a MYSQL_TIME structure into which the returned value should be placed. Use mysql_bind_results() to bind the buffers to the statement after calling mysql_stmt_execute() and before fetching the results. Here is a simple example that inserts DATE, TIME, and TIMESTAMP data. The mysql variable is assumed to be a valid connection handle.
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_stmt_init(mysql); if (!stmt) { fprintf(stderr, " mysql_stmt_init(), out of memory\n"); exit(0); } if (mysql_stmt_prepare(mysql, query, strlen(query))) { fprintf(stderr, "\n mysql_stmt_prepare(), INSERT failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* set up input buffers for all 3 parameters */ 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_stmt_bind_param(stmt, bind); /* supply the data to be sent in the ts structure */ ts.year= 2002; ts.month= 02; ts.day= 03; ts.hour= 10; ts.minute= 45; ts.second= 20; mysql_stmt_execute(stmt); ..
24.2.11.1. my_init()
void my_init(void)
1064
Description This function needs to be called once in the program before calling any MySQL function. This initializes some global variables that MySQL needs. If you are using a thread-safe client library, this also calls mysql_thread_init() for this thread. This is automatically called by mysql_init(), mysql_library_init(), mysql_server_init() and mysql_connect(). Return Values None.
24.2.11.2. mysql_thread_init()
my_bool mysql_thread_init(void) Description This function needs to be called for each created thread to initialize thread-specific variables. This is automatically called by my_init() and mysql_connect(). Return Values Zero if successful. Non-zero if an error occurred.
24.2.11.3. mysql_thread_end()
void mysql_thread_end(void) Description This function needs to be called before calling pthread_exit() to free memory allocated by mysql_thread_init(). Note that this function is not invoked automatically by the client library. It must be called explicitly to avoid a memory leak. Return Values None.
24.2.11.4. mysql_thread_safe()
unsigned int mysql_thread_safe(void) Description This function indicates whether the client is compiled as thread-safe. Return Values 1 is the client is thread-safe, 0 otherwise.
1065
As of MySQL 4.1.10 and 5.0.3, the mysql_library_init() and mysql_library_end() functions can be used to do this. These actually are #define symbols that make them equivalent to mysql_server_init() and mysql_server_end(), 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. For more information, see Seccin 24.2.2, Panormica de funciones de la API C.
24.2.12.1. mysql_server_init()
int mysql_server_init(int argc, char **argv, char **groups) Description This function must be called once in the program using the embedded server before calling any other MySQL function. It starts the server and initializes any subsystems (mysys, InnoDB, etc.) that the server uses. If this function is not called, the next call to mysql_init() executes mysql_server_init(). If you are using the DBUG package that comes with MySQL, you should call this after you have called my_init(). The argc and argv arguments are analogous to the arguments to main(). The first element of argv is ignored (it typically contains the program name). For convenience, argc may be 0 (zero) if there are no command-line arguments for the server. mysql_server_init() makes a copy of the arguments so it's safe to destroy argv or groups after the call. If you want to connect to an external server without starting the embedded server, you have to specify a negative value for argc. The NULL-terminated list of strings in groups selects which groups in the option files are active. See Seccin 4.3.2, Usar ficheros de opciones. For convenience, groups may be NULL, in which case the [server] and [embedded] groups are active. Example
#include <mysql.h> #include <stdlib.h> static char *server_args[] = { "this_program", /* this string is not used */ "--datadir=.", "--key_buffer_size=32M" }; static char *server_groups[] = { "embedded", "server", "this_program_SERVER", (char *)NULL }; int main(void) { if (mysql_server_init(sizeof(server_args) / sizeof(char *), server_args, server_groups)) exit(1); /* Use any MySQL API functions here */ mysql_server_end(); return EXIT_SUCCESS; }
24.2.12.2. mysql_server_end()
1066
void mysql_server_end(void) Description This function must be called once in the program after all other MySQL functions. It shuts down the embedded server. Return Values None.
1067
You can check from your C applications whether a value was stored into an AUTO_INCREMENT column by executing the following code (which assumes that you've checked that the statement succeeded). It determines whether the query was an INSERT with an AUTO_INCREMENT index:
if ((result = mysql_store_result(&mysql)) == 0 && mysql_field_count(&mysql) == 0 && mysql_insert_id(&mysql) != 0) { used_id = mysql_insert_id(&mysql); }
For more information, see Seccin 24.2.3.34, mysql_insert_id(). When a new AUTO_INCREMENT value has been generated, you can also obtain it by executing a SELECT LAST_INSERT_ID() statement with mysql_query() and retrieving the value from the result set returned by the statement. For LAST_INSERT_ID(), the most recently generated ID is maintained in the server on a perconnection basis. It is not changed by another client. It is not even changed if you update another AUTO_INCREMENT column with a non-magic value (that is, a value that is not NULL and not 0). If you want to use the ID that was generated for one table and insert it into a second table, you can use SQL statements like this:
INSERT INTO foo (auto,text) VALUES(NULL,'text'); INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text'); # generate ID by inserting NULL # use ID in second table
Note that mysql_insert_id() returns the value stored into an AUTO_INCREMENT column, whether that value is automatically generated by storing NULL or 0 or was specified as an explicit value. LAST_INSERT_ID() returns only automatically generated AUTO_INCREMENT values. If you store an explicit value other than NULL or 0, it does not affect the value returned by LAST_INSERT_ID().
If this happens on your system, you must include the math library by adding -lm to the end of the compile/link line.
1068
The sh -c is needed to get the shell not to treat the output from mysql_config as one word.
This creates a thread-safe client library libmysqlclient_r. (Assuming that your OS has a threadsafe gethostbyname_r() function.) This library is thread-safe per connection. You can let two threads share the same connection with the following caveats: Two threads can't send a query to the MySQL server at the same time on the same connection. In particular, you have to ensure that between a mysql_query() and mysql_store_result() no other thread is using the same connection. Many threads can access different result sets that are retrieved with mysql_store_result(). If you use mysql_use_result, you have to ensure that no other thread is using the same connection until the result set is closed. However, it really is best for threaded clients that share the same connection to use mysql_store_result(). If you want to use multiple threads on the same connection, you must have a mutex lock around your mysql_query() and mysql_store_result() call combination. Once mysql_store_result() is ready, the lock can be released and other threads may query the same connection.
1069
If you program with POSIX threads, you can use pthread_mutex_lock() and pthread_mutex_unlock() to establish and release a mutex lock. You need to know the following if you have a thread that is calling MySQL functions which did not create the connection to the MySQL database: When you call mysql_init() or mysql_connect(), MySQL creates a thread-specific variable for the thread that is used by the debug library (among other things). If you call a MySQL function, before the thread has called mysql_init() or mysql_connect(), the thread does not have the necessary thread-specific variables in place and you are likely to end up with a core dump sooner or later. The get things to work smoothly you have to do the following: 1. Call my_init() at the start of your program if it calls any other MySQL function before calling mysql_real_connect(). 2. Call mysql_thread_init() in the thread handler before calling any MySQL function. 3. In the thread, call mysql_thread_end() before calling pthread_exit(). This frees the memory used by MySQL thread-specific variables. You may get some errors because of undefined symbols when linking your client with libmysqlclient_r. In most cases this is because you haven't included the thread libraries on the link/compile line.
mysql_server_init() Should be called before any other MySQL function is called, preferably early in the main() function. mysql_server_end() Should be called before your program exits. Should be called before calling pthread_exit() mysql_thread_init() Should be called in each thread you create that accesses MySQL. mysql_thread_end()
Then you must link your code with libmysqld.a instead of libmysqlclient.a. The mysql_server_xxx() functions are also included in libmysqlclient.a to allow you to change between the embedded and the client/server version by just linking your application with the right library. See Seccin 24.2.12.1, mysql_server_init().
1070
When you link your program with libmysqld, you must also include the system-specific pthread libraries and some libraries that the MySQL server uses. You can get the full list of libraries by executing mysql_config --libmysqld-libs. The correct flags for compiling and linking a threaded program must be used, even if you do not directly call any thread functions in your code. To compile a C program to include the necessary files to embed the MySQL server library into a compiled version of a program, use the GNU C compiler (gcc). The compiler will need to know where to find various files and need instructions on how to compile the program. Below is an example of how a program could be compiled from the command-line:
gcc mysql_test.c -o mysql_test -lz \ `/usr/local/mysql/bin/mysql_config --include --libmysqld-libs`
Immediately following the gcc command is the name of the uncompiled C program file. After it, the o option is given to indicate that the file name that follows is the name that the compiler is to give to the output file, the compiled program. The next line of code tells the compiler to obtain the location of the include files and libraries and other settings for the system on which it's compiled. Because of a problem with mysql_config, the option -lz (for compression) is added here. The mysql_config piece is contained in backticks, not single quotes.
We are going to provide options to leave out some parts of MySQL to make the library smaller. There is still a lot of speed optimization to do. Errors are written to stderr. We will add an option to specify a filename for these. We have to change InnoDB not to be so verbose when using the embedded version. If your database does not contain InnoDB tables, to suppress related messages you can add the --skipinnodb option to the options file under the group [libmysqd_server], or when initializing the server with mysql_server_init().
MYSQL *mysql; MYSQL_RES *results; MYSQL_ROW record; static char *server_options[] = { "mysql_test", "--defaults-file=my.cnf" }; int num_elements = sizeof(server_options)/ sizeof(char *); static char *server_groups[] = { "libmysqld_server", "libmysqld_client" }; int main(void) { mysql_server_init(num_elements, server_options, server_groups); mysql = mysql_init(NULL); mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "libmysqld_client"); mysql_options(mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL); mysql_real_connect(mysql, NULL,NULL,NULL, "database1", 0,NULL,0); mysql_query(mysql, "SELECT column1, column2 FROM table1"); results = mysql_store_result(mysql); while((record = mysql_fetch_row(results))) { printf("%s - %s \n", record[0], record[1]); } mysql_free_result(results); mysql_close(mysql); mysql_server_end(); return 0; }
1072
Example 2 To try out the example, create an test2_libmysqld directory at the same level as the mysql-4.0 source directory. Save the test2_libmysqld.c source and the GNUmakefile in the directory, and run GNU make from inside the test2_libmysqld directory. test2_libmysqld.c
/* * A simple example client, using the embedded MySQL server library */ #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[] = { "test2_libmysqld_SERVER", "embedded", "server", NULL }; int main(int argc, char **argv) { MYSQL *one, *two; /* * * * * * * * * mysql_server_init() must be called before any other mysql functions. You can use mysql_server_init(0, NULL, NULL), and it initializes the server using groups = { "server", "embedded", NULL }. In your $HOME/.my.cnf file, you probably want to put:
[test2_libmysqld_SERVER] language = /path/to/source/of/mysql/sql/share/english * You could, of course, modify argc and argv before passing * them to this function. Or you could create new ones in any * way you like. But all of the arguments in argv (except for * argv[0], which is the program name) should be valid options * for the MySQL server. * * If you link this client against the normal mysqlclient * library, this function is just a stub that does nothing. */ 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); /* This must be called after all other mysql functions */ mysql_server_end(); exit(EXIT_SUCCESS); } static void die(MYSQL *db, char *fmt, ...)
1073
{ 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 failed: no memory"); /* * Notice that the client and server use separate group names. * This is critical, because the server does not accept the * client's options, and vice versa. */ mysql_options(db, MYSQL_READ_DEFAULT_GROUP, "test2_libmysqld_CLIENT"); if (!mysql_real_connect(db, NULL, NULL, NULL, dbname, 0, NULL, 0)) die(db, "mysql_real_connect failed: %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); mysql_free_result(res); } else (void)printf("Affected rows: %lld\n", mysql_affected_rows(db)); return; err: die(db, "db_do_query failed: %s [%s]", mysql_error(db), query); }
GNUmakefile
# This assumes the MySQL software is installed in /usr/local/mysql
1074
inc lib
:= /usr/local/mysql/include/mysql := /usr/local/mysql/lib
# If you have not installed the MySQL software yet, try this instead #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 # You can change -lmysqld to -lmysqlclient to use the # client/server library LDLIBS = -L$(lib) -lmysqld -lz -lm -lcrypt ifneq (,$(shell grep FreeBSD /COPYRIGHT 2>/dev/null)) # FreeBSD LDFLAGS += -pthread else # Assume Linux LDLIBS += -lpthread endif # This works for simple one-file test programs sources := $(wildcard *.c) objects := $(patsubst %c,%o,$(sources)) targets := $(basename $(sources)) all: $(targets) clean: rm -f $(targets) $(objects) *.core
1075
You can also use pod2man, pod2html, and so forth to translate this information into other formats. For online information about Perl DBI, visit the DBI Web site, http://dbi.perl.org/. That site hosts a general DBI mailing list. MySQL AB hosts a list specifically about DBD::mysql; see Seccin 1.6.1.1, Las listas de correo de MySQL. For printed information, the official DBI book is Programming the Perl DBI (Alligator Descartes and Tim Bunce, O'Reilly & Associates, 2000). Information about the book is available at the DBI Web site, http://dbi.perl.org/. For information that focuses specifically on using DBI with MySQL, see MySQL and Perl for the Web (Paul DuBois, New Riders, 2001). This book's Web site is http://www.kitebird.com/mysql-perl/.
1076
Borland C++
1077
1078
Este captulo describe los Conectores MySQL, controladores (drivers) que proporcionan a los programas cliente conectividad con el servidor MySQL. Existen actualmente cinco conectores MySQL: Connector/ODBC proporciona soporte a nivel de controlador para la conexin con un servidor MySQL usando la API de Conectividad de Bases de datos Abierta (ODBC por sus siglas en ingls). Con este controlador la conexin ODBC es posible desde las plataformas Windows, Unix y Mac OS X. Connector/NET permite a los desarrolladores crear aplicaciones .NET usando los datos almacenados en una base de datos MySQL. Connector/NET implementa una interfaz ADO.NET totalmente funcional y proporciona soporte para su uso con herramientas compatibles con ADO.NET. Las aplicaciones que se desee usen Connector/NET pueden escribirse en cualquier lenguaje .NET soportado. El Plugin Visual Studio MySQL trabaja con Connector/NET y Visual Studio 2005. Este plugin es un proveedor DDEX, lo que significa que se pueden usar herramientas de manipulacin de esquemas y datos dentro de Visual Studio para crear y editar objetos dentro de una base de datos MySQL.
1079
MySQL Connector/ODBC
Connector/J proporciona soporte de controlador para conectar con MySQL desde una aplicacin Java usando la API de Conectividad con Bases de Datos Java estndar (JDBC). Connector/MXJ es una herramienta que permite poner en marcha y administrar fcilmente el servidor y la base de datos MySQL a travs de una aplicacin Java Connector/PHP es un controlador para conectar Windows con PHP. Proporciona las extensiones mysql y mysqli para su uso con MySQL 5.0.18 y posteriores. Para informacin de cmo conectar a un servidos MySQL usando otros lenguajes e interfaces distintos a los detallados en este apartado, incluyendo Perl, Python y PHP para otras plataformas y ambientes, por favor vea el captulo Captulo 24, APIs de MySQL.
1080
Introduction to Connector/ODBC
Connector/ODBC 5.0, currently in beta status, has been designed to extend the functionality of the Connector/ODBC 3.51 driver and incorporate full support for the functionality in the MySQL 5.0 server release, including stored procedures and views. Applications using Connector/ODBC 3.51 will be compatible with Connector/ODBC 5.0, while being able to take advantage of the new features. Features and functionality of the Connector/ODBC 5.0 driver are not currently included in this guide. Connector/ODBC 3.51 is the current release of the 32-bit ODBC driver, also known as the MySQL ODBC 3.51 driver. This version is enhanced compared to the older Connector/ODBC 2.50 driver. It has support for ODBC 3.5x specification level 1 (complete core API + level 2 features) in order to continue to provide all functionality of ODBC for accessing MySQL. MyODBC 2.50 is the previous version of the 32-bit ODBC driver from MySQL AB that is based on ODBC 2.50 specification level 0 (with level 1 and 2 features). Information about the MyODBC 2.50 driver is included in this guide for the purposes of comparison only. Nota From this section onward, the primary focus of this guide is the Connector/ ODBC 3.51 driver. More information about the MyODBC 2.50 driver in the documentation included in the installation packages for that version. If there is a specific issue (error or known problem) that only affects the 2.50 version, it may be included here for reference. Nota Version numbers for MySQL products are formatted as X.X.X. However, Windows tools (Control Panel, properties display) may show the version numbers as XX.XX.XX. For example, the official MySQL formatted version number 5.0.9 may be displayed by Windows tools as 5.00.09. The two versions are the same; only the number display format is different.
1081
Introduction to Connector/ODBC
Application: The Application uses the ODBC API to access the data from the MySQL server. The ODBC API in turn uses the communicates with the Driver Manager. 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
1082
Introduction to Connector/ODBC
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: 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). The DSN is a configuration string that identifies a given database driver, database, database host and optionally authentication information that enables an ODBC application to connect to a database using a standardized reference. Because the database connectivity information is identified by the DSN, any ODBC compliant application can connect to the data source using the same DSN reference. This eliminates the need to separately configure each application that needs access to a given database; instead you instruct the application to use a pre-configured DSN. Loading and unloading of the driver required to access a specific database as defined within the DSN. For example, if you have configured a DSN that connects to a MySQL database then the driver manager will load the Connector/ODBC driver to enable the ODBC API to communicate with the MySQL host. Processes ODBC function calls or passes them to the driver for processing. Connector/ODBC Driver: The Connector/ODBC driver is a library that implements the functions supported by 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 MySQL. DSN Configuration: The ODBC configuration file 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 according to the definition in the DSN. The driver uses this to read connection parameters based on the DSN specified. For more information, Seccin 25.1.3, Connector/ODBC Configuration. MySQL Server: The MySQL database where the information is stored. The database is used as the source of the data (during queries) and the destination for data (during inserts and updates).
1083
Connector/ODBC Installation
Mac OS X includes ODBC Administrator, a GUI application that provides a simpler configuration mechanism for the Unix iODBC Driver Manager. You can configure DSN and driver information either through ODBC Administrator or through the iODBC configuration files. This also means that you can test ODBC Administrator configurations using the iodbctest command. http:// www.apple.com. unixODBC Driver Manager for Unix (libodbc.so). See http://www.unixodbc.org, for more information. The unixODBC Driver Manager includes the Connector/ODBC driver 3.51 in the installation package, starting with version unixODBC 2.1.2. iODBC ODBC Driver Manager for Unix (libiodbc.so), see http://www.iodbc.org, for more information.
1084
Connector/ODBC Installation
Zipped installer consists of a Zipped package containing a standalone installation application. To install from this package, you must unzip the installer, and then run the installation application. See Seccin 25.1.2.3.1.1, Installing the Windows Connector/ODBC Driver using an installer to complete the installation. MSI installer, an installation file that can be used with the installer included in Windows 2000, Windows XP and Windows Server 2003. See Seccin 25.1.2.3.1.1, Installing the Windows Connector/ODBC Driver using an installer to complete the installation. Zipped DLL package, containing the DLL files that need must be manually installed. See Seccin 25.1.2.3.1.2, Installing the Windows Connector/ODBC Driver using the Zipped DLL package to complete the installation. 25.1.2.3.1.1. Installing the Windows Connector/ODBC Driver using an installer The installer packages offer a very simple method for installing the Connector/ODBC drivers. If you have downloaded the zipped installer then you must extract the installer application. The basic installation process is identical for both installers. You should follow these steps to complete the installation: 1. Double click on the standalone installer that you extracted, or the MSI file you downloaded. 2. The MySQL Connector/ODBC 3.51 - Setup Wizard will start. Click the Next button to begin the installation process.
3. You will need to choose the installation type. The Typical installation provides the standard files you will need to connect to a MySQL database using ODBC. The Complete option installs all the
1085
Connector/ODBC Installation
available files, including debug and utility components. It is recommended you choose one of these two options to complete the installation. If choose one of these methods, click Next and then proceed to step 5. You may also choose a Custom installation, which enables you to select the individual components that you want to install. You have chosen this method, click Next and then proceed to step 4.
4. If you have chosen a custom installation, use the popups to select which components to install and then click Next to install the necessary files.
1086
Connector/ODBC Installation
5. Once the files have copied to your machine, the installation is complete. Click Finish to exit the installer.
1087
Connector/ODBC Installation
Now the installation is complete, you can continue to configure your ODBC connections using Seccin 25.1.3, Connector/ODBC Configuration. 25.1.2.3.1.2. Installing the Windows Connector/ODBC Driver using the Zipped DLL package If you have downloaded the Zipped DLL package then you must install the individual files required for Connector/ODBC operation manually. Once you have unzipped the installation files, you can either perform this operation by hand, executing each statement individually, or you can use the included Batch file to perform an installation to the default locations. To install using the Batch file: 1. Unzip the Connector/ODBC Zipped DLL package. 2. Open a Command Prompt. 3. Change to the directory created when you unzipped the Connector/ODBC Zipped DLL package. 4. Run Install.bat:
C:\> Install.bat
This will copy the necessary files into the default location, and then register the Connector/ODBC driver with the Windows ODBC manager. If you want to copy the files to an alternative location - for example, to run or test different versions of the Connector/ODBC driver on the same machine, then you must copy the files by hand. It is however
1088
Connector/ODBC Installation
not recommended to install these files in a non-standard location. To copy the files by hand to the default installation location use the following steps: 1. Unzip the Connector/ODBC Zipped DLL package. 2. Open a Command Prompt. 3. Change to the directory created when you unzipped the Connector/ODBC Zipped DLL package. 4. Copy the library files to a suitable directory. The default is to copy them into the default Windows system directory \Windows\System32:
C:\> C:\> C:\> C:\> copy copy copy copy lib\myodbc3S.dll \Windows\System32 lib\myodbc3S.lib \Windows\System32 lib\myodbc3.dll \Windows\System32 lib\myodbc3.lib \Windows\System32
5. Copy the Connector/ODBC tools. These must be placed into a directory that is in the system PATH. The default is to install these into the Windows system directory \Windows\System32:
C:\> copy bin\myodbc3i.exe \Windows\System32 C:\> copy bin\myodbc3m.exe \Windows\System32 C:\> copy bin\myodbc3c.exe \Windows\System32
6. Optionally copy the help files. For these files to be accessible through the help system, they must be installed in the Windows system directory:
C:\> copy doc\*.hlp \Windows\System32
7. Finally, you must register the Connector/ODBC driver with the ODBC manager:
C:\> myodbc3i -a -d -t"MySQL ODBC 3.51 Driver;\ DRIVER=myodbc3.dll;SETUP=myodbc3S.dll"
You must change the references to the DLL files and command location in the above statement if you have not installed these files into the default location. 25.1.2.3.1.3. Handling Installation Errors On Windows, you may get the following error when trying to install the older MyODBC 2.50 driver:
An error occurred while copying C:\WINDOWS\SYSTEM\MFC30.DLL. Restart Windows and try installing again (before running any applications which use ODBC)
The reason for the error is that another application is currently using the ODBC system. Windows may not allow you to complete the installation. In most cases, you can continue by pressing Ignore to copy the rest of the Connector/ODBC files and the final installation should still work. If it doesn't, the solution is to re-boot your computer in safe mode. Choose safe mode by pressing F8 just before your machine starts Windows during re-booting, install the Connector/ODBC drivers, and re-boot to normal mode.
1089
Connector/ODBC Installation
shell> cd mysql-connector-odbc-3.51.11-i686-pc-linux
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 Seccin 25.1.3.4, Configuring a Connector/ODBC DSN on Unix, to configure the DSN for Connector/ODBC. For more information, refer to the INSTALL-BINARY file that comes with your distribution. 25.1.2.3.2.2. Installing Connector/ODBC from an RPM Distribution To install or upgrade Connector/ODBC from an RPM distribution on Linux, simply download the RPM distribution of the latest version of Connector/ODBC and follow the instructions below. Use su root to become root, then install the RPM file. If you are installing for the first time:
shell> su root shell> rpm -ivh mysql-connector-odbc-3.51.12.i386.rpm
If there is any dependency 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. Proceed onto Seccin 25.1.3.4, Configuring a Connector/ODBC DSN on Unix. To uninstall the driver, become root and execute an rpm command:
shell> su root shell> rpm -e mysql-connector-odbc
1090
Connector/ODBC Installation
4. Please take the time to read the Important Information as it contains guidance on how to complete the installation process. Once you have read the notice and collected the necessary information, click Continue.
1091
Connector/ODBC Installation
5. Connector/ODBC drivers are made available under the GNU General Public License. Please read the license if you are not familiar with it before continuing installation. Click Continue to approve the license (you will be asked to confirm that decision) and continue the installation.
1092
Connector/ODBC Installation
6. Choose a location to install the Connector/ODBC drivers and the ODBC Administrator application. You must install the files onto a drive with an operating system and you may be limited in the choices available. Select the drive you want to use, and then click Continue.
1093
Connector/ODBC Installation
7. The installer will automatically select the files that need to be installed on your machine. Click Install to continue. The installer will copy the necessary files to your machine. A progress bar will be shown indicating the installation progress.
1094
Connector/ODBC Installation
8. When installation has been completed you will get a window like the one shown below. Click Close to close and quit the installer.
1095
Connector/ODBC Installation
1096
Connector/ODBC Installation
Suitable C compiler, such as Microsoft Visual C++ or the C compiler included with Microsoft Visual Studio. Compatible make tool. Microsoft's nmake is used in the examples in this section. MySQL client libraries and include files from MySQL 4.0.0 or higher. (Preferably MySQL 4.0.16 or higher). This is required because Connector/ODBC uses new calls and structures that exist only starting from this version of the library. To get the client libraries and include files, visit http:// dev.mysql.com/downloads/. 25.1.2.4.1.1. Building Connector/ODBC 3.51 Connector/ODBC source distributions include Makefiles that require the nmake or other make utility. In the distribution, you can find Makefile for building the release version and Makefile_debug for building debugging versions of the driver libraries and DLLs. To build the driver, use this procedure: 1. Download and extract the sources to a folder, then change directory into that folder. The following command assumes the folder is named myodbc3-src:
C:\> cd myodbc3-src
2. Edit Makefile to specify the correct path for the MySQL client libraries and header files. Then use the following commands to build and install the release version:
C:\> nmake -f Makefile C:\> nmake -f Makefile install
nmake -f Makefile builds the release version of the driver and places the binaries in subdirectory called Release. nmake -f Makefile install installs (copies) the driver DLLs and libraries (myodbc3.dll, myodbc3.lib) to your system directory. 3. To build the debug version, use Makefile_Debug rather than Makefile, as shown below:
C:\> nmake -f Makefile_debug C:\> nmake -f Makefile_debug install
Note: Make sure to specify the correct MySQL client libraries and header files path in the Makefiles (set the MYSQL_LIB_PATH and MYSQL_INCLUDE_PATH variables). The default header file path is assumed to be C:\mysql\include. The default library path is assumed to be C:\mysql\lib\opt for release DLLs and C:\mysql\lib\debug for debug versions. For the complete usage of nmake, visit http://msdn.microsoft.com/library/default.asp?url=/library/enus/dv_vcce4/html/evgrfRunningNMAKE.asp. If you are using the Subversion tree for compiling, all Windows-specific Makefiles are named as Win_Makefile*. 25.1.2.4.1.2. Testing After the driver libraries are copied/installed to the system directory, you can test whether the libraries are properly built by using the samples provided in the samples subdirectory:
C:\> cd samples
1097
Connector/ODBC Installation
25.1.2.4.1.3. Building MyODBC 2.50 The MyODBC 2.50 source distribution includes VC workspace files. You can build the driver using these files (.dsp and .dsw) directly by loading them from Microsoft Visual Studio 6.0 or higher.
Some of the more commonly used configure options are described here: 1. To compile Connector/ODBC, 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 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. 1098
Connector/ODBC Installation
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 Connector/ODBC drivers in /usr/local/odbc/lib, use the --prefix=/usr/local/odbc option. The final configuration command looks something like this:
shell> ./configure --prefix=/usr/local \ --with-iodbc=/usr/local \ --with-mysql-path=/usr/local/mysql
25.1.2.4.2.2. Additional configure Options There are a number of other options that you need, or want, to set when configuring the Connector/ ODBC driver before it is built. To link the driver with MySQL thread safe client libraries libmysqlclient_r.so or libmysqlclient_r.a, you must specify the following configure option:
--enable-thread-safe
This option enables the building of the driver thread-safe library libmyodbc3_r.so from by linking with MySQL thread-safe client library libmysqlclient_r.so (The extensions are OS dependent). If the compilation with the thread-safe option fails, it may be because the correct thread-libraries on the system could not be located. You should set the value of LIBS to point to the correct thread library for your system.
LIBS="-lpthread" ./configure ..
You can enable or disable the shared and static versions of Connector/ODBC using these options:
--enable-shared[=yes/no] --disable-shared --enable-static[=yes/no] --disable-static
By default, all the binary distributions are built as non-debugging versions (configured with -without-debug). To enable debugging information, build the driver from source distribution and use the --withdebug option when you run configure. This option is available only for source trees that have been obtained from the Subversion repository. This option does not apply to the packaged source distributions. By default, the driver is built with the --without-docs option. If you would like the documentation to be built, then execute configure with:
1099
Connector/ODBC Installation
--with-docs
25.1.2.4.2.3. Building and Compilation To build the driver libraries, you have to just execute make.
shell> make
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. 25.1.2.4.2.4. Building Shared Libraries On most platforms, MySQL does not build or support .so (shared) client libraries by default. This is based on our experience of problems when building shared libraries. In cases like this, you have to download the MySQL distribution and configure it with these options:
--without-server --enable-shared
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 mysql-connector-odbc-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 the Connector/ODBC library installation directory (/usr/local/lib (or the lib directory under the installation directory that you supplied with the --prefix).
shell> shell> shell> shell> cd cp cd ln .libs libmyodbc3-3.51.01.so /usr/local/lib /usr/local/lib -s libmyodbc3-3.51.01.so libmyodbc3.so
25.1.2.4.2.5. Installing Driver Libraries To install the driver libraries, execute the following command:
1100
Connector/ODBC Installation
That command installs one of the following sets of libraries: For Connector/ODBC 3.51: libmyodbc3.so libmyodbc3-3.51.01.so, where 3.51.01 is the version of the driver libmyodbc3.a For thread-safe Connector/ODBC 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. 25.1.2.4.2.6. Testing Connector/ODBC on Unix To run the basic samples provided in the distribution with the libraries that you built, use the following command:
shell> make test
Before running the tests, create the DSN 'myodbc3' in odbc.ini and set the environment variable ODBCINI to the correct 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. 25.1.2.4.2.7. Building Connector/ODBC from Source on Mac OS X To build the driver on Mac OS X (Darwin), make use of the following configure example:
shell> ./configure --prefix=/usr/local --with-unixODBC=/usr/local --with-mysql-path=/usr/local/mysql --disable-shared --enable-gui=no --host=powerpc-apple
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
1101
Connector/ODBC Installation
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. 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
25.1.2.4.2.8. Building Connector/ODBC from Source on HP-UX To build the driver on HP-UX 10.x or 11.x, make use of the following configure example: If using cc:
shell> CC="cc" \ CFLAGS="+z" \ LDFLAGS="-Wl,+b:-Wl,+s" \ ./configure --prefix=/usr/local --with-unixodbc=/usr/local --with-mysql-path=/usr/local/mysql/lib/mysql --enable-shared --enable-thread-safe
If using gcc:
shell> CC="gcc" \ LDFLAGS="-Wl,+b:-Wl,+s" \ ./configure --prefix=/usr/local --with-unixodbc=/usr/local --with-mysql-path=/usr/local/mysql --enable-shared --enable-thread-safe
Once the driver is built, cross-check its attributes using chatr .libs/libmyodbc3.sl to determine whether you need to have set the MySQL client library path using the SHLIB_PATH environment variable. For static versions, ignore all shared-library options and run configure with the -disable-shared option. 25.1.2.4.2.9. Building Connector/ODBC from Source on AIX To build the driver on AIX, make use of the following configure example:
shell> ./configure --prefix=/usr/local --with-unixodbc=/usr/local --with-mysql-path=/usr/local/mysql --disable-shared
1102
Connector/ODBC Configuration
--enable-thread-safe
NOTE: For more information about how to build and set up the static and shared libraries across the different platforms refer to ' Using static and shared libraries across platforms'.
You should now have a copy of the entire Connector/ODBC source tree in the directory connectorodbc3. To build from this source tree on Unix or Linux follow these steps:
shell> shell> shell> shell> shell> shell> shell> cd connector-odbc3 aclocal autoheader autoconf automake; ./configure # Add your favorite options here make
For more information on how to build, refer to the INSTALL file located in the same directory. For more information on options to configure, see Seccin 25.1.2.4.2.1, Typical configure Options When the build is done, run make install to install the Connector/ODBC 3.51 driver on your system. If you have gotten to the make stage and the distribution does not compile, please report it to <myodbc@lists.mysql.com>. On Windows, make use of Windows Makefiles WIN-Makefile and WIN-Makefile_debug in building the driver. For more information, see Seccin 25.1.2.4.1, Installing Connector/ODBC from a Source Distribution on Windows. After the initial checkout operation to get the source tree, you should run svn update periodically update your source according to the latest version.
1103
Connector/ODBC Configuration
communicate with a database to a specific name. You use the DSN in an application to communicate with the database, rather than specifying individual parameters within the application itself. DSN information can be user specific, system specific, or provided in a special file. ODBC data source names are configured in different ways, depending on your platform and ODBC driver.
1104
Connector/ODBC Configuration
1. On the Start menu, click Control Panel. 2. In the Control Panel when in Category View click Performance and Maintenance and then click Administrative Tools.. If you are viewing the Control Panel in Classic View, click Administrative Tools. 3. In Administrative Tools, click Data Sources (ODBC). Irrespective of your Windows version, you should be presented the ODBC Data Source Administrator window:
Within Windows XP, you can add the Administrative Tools folder to your Start menu to make it easier to locate the ODBC Data Source Administrator. To do this: 1. Right click on the Start menu. 2. Select Properties. 3. Click Customize.... 4. Select the Advanced tab. 5. Within Start menu items, within the System Administrative Tools section, select Display on the All Programs menu. Within both Windows Server 2003 and Windows XP you may want to permanently add the ODBC Data Source Administrator to your Start menu. To do this, locate the Data Sources (ODBC) icon using the methods shown, then right-click on the icon and then choose Pin to Start Menu.
1105
Connector/ODBC Configuration
Select MySQL ODBC 3.51 Driver, then click Finish. 4. You now need to configure the specific fields for the DSN you are creating through the Add Data Source Name dialog.
1106
Connector/ODBC Configuration
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 some text to help identify the connection. 6. In the Server field, enter the name of the MySQL server host that you want to access. By default, it is localhost. 7. In the User field, enter the user name to use for this connection. 8. In the Password field, enter the corresponding password for this connection. 9. The Database popup should automatically populate with the list of databases that the user has permissions to access. 10. Click OK to save the DSN. A completed DSN configuration may look like this:
1107
Connector/ODBC Configuration
1108
Connector/ODBC Configuration
The three options you can configure are: Port sets the TCP/IP port number to use when communicating with MySQL. Communication with MySQL uses port 3306 by default. If your server is configured to use a different TCP/IP port, you must specify that port number here. Socket sets the name or location of a specific socket or Windows pipe to use when communicating with MySQL. Initial Statement defines an SQL statement that will be executed when the connection to MySQL is opened. You can use this to set MySQL options for your connection, such as setting the default character set or database to use during your connection. The Advanced tab enables you to configure Connector/ODBC connection parameters. Refer to Seccin 25.1.3.5, Connector/ODBC Connection Parameters, for information about the meaning of these options.
1109
Connector/ODBC Configuration
1110
Connector/ODBC Configuration
2. On the User DSN or System DSN panel, click Add. 3. Select the Connector/ODBC driver and click OK. 4. You will be presented with the Data Source Name dialog. Enter The Data Source Name and an optional Description for the DSN.
1111
Connector/ODBC Configuration
5. Click Add to add a new keyword/value pair to the panel. You should configure at least four pairs to specify the server, username, password and database connection parameters. See Seccin 25.1.3.5, Connector/ODBC Connection Parameters. 6. Click OK to add the DSN to the list of configured data source names. A completed DSN configuration may look like this:
1112
Connector/ODBC Configuration
You can configure additional ODBC options to your DSN by adding further keyword/value pairs and setting the corresponding values. See Seccin 25.1.3.5, Connector/ODBC Connection Parameters.
[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
= = = = = = = = =
= = = = = = = = =
1113
Connector/ODBC Configuration
[Default] Driver Description SERVER PORT USER Password Database OPTION SOCKET
= = = = = = = = =
Refer to the Seccin 25.1.3.5, Connector/ODBC Connection Parameters, for the list of connection parameters that can be supplied. Note: If you are using unixODBC, you can use the following tools to set up the DSN: ODBCConfig GUI tool(HOWTO: ODBCConfig) odbcinst In some cases when using unixODBC, you might get this error:
Data source name not found and no default driver specified
If this happens, make sure the ODBCINI and ODBCSYSINI environment variables are pointing to the right odbc.ini file. For example, if your odbc.ini file is located in /usr/local/etc, set the environment variables like this:
export ODBCINI=/usr/local/etc/odbc.ini export ODBCSYSINI=/usr/local/etc
The option argument is used to tell Connector/ODBC that the client isn't 100% ODBC compliant. On Windows, you normally select options by toggling the checkboxes in the connection screen, but you can also select them in the option argument. The following options are listed in the order in which they appear in the Connector/ODBC connect screen: Value 1 Windows Checkbox Don't Optimized Column Width Description The client can't handle that Connector/ODBC returns the real width of a column.
1114
Connector/ODBC Configuration
The client can't handle that MySQL returns the true value of affected rows. If this flag is set, MySQL returns found rows instead. You must have MySQL 3.21.14 or newer to get this to work. Make a debug log in C:\myodbc.log on Windows, or / tmp/myodbc.log on Unix variants. Don't set any packet limit for results and parameters. Don't prompt for questions even if driver would like to prompt. Enable or disable the dynamic cursor support. (Not allowed in Connector/ODBC 2.50.) Ignore use of database name in db_name.tbl_name.col_name. Force use of ODBC manager cursors (experimental). Disable the use of extended fetch (experimental). Pad CHAR columns to full column length. SQLDescribeCol() returns fully qualified column names. Use the compressed client/server protocol. Tell server to ignore space after function name and before ( (needed by PowerBuilder). This makes all function names keywords. Connect with named pipes to a mysqld server running on NT. Change BIGINT columns to INT columns (some applications can't handle BIGINT). Return 'user' as Table_qualifier and Table_owner from SQLTables (experimental). Read parameters from the [client] and [odbc] groups from my.cnf. Add some extra safety checks (should not be needed but...). Disable transactions.
Trace Driver Calls To myodbc.log Allow Big Results Don't Prompt Upon Connect Enable Dynamic Cursor Ignore # in Table Name User Manager Cursors Don't Use Set Locale Pad Char To Full Length Return Table Names for SQLDescribeCol Use Compressed Protocol Ignore Space After Function Names Force Use of Named Pipes Change BIGINT Columns to Int No Catalog (exp) Read Options From my.cnf Safe Disable transaction
Save queries to myodbc.sql Enable query logging to c:\myodbc.sql(/tmp/ myodbc.sql) file. (Enabled only in debug mode.) Do not cache the results locally in the driver, instead read from server (mysql_use_result()). This works only for forward-only cursors. This option is very important in dealing with large tables when you don't want the driver to cache the entire result set. Force the use of Forward-only cursor type. In case of applications setting the default static/dynamic cursor type, and one wants the driver to use non-cache result sets, then this option ensures the forward-only cursor behavior. Enables auto-reconnection functionality. You should not use this option with transactions, since a auto reconnection during a incomplete transaction may cause corruption. Note that an auto-reconnected connection will not inherit the same settings and environment as the original. This option was enabled in Connector/ODBC 3.5.13.
1115
Connector/ODBC Configuration
When set, this option causes the connection to set the SQL_AUTO_IS_NULL option to 1. This disables the standard behavior, but may enable older applications to correctly identify AUTO_INCREMENT values. For more information, see Captulo 12, Funciones y operadores. This option was enabled in Connector/ODBC 3.5.13.
To select multiple options, add together their values. For example, setting option to 12 (4+8) gives you debugging without packet limits. The following table shows some recommended option values for various configurations: Configuration Microsoft Access, Visual Basic Driver trace generation (Debug mode) Microsoft Access (with improved DELETE queries) Large tables with too many rows Sybase PowerBuilder Query log generation (Debug mode) Generate driver trace as well as query log (Debug mode) Large tables with no-cache results Option Value 3 4 35 2049 135168 524288 524292 3145731
If your programming language converts backslash followed by whitespace to a space, it is preferable to specify the connection string as a single long string, or to use a concatenation of multiple strings that does not add spaces in between. For example:
ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" "SERVER=localhost;" "DATABASE=test;" "USER=venu;" "PASSWORD=venu;" "OPTION=3;"
Note. library.
Note that on Mac OS X you may need to specify the full path to the Connector/ODBC driver
1116
Connector/ODBC Configuration
Refer to the Seccin 25.1.3.5, Connector/ODBC Connection Parameters, for the list of connection parameters that can be supplied.
2. When you activate tracing from the Tracing tab, the Driver Manager logs all ODBC function calls for all subsequently run applications.
1117
Connector/ODBC Configuration
3. ODBC function calls from applications running before tracing is activated are not logged. ODBC function calls are recorded in a log file you specify. 4. Tracing ceases only after you click Stop Tracing Now. Remember that while tracing is on, the log file continues to increase in size and that tracing affects the performance of all your ODBC applications.
3. Select the Enable Tracing checkbox. 4. Enter the location where you want to save the Tracing log. If you want to append information to an existing log file, click the Choose... button.
1118
Connector/ODBC Examples
TraceFile specifies the name and full path of the trace file and Trace is set to ON or OFF. You can also use 1 or YES for ON and 0 or NO for OFF. If you are using ODBCConfig from unixODBC, then follow the instructions for tracing unixODBC calls at HOWTO-ODBCConfig.
1119
Connector/ODBC Examples
1120
Connector/ODBC Examples
For more information about MySQL privileges, refer to Seccin 5.7, Gestin de la cuenta de usuario MySQL. On system BETA (the Connector/ODBC client), follow these steps: 1. Configure a Connector/ODBC DSN using parameters that match the server, database and authentication information that you have just configured on system ALPHA. Parameter DSN SERVER DATABASE USER Value remote_test ALPHA test myuser Comment A name to identify the connection. The address of the remote server. The name of the default database. The username configured for access to this database. The password for myuser.
PASSWORD mypassword
2. Using an ODBC-capable application, such as Microsoft Office, connect to the MySQL server using the DSN you have just created. If the connection fails, use tracing to examine the connection process. See Seccin 25.1.3.8, Getting an ODBC Trace File, for more information.
1121
Connector/ODBC Examples
Paradox Visual Objects AllFusion ERwin Data Modeler Also known as CAVO
Team Developer G2-ODBC Bridge iHTML Notes Access Excel Visio Enterprise Visual C++ Visual Basic ODBC.NET FoxPro Visual Interdev
OpenOffice.org Perl Pervasive Software Sambar Technologies SPSS SoftVelocity SQLExpress Sun SunSystems Sybase theKompany.com
OpenOffice.org DBD::ODBC DataJunction Sambar Server SPSS Clarion SQLExpress for Xbase+ + StarOffice Vision PowerBuilder PowerDesigner Data Architect
If you know of any other applications that work with Connector/ODBC, please send mail to <myodbc@lists.mysql.com> about them.
1122
Connector/ODBC Examples
2. From the Data menu, choose Import External Data, and then select New Database Query. 3. Microsoft Query will start. First, you need to choose the data source, by selecting an existing Data Source Name.
4. Within the Query Wizard, you must choose the columns that you want to import. The list of tables available to the user configured through the DSN is shown on the left, the columns that will be added to your query are shown on the right. The columns you choose are equivalent to those in the first section of a SELECT query. Click Next to continue.
1123
Connector/ODBC Examples
5. You can filter rows from the query (the equivalent of a WHERE clause) using the Filter Data dialog. Click Next to continue.
6. Select an (optional) sort order for the data. This is equivalent to using a ORDER BY clause in your SQL query. You can select up to three fields for sorting the information returned by the query. Click Next to continue.
1124
Connector/ODBC Examples
7. Select the destination for your query. You can select to return the data Microsoft Excel, where you can choose a worksheet and cell where the data will be inserted; you can continue to view the query and results within Microsoft Query, where you can edit the SQL query and further filter and sort the information returned; or you can create an OLAP Cube from the query, which can then be used directly within Microsoft Excel. Click Finish.
The same process can be used to import data into a Word document, where the data will be inserted as a table. This can be used for mail merge purposes (where the field data is read from a Word table), or where you want to include data and reports within a report or other document.
1125
Connector/ODBC Examples
2. Click the name of the table or query you want to export, and then in the File menu, select Export. 3. In the Export Object Type Object name To dialog box, in the Save As Type box, select ODBC Databases () as shown here:
4. In the Export dialog box, enter a name for the file (or use the suggested name), and then select OK. 5. The Select Data Source dialog box is displayed; it lists the defined data sources for any ODBC drivers installed on your computer. Click either the File Data Source or Machine Data Source tab, and then double-click the Connector/ODBC or Connector/ODBC 3.51 data source that you want to export to. To define a new data source for Connector/ODBC, please Seccin 25.1.3.2, Configuring a Connector/ODBC DSN on Windows.
1126
Connector/ODBC Examples
Microsoft Access connects to the MySQL Server through this data source and exports new tables and or data. 25.1.4.3.3.2. Importing MySQL Data to Access To import or link a table or tables from MySQL to Access, follow these instructions: 1. Open a database, or switch to the Database window for the open database. 2. To import tables, on the File menu, point to Get External Data, and then click Import. To link tables, on the File menu, point to Get External Data, and then click Link Tables. 3. In the Import (or Link) dialog box, in the Files Of Type box, select ODBC Databases (). The Select Data Source dialog box lists the defined data sources The Select Data Source dialog box is displayed; it lists the defined data source names. 4. If the ODBC data source that you selected requires you to log on, enter your login ID and password (additional information might also be required), and then click OK. 5. Microsoft Access connects to the MySQL server through ODBC data source and displays the list of tables that you can import or link. 6. Click each table that you want to import or link, and then click OK. If you're linking a table and it doesn't have an index that uniquely identifies each record, Microsoft Access displays a list of the fields in the linked table. Click a field or a combination of fields that uniquely identifies each record, and then click OK. 25.1.4.3.3.3. Linking MySQL Data to Access Tables Use the following procedure to view or to refresh links when the structure or location of a linked table has changed. The Linked Table Manager lists the paths to all currently linked tables. To view or refresh links: 1. Open the database that contains links to tables. 2. On the Tools menu, point to Add-ins (Database Utilities in Access 2000 or newer), and then click Linked Table Manager. 3. Select the check box for the tables whose links you want to refresh. 4. Click OK to refresh the links. Microsoft Access confirms a successful refresh or, if the table wasn't found, displays the Select New Location of <table name> dialog box in which you can specify its the table's new location. If several selected tables have moved to the new location that you specify, the Linked Table Manager searches that location for all selected tables, and updates all links in one step. To change the path for a set of linked tables: 1. Open the database that contains links to tables. 2. On the Tools menu, point to Add-ins (Database Utilities in Access 2000 or newer), and then click Linked Table Manager. 3. Select the Always Prompt For A New Location check box. 4. Select the check box for the tables whose links you want to change, and then click OK. 5. In the Select New Location of <table name> dialog box, specify the new location, click Open, and then click OK.
1127
Connector/ODBC Examples
1128
Connector/ODBC Examples
4. When you first expand the ODBC (RDO) folder you will be presented the Data Source Selection screen. From here you can select either a pre-configured DSN, open a file-based DSN or enter and manual connection string. For this example, the Sakila DSN will be used. If the DSN contains a username/password combination, or you want to use different authentication credentials, click Next to enter the username and password that you want to use. Otherwise, click Finish to continue the data source selection wizard.
1129
Connector/ODBC Examples
5. You will be returned the Cross-Tab Report Creation Wizard. You now need to select the database and tables that you want to include in your report. For our example, we will expand the selected Sakila database. Click the city table and use the > button to add the table to the report. Then repeat the action with the country table. Alternatively you can select multiple tables and add them to the report. Finally, you can select the parent Sakila resource and add of the tables to the report. Once you have selected the tables you want to include, click Next to continue.
1130
Connector/ODBC Examples
6. Crystal Reports will now read the table definitions and automatically identify the links between the tables. The identification of links between tables enables Crystal Reports to automatically lookup and summarize information based on all the tables in the database according to your query. If Crystal Reports is unable to perform the linking itself, you can manually create the links between fields in the tables you have selected. Click Next to continue the process.
1131
Connector/ODBC Examples
7. You can now select the columns and rows that you wish to include within the Cross-Tab report. Drag and drop or use the > buttons to add fields to each area of the report. In the example shown, we will report on cities, organized by country, incorporating a count of the number of cities within each country. If you want to browse the data, select a field and click the Browse Data... button. Click Next to create a graph of the results. Since we are not creating a graph from this data, click Finish to generate the report.
1132
Connector/ODBC Examples
8. The finished report will be shown, a sample of the output from the Sakila sample database is shown below.
1133
Connector/ODBC Examples
Once the ODBC connection has been opened within Crystal Reports, you can browse and add any fields within the available tables into your reports.
1134
Connector/ODBC Examples
25.1.4.5.1. Using Connector/ODBC with Visual Basic Using ADO, DAO and RDO
This section contains simple examples of the use of MySQL ODBC 3.51 Driver with ADO, DAO and RDO. 25.1.4.5.1.1. ADO: rs.addNew, rs.delete, and rs.update The following ADO (ActiveX Data Objects) example creates a table my_ado and demonstrates the use of rs.addNew, rs.delete, and rs.update.
Private Sub myodbc_ado_Click() Dim Dim Dim Dim conn As ADODB.Connection rs As ADODB.Recordset fld As ADODB.Field sql As String
'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)" '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
1135
Connector/ODBC Examples
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 Debug.Print Loop rs.Close conn.Close End Sub
25.1.4.5.1.2. DAO: rs.addNew, rs.update, and Scrolling The following DAO (Data Access Objects) example creates a table my_dao and demonstrates the use of rs.addNew, rs.update, and result set scrolling.
Private Sub myodbc_dao_Click() Dim Dim Dim Dim ws As Workspace conn As Connection queryDef As queryDef str As String
'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), Id2 INT)") 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
1136
Connector/ODBC Examples
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 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
25.1.4.5.1.3. RDO: rs.addNew and rs.update The following RDO (Remote Data Objects) example creates a table my_rdo and demonstrates the use of rs.addNew and rs.update.
Dim Dim Dim Dim rs As rdoResultset cn As New rdoConnection cl As rdoColumn SQL As String
'cn.Connect = "DSN=test;" cn.Connect = "DRIVER={MySQL ODBC 3.51 Driver};"_ & "SERVER=localhost;"_ & " DATABASE=test;"_ & "UID=venu;PWD=venu; OPTION=3" cn.CursorDriver = rdUseOdbc cn.EstablishConnection rdDriverPrompt
'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
1137
Connector/ODBC Examples
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 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
1138
Connector/ODBC Examples
* * */
using Console = System.Console; using Microsoft.Data.Odbc; namespace myodbc3 { class mycon { static void Main(string[] args) { try { //Connection string for MyODBC 2.50 /*string MyConString = "DRIVER={MySQL};" + "SERVER=localhost;" + "DATABASE=test;" + "UID=venu;" + "PASSWORD=venu;" + "OPTION=3"; */ //Connection string for Connector/ODBC 3.51 string MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" + "SERVER=localhost;" + "DATABASE=test;" + "UID=venu;" + "PASSWORD=venu;" + "OPTION=3"; //Connect to MySQL using Connector/ODBC 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());
1139
Connector/ODBC Examples
//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) { //Supported only by Connector/ODBC 3.51 Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " + MyDataReader.GetString(1) + " " + MyDataReader.GetInt64(2)); } else { //BIGINTs not supported by Connector/ODBC Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " + MyDataReader.GetString(1) + " " + MyDataReader.GetInt32(2)); } } //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" + "SQL: " + MyOdbcException.Errors[i].SQLState + "\n"); } } } } }
25.1.4.5.2.2. Using Connector/ODBC with ODBC.NET and Visual Basic The following sample creates a table my_vb_net and demonstrates the use in VB.
' ' ' ' ' ' @sample @purpose @author : myvb.vb : Demo sample for ODBC.NET using Connector/ODBC : Venu, <myodbc@lists.mysql.com>
1140
Connector/ODBC Examples
' ' ' 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 'Connector/ODBC 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')" 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"
1141
Connector/ODBC Reference
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")) & " name = " & _ "NULL") Else Console.WriteLine("id = " & _ CStr(MyDataReader("id")) & " name = " & _ 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
1142
Connector/ODBC Reference
SQLAllocEnv SQLAllocConnect
Yes Yes
Yes Yes
Deprecated Obtains an environment handle allocated from driver. Deprecated Obtains a connection handle
Obtaining information about a driver and data source: Connector/ ODBC Function name SQLDataSources SQLDrivers SQLGetInfo SQLGetFunctions SQLGetTypeInfo 2.50 3.51 Standard No No Yes Yes Yes No No Yes Yes Yes ISO 92 ODBC ISO 92 ISO 92 ISO 92 Purpose Returns the list of available data sources, handled by the Driver Manager Returns the list of installed drivers and their attributes, handles by Driver Manager Returns information about a specific driver and data source. Returns supported driver functions. Returns information about supported data types.
Setting and retrieving driver attributes: Connector/ ODBC Function name SQLSetConnectAttr SQLGetConnectAttr 2.50 3.51 Standard No No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes ISO 92 ISO 92 Purpose Sets a connection attribute. Returns the value of a connection attribute.
SQLSetConnectOption Yes SQLGetConnectOption Yes SQLSetEnvAttr SQLGetEnvAttr SQLSetStmtAttr SQLGetStmtAttr SQLSetStmtOption SQLGetStmtOption Preparing SQL requests: No No No No Yes Yes
Deprecated Sets a connection option Deprecated Returns the value of a connection option ISO 92 ISO 92 ISO 92 ISO 92 Sets an environment attribute. Returns the value of an environment attribute. Sets a statement attribute. Returns the value of a statement attribute.
Deprecated Sets a statement option Deprecated Returns the value of a statement option
Connector/ ODBC Function name SQLAllocStmt SQLPrepare SQLBindParameter SQLGetCursorName SQLSetCursorName 2.50 3.51 Standard Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes ISO 92 ODBC ISO 92 ISO 92 ODBC Purpose Prepares an SQL statement for later execution. Assigns storage for a parameter in an SQL statement. Returns the cursor name associated with a statement handle. Specifies a cursor name. Sets options that control cursor behavior. Deprecated Allocates a statement handle
SQLSetScrollOptions Yes
1143
Connector/ODBC Reference
Submitting requests: Connector/ ODBC Function name SQLExecute SQLExecDirect SQLNativeSql SQLDescribeParam SQLNumParams SQLParamData 2.50 3.51 Standard Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes ISO 92 ISO 92 ODBC ODBC ISO 92 ISO 92 Purpose Executes a prepared statement. Executes a statement Returns the text of an SQL statement as translated by the driver. Returns the description for a specific parameter in a statement. Returns the number of parameters in a statement. Used in conjunction with SQLPutData to supply parameter data at execution time. (Useful for long data values.) Sends part or all of a data value for a parameter. (Useful for long data values.)
SQLPutData
Yes
Yes
ISO 92
Retrieving results and information about results: Connector/ ODBC Function name SQLRowCount SQLNumResultCols SQLDescribeCol SQLColAttribute SQLColAttributes SQLFetch SQLFetchScroll SQLExtendedFetch SQLSetPos 2.50 3.51 Standard Yes Yes Yes No Yes Yes No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes ISO 92 ISO 92 ISO 92 ISO 92 ISO 92 ISO 92 ODBC Purpose Returns the number of rows affected by an insert, update, or delete request. Returns the number of columns in the result set. Describes a column in the result set. Describes attributes of a column in the result set. Returns multiple result rows. Returns scrollable result rows. Positions a cursor within a fetched block of data and allows an application to refresh data in the rowset or to update or delete data in the result set. Performs bulk insertions and bulk bookmark operations, including update, delete, and fetch by bookmark.
SQLBulkOperations
No
Yes
ODBC
Retrieving error or diagnostic information: Connector/ ODBC Function name SQLError SQLGetDiagField SQLGetDiagRec 2.50 3.51 Standard Yes Yes Yes Yes Yes Yes ISO 92 ISO 92 Purpose Returns additional diagnostic information (a single field of the diagnostic data structure). Returns additional diagnostic information (multiple fields of the diagnostic data structure). Deprecated Returns additional error or status information
1144
Connector/ODBC Reference
Obtaining information about the data source's system tables (catalog functions) item: Connector/ ODBC Function name 2.50 3.51 Standard Yes Yes Yes Yes Yes ODBC X/Open ODBC ODBC X/Open Purpose Returns a list of columns and associated privileges for one or more tables. Returns the list of column names in specified tables. Returns a list of column names that make up foreign keys, if they exist for a specified table. Returns the list of column names that make up the primary key for a table. Returns information about the optimal set of columns that uniquely identifies a row in a specified table, or the columns that are automatically updated when any value in the row is updated by a transaction. Returns statistics about a single table and the list of indexes associated with the table. Returns a list of tables and the privileges associated with each table. Returns the list of table names stored in a specific data source. SQLColumnPrivileges Yes SQLColumns SQLForeignKeys SQLPrimaryKeys SQLSpecialColumns Yes Yes Yes Yes
Performing transactions: Connector/ ODBC Function name SQLTransact SQLEndTran Terminating a statement: Connector/ ODBC Function name SQLFreeStmt 2.50 3.51 Standard Yes Yes ISO 92 Purpose Ends statement processing, discards pending results, and, optionally, frees all resources associated with the statement handle. Closes a cursor that has been opened on a statement handle. Cancels an SQL statement. 2.50 3.51 Standard Yes No Yes Yes ISO 92 Purpose Commits or rolls back a transaction. Deprecated Commits or rolls back a transaction
SQLCloseCursor SQLCancel
Yes Yes
Yes Yes
ISO 92 ISO 92
Terminating a connection: Connector/ ODBC Function name SQLDisconnect 2.50 3.51 Standard Yes Yes ISO 92 Purpose Closes the connection.
1145
Connector/ODBC Reference
No Yes Yes
ISO 92
1146
Connector/ODBC Reference
1147
S1095 S1106 S1117 S1109 S1C00 21S01 23000 42000 42S02 42S12 42S21 42S22 08S01
HY095 HY106 HY117 HY109 HYC00 21S01 23000 42000 42S02 42S12 42S21 42S22 08S01
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
If you do not require the value within your application, but do require the value as part of another INSERT, the entire process can be handled by executing the following statements:
INSERT INTO tbl (auto,text) VALUES(NULL,'text'); INSERT INTO tbl2 (id,text) VALUES(LAST_INSERT_ID(),'text');
Certain ODBC applications (including Delphi and Access) may have trouble obtaining the autoincrement value using the previous examples. In this case, try the following statement as an alternative:
SELECT * FROM tbl WHERE auto IS NULL;
See Seccin 24.2.13.3, Cmo obtener el ID nico del ltimo registro insertado.
1148
On other platforms, you can enable the dynamic cursor by adding 32 to the OPTION value when creating the DSN.
1149
Use only DOUBLE float fields. Access fails when comparing with single-precision floats. The symptom usually is that new or updated rows may show up as #DELETED# or that you can't find or update rows. If you are using Connector/ODBC to link to a table that has a BIGINT column, the results are displayed as #DELETED#. The work around solution is: Have one more dummy column with TIMESTAMP as the data type. Select the Change BIGINT columns to INT option in the connection dialog in ODBC DSN Administrator. Delete the table link from Access and re-create it. Old records may still display as #DELETED#, but newly added/updated records are displayed properly. If you still get the error Another user has changed your data after adding a TIMESTAMP column, the following trick may help you: Don't use a table data sheet view. Instead, create a form with the fields you want, and use that form data sheet view. You should set the DefaultValue property for the TIMESTAMP column to NOW(). It may be a good idea to hide the TIMESTAMP column from view so your users are not confused. In some cases, Access may generate SQL statements that MySQL can't understand. You can fix this by selecting "Query|SQLSpecific|Pass-Through" from the Access menu. On Windows NT, Access reports BLOB columns as OLE OBJECTS. If you want to have MEMO columns instead, you should change BLOB columns to TEXT with ALTER TABLE. Access can't always handle the MySQL DATE column properly. If you have a problem with these, change the columns to DATETIME. If you have in Access a column defined as BYTE, Access tries to export this as TINYINT instead of TINYINT UNSIGNED. This gives you problems if you have values larger than 127 in the column. If you have very large (long) tables in Access, it might take a very long time to open them. Or you might run low on virtual memory and eventually get an ODBC Query Failed error and the table cannot open. To deal with this, select the following options: Return Matching Rows (2) Allow BIG Results (8). These add up to a value of 10 (OPTION=10). Some external articles and tips that may be useful when using Access, ODBC and Connector/ODBC: Read How to Trap ODBC Login Error Messages in Access Optimizing Access ODBC Applications Optimizing for Client/Server Performance Tips for Converting Applications to Using ODBCDirect Tips for Optimizing Queries on Attached SQL Tables For a list of tools that can be used with Access and ODBC data sources, refer to converters section for list of available tools. 25.1.6.2.1.2. Microsoft Excel and Column Types
1150
If you have problems importing data into Microsoft Excel, particularly numerical, date, and time values, this is probably because of a bug in Excel, where the column type of the source data is used to determine the data type when that data is inserted into a cell within the worksheet. The result is that Excel incorrectly identifies the content and this affects both the display format and the data when it is used within calculations. To address this issue, use the CONCAT() function in your queries. The use of CONCAT() forces Excel to treat the value as a string, which Excel will then parse and usually correctly identify the embedded information. However, even with this option, some data may be incorrectly formatted, even though the source data remains unchanged. Use the Format Cells option within Excel to change the format of the displayed information. 25.1.6.2.1.3. Microsoft Visual Basic To be able to update a table, you must define a primary key for the table. Visual Basic with ADO can't handle big integers. This means that some queries like SHOW PROCESSLIST do not work properly. The fix is to use OPTION=16384 in the ODBC connect string or to select the Change BIGINT columns to INT option in the Connector/ODBC connect screen. You may also want to select the Return matching rows option. 25.1.6.2.1.4. Microsoft Visual InterDev If you have a BIGINT in your result, you may get the error [Microsoft][ODBC Driver Manager] Driver does not support this parameter. Try selecting the Change BIGINT columns to INT option in the Connector/ODBC connect screen. 25.1.6.2.1.5. Visual Objects You should select the Don't optimize column widths option. 25.1.6.2.1.6. Microsoft ADO When you are coding with the ADO API and Connector/ODBC, you need to pay attention to some default properties that aren't supported by the MySQL server. For example, using the CursorLocation Property as adUseServer returns a result of 1 for the RecordCount Property. To have the right value, you need to set this property to adUseClient, as shown in the VB code here:
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
Another workaround is to use a SELECT COUNT(*) statement for a similar query to get the correct row count. To find the number of rows affected by a specific SQL statement in ADO, use the RecordsAffected property in the ADO execute method. For more information on the usage of execute method, refer to http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthcnnexecute.asp.
1151
For information, see ActiveX Data Objects(ADO) Frequently Asked Questions. 25.1.6.2.1.7. Using Connector/ODBC with Active Server Pages (ASP) You should select the Return matching rows option in the DSN. For more information about how to access MySQL via ASP using Connector/ODBC, refer to the following articles: Using MyODBC To Access Your MySQL Database Via ASP ASP and MySQL at DWAM.NT A Frequently Asked Questions list for ASP can be found at http://support.microsoft.com/default.aspx? scid=/Support/ActiveServer/faq/data/adofaq.asp. 25.1.6.2.1.8. Using Connector/ODBC with Visual Basic (ADO, DAO and RDO) and ASP Some articles that may help with Visual Basic and ASP: MySQL BLOB columns and Visual Basic 6 by Mike Hillyer (<mike@openwin.org>). How to map Visual basic data type to MySQL types by Mike Hillyer (<mike@openwin.org>).
1152
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);
25.1.6.2.2.3. Using Connector/ODBC with C++ Builder Tested with BDE 3.0. The only known problem is that when the table schema changes, query fields are not updated. BDE, however, does not seem to recognize primary keys, only the index named PRIMARY, although this has not been a problem.
1154
under an earlier version, please file a bug report. See Seccin 25.1.7.2, How to Report Connector/ ODBC Problems or Bugs. 25.1.6.3.2: I have installed Connector/ODBC on Windows XP x64 Edition or Windows Server 2003 R2 x64. The installation completed successfully, but the Connector/ODBC driver does not appear in ODBC Data Source Administrator. This is not a bug, but is related to the way Windows x64 editions operate with the ODBC driver. On Windows x64 editions, the Connector/ODBC driver is installed in the %SystemRoot%\SysWOW64 folder. However, the default ODBC Data Source Administrator that is available through the Administrative Tools or Control Panel in Windows x64 Editions is located in the %SystemRoot%\system32 folder, and only searches this folder for ODBC drivers. On Windowx x64 editions, you should use the ODBC administration tool located at %SystemRoot %\SysWOW64\odbcad32.exe, this will correctly locate the installed Connector/ODBC drivers and enable you to create a Connector/ODBC DSN. This issue was originally reported as Bug #20301. 25.1.6.3.3: When connecting or using the Test button in ODBC Data Source Administrator I get error 10061 (Cannot connect to server) This error can be raised by a number of different issues, including server problems, network problems, and firewall and port blocking problems. For more information, see Seccin A.2.2, Can't connect to [local] MySQL server. 25.1.6.3.4: The following error is reported when using transactions: Transactions are not enabled This error indicates that you are trying to use transactions with a MySQL table that does not support transactions. Transactions are supported within MySQL when using the InnoDB database engine. In versions of MySQL before Mysql 5.1 you may also use the BDB engine. You should check the following before continuing: Verify that your MySQL server supports a transactional database engine. Use SHOW ENGINES to obtain a list of the available engine types. Verify that the tables you are updating use a transaction database engine. Ensure that you have not enabled the disable transactions option in your DSN. 25.1.6.3.5: The following error is reported when I submit a query: Cursor not found This occurs because the application is using the old MyODBC 2.50 version, and it did not set the cursor name explicitly through SQLSetCursorName. The fix is to upgrade to Connector/ODBC 3.51 version. 25.1.6.3.6: Access reports records as #DELETED# when inserting or updating records in linked tables. If the inserted or updated records are shown as #DELETED# in the access, then: If you are using Access 2000, you should get and install the newest (version 2.6 or higher) Microsoft MDAC (Microsoft Data Access Components) from http://www.microsoft.com/data/. This fixes a bug in Access that when you export data to MySQL, the table and column names aren't specified. Another way to work around this bug is to upgrade to MyODBC 2.50.33 or higher and MySQL 3.23.x or higher, which together provide a workaround for the problem. You should also get and apply the Microsoft Jet 4.0 Service Pack 5 (SP5) which can be found at http://support.microsoft.com/default.aspx?scid=kb;EN-US;q239114. This fixes some cases where columns are marked as #DELETED# in Access.
1155
Note: If you are using MySQL 3.22, you must apply the MDAC patch and use MyODBC 2.50.32 or 2.50.34 and up to work around this problem. For all versions of Access, you should enable the Connector/ODBC Return matching rows option. For Access 2.0, you should additionally enable the Simulate ODBC 1.0 option. You should have a timestamp in all tables that you want to be able to update. You should have a primary key in the table. If not, new or updated rows may show up as #DELETED#. Use only DOUBLE float fields. Access fails when comparing with single-precision floats. The symptom usually is that new or updated rows may show up as #DELETED# or that you can't find or update rows. If you are using Connector/ODBC to link to a table that has a BIGINT column, the results are displayed as #DELETED. The work around solution is: Have one more dummy column with TIMESTAMP as the data type. Select the Change BIGINT columns to INT option in the connection dialog in ODBC DSN Administrator. Delete the table link from Access and re-create it. Old records still display as #DELETED#, but newly added/updated records are displayed properly. 25.1.6.3.7: How do I handle Write Conflicts or Row Location errors? If you see the following errors, select the Return Matching Rows option in the DSN configuration dialog, or specify OPTION=2, as the connection parameter:
Write Conflict. Another user has changed your data. Row cannot be located for updating. Some values may have been changed since it was last read.
25.1.6.3.8: Exporting data from Access 97 to MySQL reports a Syntax Error. This error is specific to Access 97 and versions of Connector/ODBC earlier than 3.51.02. Update to the latest version of the Connector/ODBC driver to resolve this problem. 25.1.6.3.9: Exporting data from Microsoft DTS to MySQL reports a Syntax Error. This error occurs only with MySQL tables using the TEXT or VARCHAR data types. You can fix this error by upgrading your Connector/ODBC driver to version 3.51.02 or higher. 25.1.6.3.10: Using ODBC.NET with Connector/ODBC, while fetching empty string (0 length), it starts giving the SQL_NO_DATA exception. You can get the patch that addresses this problem from http://support.microsoft.com/default.aspx? scid=kb;EN-US;q319243. 25.1.6.3.11: Using SELECT COUNT(*) FROM tbl_name within Visual Basic and ASP returns an error. This error occurs because the COUNT(*) expression is returning a BIGINT, and ADO can't make sense of a number this big. Select the Change BIGINT columns to INT option (option value 16384). 25.1.6.3.12: Using the AppendChunk() or GetChunk() ADO methods, the Multiple-step operation generated errors. Check each status value error is returned.
1156
Connector/ODBC Support
The GetChunk() and AppendChunk() methods from ADO doesn't work as expected when the cursor location is specified as adUseServer. On the other hand, you can overcome this error by using adUseClient. A simple example can be found from http://www.dwam.net/iishelp/ado/docs/adomth02_4.htm 25.1.6.3.13: Access Returns Another user had modified the record that you have modified while editing records on a Linked Table. In most cases, this can be solved by doing one of the following things: Add a primary key for the table if one doesn't exist. Add a timestamp column if one doesn't exist. Only use double-precision float fields. Some programs may fail when they compare single-precision floats. If these strategies don't help, you should start by making a log file from the ODBC manager (the log you get when requesting logs from ODBCADMIN) and a Connector/ODBC log to help you figure out why things go wrong. For instructions, see Seccin 25.1.3.8, Getting an ODBC Trace File. 25.1.6.3.14: When linking an application directly to the Connector/ODBC library under Unix/ Linux, the application crashes. Connector/ODBC 3.51 under Unix/Linux is not compatible with direct application linking. You must use a driver manager, such as iODBC or unixODBC to connect to an ODBC source. 25.1.6.3.15: Applications in the Microsoft Office suite are unable to update tables that have DATE or TIMESTAMP columns. This is a known issue with Connector/ODBC. You must ensure that the field has a default value (rather than NULL and that the default value is non-zeo (i.e. the default value is not 0000-00-00 00:00:00).
1157
Connector/ODBC Support
Check the Connector/ODBC trace file to find out what could be wrong. You should be able to determine what statements were issued by searching for the string >mysql_real_query in the myodbc.log file. You should also try issuing the statements from the mysql client program or from admndemo. This helps you determine whether the error is in Connector/ODBC or MySQL. If you find out something is wrong, please only send the relevant rows (maximum 40 rows) to the myodbc mailing list. See Seccin 1.6.1.1, Las listas de correo de MySQL. Please never send the whole Connector/ODBC or ODBC log file! You should ideally include the following information with the email: Operating system and version Connector/ODBC version ODBC Driver Manager type and version MySQL server version ODBC trace from Driver Manager Connector/ODBC log file from Connector/ODBC driver Simple reproducible sample Remember that the more information you can supply to us, the more likely it is that we can fix the problem! Also, before posting the bug, check the MyODBC mailing list archive at http://lists.mysql.com/myodbc. If you are unable to find out what's wrong, the last option is to create an archive in tar or Zip format that contains a Connector/ODBC trace file, the ODBC log file, and a README file that explains the problem. You can send this to ftp://ftp.mysql.com/pub/mysql/upload/. Only MySQL engineers have access to the files you upload, and we are very discreet with the data. If you can create a program that also demonstrates the problem, please include it in the archive as well. If the program works with another SQL server, you should include an ODBC log file where you perform exactly the same SQL statements so that we can compare the results between the two systems. Remember that the more information you can supply to us, the more likely it is that we can fix the problem.
25.1.7.5. Credits
These are the developers that have worked on the Connector/ODBC and Connector/ODBC 3.51 Drivers from MySQL AB. Michael (Monty) Widenius
1158
MySQL Connector/NET
1159
Connector/NET Installation
2. You must choose the type of installation that you want to perform.
1160
Connector/NET Installation
For most situations, the Typical installation will be suitable. Click the Typical button and proceed to Step 5. A Complete installation installs all the available files. To conduct a Complete installation, click the Complete button and proceed to step 5. If you want to customize your installation, including choosing the components to install and some installation options, click the Custom button and proceed to Step 3. The Connector/NET installer will register the connector within the Global Assembly Cache (GAC) this will make the Connector/NET component available to all applications, not just those where you explicitly reference the Connector/NET component. The installer will also create the necessary links in the Start menu to the documentation and release notes. 3. If you have chosen a custom installation, you can select the individual components that you want to install, including the core interface component, supporting documentation (a CHM file) samples and examples and the source code. Select the items, and their installation level, and then click Next to continue the installation. Nota For Connector/NET 1.0.8 or lower and Connector 5.0.4 and lower the installer will attempt to install binaries for both 1.x and 2.x of the .NET Framework. If you only have one version of the framework installed, the connector installation may fail. If this happens, you can choose the framework version to be installed through the custom installation step.
1161
Connector/NET Installation
4. You will be given a final opportunity to confirm the installation. Click Install to copy and install the files onto your machine.
1162
Connector/NET Installation
5. Once the installation has been completed, click Finish to exit the installer. Unless you choose otherwise, Connector/NET is installed in C:\Program Files\MySQL\MySQL Connector Net X.X.X, where X.X.X is replaced with the version of Connector/NET you are installing. New installations do not overwrite existing versions of Connector/NET. Depending on your installation type, the installed components will include some or all of the following components: bin - Connector/NET MySQL libraries for different versions of the .NET environment. docs - contains a CHM of the Connector/NET documentation. samples - sample code and applications that use the Connector/NET component. src - the source code for the Connector/NET component. You may also use the /quiet or /q command line option with the msiexec tool to install the Connector/NET package automatically (using the default options) with no notification to the user. Using this option you cannot select options and no prompts, messages or dialog boxes will be displayed.
C:\> msiexec /package conector-net.msi /quiet
To provide a progress bar to the user during automatic installation, but still without presenting the user with a dialog box of the ability to select options, use the /passive option.
1163
Connector/NET Installation
Once installed, applications that are compiled with the Connector/NET component need no further changes. However, you must ensure that when you compile your applications you include the Connector/NET component using the -r:MySqlData.dll command line option.
1164
Connector/NET Examples
A Visual Studio project is included in the source which you can use to build Connector/NET.
25.2.3.1. MySqlCommand
Represents a SQL statement to execute against a MySQL database. This class cannot be inherited. MySqlCommand features the following methods for executing commands at a MySQL database: Item ExecuteReader ExecuteNonQuery ExecuteScalar Description Executes commands that return rows. Executes commands such as SQL INSERT, DELETE, and UPDATE statements. Retrieves a single value (for example, an aggregate value) from a database.
You can reset the CommandText property and reuse the MySqlCommand object. However, you must close the MySqlDataReader before you can execute a new or previous command. If a MySqlException is generated by the method executing a MySqlCommand, the MySqlConnection remains open. It is the responsibility of the programmer to close the connection. Note. Prior versions of the provider used the '@' symbol to mark parameters in SQL. This is incompatible with MySQL user variables, so the provider now uses the '?' symbol to locate parameters in SQL. To support older code, you can set 'old syntax=yes' on your connection string. If you do this, please be aware that an exception will not be throw if you fail to define a parameter that you intended to use in your SQL. Examples The following example creates a MySqlCommand and a MySqlConnection. The MySqlConnection is opened and set as the Connection for the MySqlCommand. The example then calls
1165
Connector/NET Examples
ExecuteNonQuery, and closes the connection. To accomplish this, the ExecuteNonQuery is passed a connection string and a query string that is a SQL INSERT statement. Visual Basic example:
Public Sub InsertRow(myConnectionString As String) " If the connection string is null, use a default. If myConnectionString = "" Then myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass" End If Dim myConnection As New MySqlConnection(myConnectionString) Dim myInsertQuery As String = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)" Dim myCommand As New MySqlCommand(myInsertQuery) myCommand.Connection = myConnection myConnection.Open() myCommand.ExecuteNonQuery() myCommand.Connection.Close() End Sub
C# example:
public void InsertRow(string myConnectionString) { // If the connection string is null, use a default. if(myConnectionString == "") { myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass"; } MySqlConnection myConnection = new MySqlConnection(myConnectionString); string myInsertQuery = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)"; MySqlCommand myCommand = new MySqlCommand(myInsertQuery); myCommand.Connection = myConnection; myConnection.Open(); myCommand.ExecuteNonQuery(); myCommand.Connection.Close(); }
C# example:
public void CreateMySqlCommand()
1166
Connector/NET Examples
{ MySqlConnection myConnection = new MySqlConnection("Persist Security Info=False; database=test;server=myServer"); myConnection.Open(); MySqlTransaction myTrans = myConnection.BeginTransaction(); string mySelectQuery = "SELECT * FROM myTable"; MySqlCommand myCommand = new MySqlCommand(mySelectQuery, myConnection,myTrans); myCommand.CommandTimeout = 20; }
C++ example:
public: void CreateMySqlCommand() { MySqlConnection* myConnection = new MySqlConnection(S"Persist Security Info=False; database=test;server=myServer"); myConnection->Open(); MySqlTransaction* myTrans = myConnection->BeginTransaction(); String* mySelectQuery = S"SELECT * FROM myTable"; MySqlCommand* myCommand = new MySqlCommand(mySelectQuery, myConnection, myTrans); myCommand->CommandTimeout = 20; };
Initializes a new instance of the MySqlCommand class. The base constructor initializes all fields to their default values. The following table shows initial property values for an instance of MySqlCommand. Properties CommandText CommandTimeout CommandType Connection Initial Value empty string ("") 0 CommandType.Text Null
You can change the value for any of these properties through a separate call to the property. Examples The following example creates a MySqlCommand and sets some of its properties. Visual Basic example:
Public Sub CreateMySqlCommand() Dim myCommand As New MySqlCommand() myCommand.CommandType = CommandType.Text End Sub
C# example:
public void CreateMySqlCommand() { MySqlCommand myCommand = new MySqlCommand(); myCommand.CommandType = CommandType.Text; }
1167
Connector/NET Examples
When an instance of MySqlCommand is created, the following read/write properties are set to initial values. Properties CommandText CommandTimeout CommandType Connection Initial Value cmdText 0 CommandType.Text Null
You can change the value for any of these properties through a separate call to the property. Examples The following example creates a MySqlCommand and sets some of its properties. Visual Basic example:
Public Sub CreateMySqlCommand() Dim sql as String = "SELECT * FROM mytable" Dim myCommand As New MySqlCommand(sql) myCommand.CommandType = CommandType.Text End Sub
C# example:
public void CreateMySqlCommand() { string sql = "SELECT * FROM mytable"; MySqlCommand myCommand = new MySqlCommand(sql); myCommand.CommandType = CommandType.Text; }
You can change the value for any of these properties through a separate call to the property. Examples The following example creates a MySqlCommand and sets some of its properties. Visual Basic example:
Public Sub CreateMySqlCommand()
1168
Connector/NET Examples
Dim conn as new MySqlConnection("server=myServer") Dim sql as String = "SELECT * FROM mytable" Dim myCommand As New MySqlCommand(sql, conn) myCommand.CommandType = CommandType.Text End Sub
C# example:
public void CreateMySqlCommand() { MySqlConnection conn = new MySqlConnection("server=myserver") string sql = "SELECT * FROM mytable"; MySqlCommand myCommand = new MySqlCommand(sql, conn); myCommand.CommandType = CommandType.Text; }
You can change the value for any of these properties through a separate call to the property. Examples The following example creates a MySqlCommand and sets some of its properties. Visual Basic example:
Public Sub CreateMySqlCommand() Dim conn as new MySqlConnection("server=myServer") conn.Open(); Dim txn as MySqlTransaction = conn.BeginTransaction() Dim sql as String = "SELECT * FROM mytable" Dim myCommand As New MySqlCommand(sql, conn, txn) myCommand.CommandType = CommandType.Text End Sub
C# example:
public void CreateMySqlCommand() { MySqlConnection conn = new MySqlConnection("server=myserver") conn.Open(); MySqlTransaction txn = conn.BeginTransaction(); string sql = "SELECT * FROM mytable"; MySqlCommand myCommand = new MySqlCommand(sql, conn, txn); myCommand.CommandType = CommandType.Text;
1169
Connector/NET Examples
25.2.3.1.5. ExecuteNonQuery
Executes a SQL statement against the connection and returns the number of rows affected. Returns: Number of rows affected You can use ExecuteNonQuery to perform any type of database operation, however any resultsets returned will not be available. Any output parameters used in calling a stored procedure will be populated with data and can be retrieved after execution is complete. For UPDATE, INSERT, and DELETE statements, the return value is the number of rows affected by the command. For all other types of statements, the return value is -1. Examples The following example creates a MySqlCommand and then executes it using ExecuteNonQuery. The example is passed a string that is a SQL statement (such as UPDATE, INSERT, or DELETE) and a string to use to connect to the data source. Visual Basic example:
Public Sub CreateMySqlCommand(myExecuteQuery As String, myConnection As MySqlConnection) Dim myCommand As New MySqlCommand(myExecuteQuery, myConnection) myCommand.Connection.Open() myCommand.ExecuteNonQuery() myConnection.Close() End Sub
C# example:
public void CreateMySqlCommand(string myExecuteQuery, MySqlConnection myConnection) { MySqlCommand myCommand = new MySqlCommand(myExecuteQuery, myConnection); myCommand.Connection.Open(); myCommand.ExecuteNonQuery(); myConnection.Close(); }
25.2.3.1.6. ExecuteReader1
Sends the CommandText to the MySqlConnectionConnection, and builds a MySqlDataReader using one of the CommandBehavior values. Parameters: One of the CommandBehavior values. When the CommandType property is set to StoredProcedure, the CommandText property should be set to the name of the stored procedure. The command executes this stored procedure when you call ExecuteReader. The MySqlDataReader supports a special mode that enables large binary values to be read efficiently. For more information, see the SequentialAccess setting for CommandBehavior. While the MySqlDataReader is in use, the associated MySqlConnection is busy serving the MySqlDataReader. While in this state, no other operations can be performed on the MySqlConnection other than closing it. This is the case until the MySqlDataReader.Close method of the MySqlDataReader is called. If the MySqlDataReader is created with CommandBehavior set to CloseConnection, closing the MySqlDataReader closes the connection automatically. Note. When calling ExecuteReader with the SingleRow behavior, you should be aware that using a limit clause in your SQL will cause all rows (up to the limit given) to be retrieved by the client. The MySqlDataReader.Read method will still return false after the first row but pulling all rows of
1170
Connector/NET Examples
data into the client will have a performance impact. If the limit clause is not necessary, it should be avoided. Returns: A MySqlDataReader object.
25.2.3.1.7. ExecuteReader
Sends the CommandText to the MySqlConnectionConnection and builds a MySqlDataReader. Returns: A MySqlDataReader object. When the CommandType property is set to StoredProcedure, the CommandText property should be set to the name of the stored procedure. The command executes this stored procedure when you call ExecuteReader. While the MySqlDataReader is in use, the associated MySqlConnection is busy serving the MySqlDataReader. While in this state, no other operations can be performed on the MySqlConnection other than closing it. This is the case until the MySqlDataReader.Close method of the MySqlDataReader is called. Examples The following example creates a MySqlCommand, then executes it by passing a string that is a SQL SELECT statement, and a string to use to connect to the data source. Visual Basic example:
Public Sub CreateMySqlDataReader(mySelectQuery As String, myConnection As MySqlConnection) Dim myCommand As New MySqlCommand(mySelectQuery, myConnection) myConnection.Open() Dim myReader As MySqlDataReader myReader = myCommand.ExecuteReader() Try While myReader.Read() Console.WriteLine(myReader.GetString(0)) End While Finally myReader.Close myConnection.Close End Try End Sub
C# example:
public void CreateMySqlDataReader(string mySelectQuery, MySqlConnection myConnection) { MySqlCommand myCommand = new MySqlCommand(mySelectQuery, myConnection); myConnection.Open(); MySqlDataReader myReader; myReader = myCommand.ExecuteReader(); try { while(myReader.Read()) { Console.WriteLine(myReader.GetString(0)); } } finally { myReader.Close(); myConnection.Close(); } }
25.2.3.1.8. Prepare
Creates a prepared version of the command on an instance of MySQL Server.
1171
Connector/NET Examples
Prepared statements are only supported on MySQL version 4.1 and higher. Calling prepare while connected to earlier versions of MySQL will succeed but will execute the statement in the same way as unprepared. Examples The following example demonstrates the use of the Prepare method. Visual Basic example:
public sub PrepareExample() Dim cmd as New MySqlCommand("INSERT INTO mytable VALUES (?val)", myConnection) cmd.Parameters.Add( "?val", 10 ) cmd.Prepare() cmd.ExecuteNonQuery() cmd.Parameters(0).Value = 20 cmd.ExecuteNonQuery() end sub
C# example:
private void PrepareExample() { MySqlCommand cmd = new MySqlCommand("INSERT INTO mytable VALUES (?val)", myConnection); cmd.Parameters.Add( "?val", 10 ); cmd.Prepare(); cmd.ExecuteNonQuery(); cmd.Parameters[0].Value = 20; cmd.ExecuteNonQuery(); }
25.2.3.1.9. ExecuteScalar
Executes the query, and returns the first column of the first row in the result set returned by the query. Extra columns or rows are ignored. Returns: The first column of the first row in the result set, or a null reference if the result set is empty Use the ExecuteScalar method to retrieve a single value (for example, an aggregate value) from a database. This requires less code than using the ExecuteReader method, and then performing the operations necessary to generate the single value using the data returned by a MySqlDataReader A typical ExecuteScalar query can be formatted as in the following C# example: C# example:
cmd.CommandText = "select count(*) from region"; Int32 count = (int32) cmd.ExecuteScalar();
Examples The following example creates a MySqlCommand and then executes it using ExecuteScalar. The example is passed a string that is a SQL statement that returns an aggregate result, and a string to use to connect to the data source. Visual Basic example:
Public Sub CreateMySqlCommand(myScalarQuery As String, myConnection As MySqlConnection) Dim myCommand As New MySqlCommand(myScalarQuery, myConnection) myCommand.Connection.Open()
1172
Connector/NET Examples
C# example:
public void CreateMySqlCommand(string myScalarQuery, MySqlConnection myConnection) { MySqlCommand myCommand = new MySqlCommand(myScalarQuery, myConnection); myCommand.Connection.Open(); myCommand.ExecuteScalar(); myConnection.Close(); }
C++ example:
public: void CreateMySqlCommand(String* myScalarQuery, MySqlConnection* myConnection) { MySqlCommand* myCommand = new MySqlCommand(myScalarQuery, myConnection); myCommand->Connection->Open(); myCommand->ExecuteScalar(); myConnection->Close(); }
25.2.3.1.10. CommandText
Gets or sets the SQL statement to execute at the data source. Value: The SQL statement or stored procedure to execute. The default is an empty string. When the CommandType property is set to StoredProcedure, the CommandText property should be set to the name of the stored procedure. The user may be required to use escape character syntax if the stored procedure name contains any special characters. The command executes this stored procedure when you call one of the Execute methods. Examples The following example creates a MySqlCommand and sets some of its properties. Visual Basic example:
Public Sub CreateMySqlCommand() Dim myCommand As New MySqlCommand() myCommand.CommandText = "SELECT * FROM Mytable ORDER BY id" myCommand.CommandType = CommandType.Text End Sub
C# example:
public void CreateMySqlCommand() { MySqlCommand myCommand = new MySqlCommand(); myCommand.CommandText = "SELECT * FROM mytable ORDER BY id"; myCommand.CommandType = CommandType.Text; }
25.2.3.1.11. CommandTimeout
Gets or sets the wait time before terminating the attempt to execute a command and generating an error. Value: The time (in seconds) to wait for the command to execute. The default is 0 seconds. MySQL currently does not support any method of canceling a pending or executing operation. All commands issues against a MySQL server will execute until completion or exception occurs.
1173
Connector/NET Examples
25.2.3.1.12. CommandType
Gets or sets a value indicating how the CommandText property is to be interpreted. Value: One of the System.Data.CommandType values. The default is Text. When you set the CommandType property to StoredProcedure, you should set the CommandText property to the name of the stored procedure. The command executes this stored procedure when you call one of the Execute methods. Examples The following example creates a MySqlCommand and sets some of its properties. Visual Basic example:
Public Sub CreateMySqlCommand() Dim myCommand As New MySqlCommand() myCommand.CommandType = CommandType.Text End Sub
C# example:
public void CreateMySqlCommand() { MySqlCommand myCommand = new MySqlCommand(); myCommand.CommandType = CommandType.Text; }
25.2.3.1.13. Connection
Gets or sets the MySqlConnection used by this instance of the MySqlCommand. Value: The connection to a data source. The default value is a null reference (Nothing in Visual Basic). If you set Connection while a transaction is in progress and the Transaction property is not null, an InvalidOperationException is generated. If the Transaction property is not null and the transaction has already been committed or rolled back, Transaction is set to null. Examples The following example creates a MySqlCommand and sets some of its properties. Visual Basic example:
Public Sub CreateMySqlCommand() Dim mySelectQuery As String = "SELECT * FROM mytable ORDER BY id" Dim myConnectString As String = "Persist Security Info=False;database=test;server=myServer" Dim myCommand As New MySqlCommand(mySelectQuery) myCommand.Connection = New MySqlConnection(myConnectString) myCommand.CommandType = CommandType.Text End Sub
C# example:
public void CreateMySqlCommand() { string mySelectQuery = "SELECT * FROM mytable ORDER BY id"; string myConnectString = "Persist Security Info=False;database=test;server=myServer"; MySqlCommand myCommand = new MySqlCommand(mySelectQuery); myCommand.Connection = new MySqlConnection(myConnectString); myCommand.CommandType = CommandType.Text; }
1174
Connector/NET Examples
25.2.3.1.14. IsPrepared
Returns true if the statement is prepared.
25.2.3.1.15. Parameters
Get the MySqlParameterCollection Value: The parameters of the SQL statement or stored procedure. The default is an empty collection. Connector/Net does not support unnamed parameters. Every parameter added to the collection must have an associated name. Examples The following example creates a MySqlCommand and displays its parameters. To accomplish this, the method is passed a MySqlConnection, a query string that is a SQL SELECT statement, and an array of MySqlParameter objects. Visual Basic example:
Public Sub CreateMySqlCommand(myConnection As MySqlConnection, _ mySelectQuery As String, myParamArray() As MySqlParameter) Dim myCommand As New MySqlCommand(mySelectQuery, myConnection) myCommand.CommandText = "SELECT id, name FROM mytable WHERE age=?age" myCommand.UpdatedRowSource = UpdateRowSource.Both myCommand.Parameters.Add(myParamArray) Dim j As Integer For j = 0 To myCommand.Parameters.Count - 1 myCommand.Parameters.Add(myParamArray(j)) Next j Dim myMessage As String = "" Dim i As Integer For i = 0 To myCommand.Parameters.Count - 1 myMessage += myCommand.Parameters(i).ToString() & ControlChars.Cr Next i Console.WriteLine(myMessage) End Sub
C# example:
public void CreateMySqlCommand(MySqlConnection myConnection, string mySelectQuery, MySqlParameter[] myParamArray) { MySqlCommand myCommand = new MySqlCommand(mySelectQuery, myConnection); myCommand.CommandText = "SELECT id, name FROM mytable WHERE age=?age"; myCommand.Parameters.Add(myParamArray); for (int j=0; j<myParamArray.Length; j++) { myCommand.Parameters.Add(myParamArray[j]) ; } string myMessage = ""; for (int i = 0; i < myCommand.Parameters.Count; i++) { myMessage += myCommand.Parameters[i].ToString() + "\n"; } MessageBox.Show(myMessage); }
25.2.3.1.16. Transaction
Gets or sets the MySqlTransaction within which the MySqlCommand executes. Value: The MySqlTransaction. The default value is a null reference (Nothing in Visual Basic).
1175
Connector/NET Examples
You cannot set the Transaction property if it is already set to a specific value, and the command is in the process of executing. If you set the transaction property to a MySqlTransaction object that is not connected to the same MySqlConnection as the MySqlCommand object, an exception will be thrown the next time you attempt to execute a statement.
25.2.3.1.17. UpdatedRowSource
Gets or sets how command results are applied to the DataRow when used by the System.Data.Common.DbDataAdapter.Update method of the System.Data.Common.DbDataAdapter. Value: One of the UpdateRowSource values. The default System.Data.UpdateRowSource value is Both unless the command is automatically generated (as in the case of the MySqlCommandBuilder), in which case the default is None.
25.2.3.2. MySqlCommandBuilder
Automatically generates single-table commands used to reconcile changes made to a DataSet with the associated MySQL database. This class cannot be inherited. The MySqlDataAdapter does not automatically generate the SQL statements required to reconcile changes made to a System.Data.DataSetDataSet with the associated instance of MySQL. However, you can create a MySqlCommandBuilder object to automatically generate SQL statements for single-table updates if you set the MySqlDataAdapter.SelectCommandSelectCommand property of the MySqlDataAdapter. Then, any additional SQL statements that you do not set are generated by the MySqlCommandBuilder. The MySqlCommandBuilder registers itself as a listener for MySqlDataAdapter.OnRowUpdatingRowUpdating events whenever you set the DataAdapter property. You can only associate one MySqlDataAdapter or MySqlCommandBuilder object with each other at one time. To generate INSERT, UPDATE, or DELETE statements, the MySqlCommandBuilder uses the SelectCommand property to retrieve a required set of metadata automatically. If you change the SelectCommand after the metadata has is retrieved (for example, after the first update), you should call the RefreshSchema method to update the metadata. The SelectCommand must also return at least one primary key or unique column. If none are present, an InvalidOperation exception is generated, and the commands are not generated. The MySqlCommandBuilder also uses the MySqlCommand.ConnectionConnection, MySqlCommand.CommandTimeoutCommandTimeout, and MySqlCommand.TransactionTransaction properties referenced by the SelectCommand. The user should call RefreshSchema if any of these properties are modified, or if the SelectCommand itself is replaced. Otherwise the MySqlDataAdapter.InsertCommandInsertCommand, MySqlDataAdapter.UpdateCommandUpdateCommand, and MySqlDataAdapter.DeleteCommandDeleteCommand properties retain their previous values. If you call Dispose, the MySqlCommandBuilder is disassociated from the MySqlDataAdapter, and the generated commands are no longer used. Note. Caution must be used when using MySqlCOmmandBuilder on MySql 4.0 systems. With MySql 4.0, database/schema information is not provided to the connector for a query. This means that a query that pulls columns from two identically named tables in two or more different databases will not cause an exception to be thrown but will not work correctly. Even more dangerous is the situation where your select statement references database X but is executed in database Y and both databases have tables with similar layouts. This situation can cause unwanted changes or deletes. This note does not apply to MySQL versions 4.1 and later.
1176
Connector/NET Examples
Examples The following example uses the MySqlCommand, along MySqlDataAdapter and MySqlConnection, to select rows from a data source. The example is passed an initialized System.Data.DataSet, a connection string, a query string that is a SQL SELECT statement, and a string that is the name of the database table. The example then creates a MySqlCommandBuilder. Visual Basic example:
Public Shared Function SelectRows(myConnection As String, mySelectQuery As String, myTableName As Str Dim myConn As New MySqlConnection(myConnection) Dim myDataAdapter As New MySqlDataAdapter() myDataAdapter.SelectCommand = New MySqlCommand(mySelectQuery, myConn) Dim cb As SqlCommandBuilder = New MySqlCommandBuilder(myDataAdapter) myConn.Open() Dim ds As DataSet = New DataSet myDataAdapter.Fill(ds, myTableName) ' Code to modify data in DataSet here ' Without the MySqlCommandBuilder this line would fail. myDataAdapter.Update(ds, myTableName) myConn.Close() End Function 'SelectRows
C# example:
public static DataSet SelectRows(string myConnection, string mySelectQuery, string myTableName) { MySqlConnection myConn = new MySqlConnection(myConnection); MySqlDataAdapter myDataAdapter = new MySqlDataAdapter(); myDataAdapter.SelectCommand = new MySqlCommand(mySelectQuery, myConn); MySqlCommandBuilder cb = new MySqlCommandBuilder(myDataAdapter); myConn.Open(); DataSet ds = new DataSet(); myDataAdapter.Fill(ds, myTableName); //code to modify data in DataSet here //Without the MySqlCommandBuilder this line would fail myDataAdapter.Update(ds, myTableName); myConn.Close(); return ds; }
1177
Connector/NET Examples
The MySqlCommandBuilder registers itself as a listener for MySqlDataAdapter.RowUpdating events that are generated by the MySqlDataAdapter specified in this property. When you create a new instance MySqlCommandBuilder, any existing MySqlCommandBuilder associated with this MySqlDataAdapter is released.
25.2.3.2.5. DataAdapter
Gets or sets a MySqlDataAdapter object for which SQL statements are automatically generated. Value: A MySqlDataAdapter object. The MySqlCommandBuilder registers itself as a listener for MySqlDataAdapter.RowUpdating events that are generated by the MySqlDataAdapter specified in this property. When you create a new instance MySqlCommandBuilder, any existing MySqlCommandBuilder associated with this MySqlDataAdapter is released.
25.2.3.2.6. QuotePrefix
Gets or sets the beginning character or characters to use when specifying MySQL database objects (for example, tables or columns) whose names contain characters such as spaces or reserved tokens. Value: The beginning character or characters to use. The default value is `. Database objects in MySQL can contain special characters such as spaces that would make normal SQL strings impossible to correctly parse. Use of the QuotePrefix and the QuoteSuffix properties allows the MySqlCommandBuilder to build SQL commands that handle this situation.
25.2.3.2.7. QuoteSuffix
Gets or sets the beginning character or characters to use when specifying MySQL database objects (for example, tables or columns) whose names contain characters such as spaces or reserved tokens. Value: The beginning character or characters to use. The default value is `. Database objects in MySQL can contain special characters such as spaces that would make normal SQL strings impossible to correctly parse. Use of the QuotePrefix and the QuoteSuffix properties allows the MySqlCommandBuilder to build SQL commands that handle this situation.
1178
Connector/NET Examples
25.2.3.2.8. DeriveParameters
25.2.3.2.9. GetDeleteCommand
Gets the automatically generated MySqlCommand object required to perform deletions on the database. Returns: The MySqlCommand object generated to handle delete operations. An application can use the GetDeleteCommand method for informational or troubleshooting purposes because it returns the MySqlCommand object to be executed. You can also use GetDeleteCommand as the basis of a modified command. For example, you might call GetDeleteCommand and modify the MySqlCommand.CommandTimeout value, and then explicitly set that on the MySqlDataAdapter. After the SQL statement is first generated, the application must explicitly call RefreshSchema if it changes the statement in any way. Otherwise, the GetDeleteCommand will be still be using information from the previous statement, which might not be correct. The SQL statements are first generated either when the application calls System.Data.Common.DataAdapter.Update or GetDeleteCommand.
25.2.3.2.10. GetInsertCommand
Gets the automatically generated MySqlCommand object required to perform insertions on the database. Returns: The MySqlCommand object generated to handle insert operations. An application can use the GetInsertCommand method for informational or troubleshooting purposes because it returns the MySqlCommand object to be executed. You can also use the GetInsertCommand as the basis of a modified command. For example, you might call GetInsertCommand and modify the MySqlCommand.CommandTimeout value, and then explicitly set that on the MySqlDataAdapter. After the SQL statement is first generated, the application must explicitly call RefreshSchema if it changes the statement in any way. Otherwise, the GetInsertCommand will be still be using information from the previous statement, which might not be correct. The SQL statements are first generated either when the application calls System.Data.Common.DataAdapter.Update or GetInsertCommand.
25.2.3.2.11. GetUpdateCommand
Gets the automatically generated MySqlCommand object required to perform updates on the database. Returns: The MySqlCommand object generated to handle update operations. An application can use the GetUpdateCommand method for informational or troubleshooting purposes because it returns the MySqlCommand object to be executed. You can also use GetUpdateCommand as the basis of a modified command. For example, you might call GetUpdateCommand and modify the MySqlCommand.CommandTimeout value, and then explicitly set that on the MySqlDataAdapter. After the SQL statement is first generated, the application must explicitly call RefreshSchema if it changes the statement in any way. Otherwise, the GetUpdateCommand will be still be using
1179
Connector/NET Examples
information from the previous statement, which might not be correct. The SQL statements are first generated either when the application calls System.Data.Common.DataAdapter.Update or GetUpdateCommand.
25.2.3.2.12. RefreshSchema
Refreshes the database schema information used to generate INSERT, UPDATE, or DELETE statements. An application should call RefreshSchema whenever the SELECT statement associated with the MySqlCommandBuilder changes. An application should call RefreshSchema whenever the MySqlDataAdapter.SelectCommand value of the MySqlDataAdapter changes.
25.2.3.3. MySqlConnection
Represents an open connection to a MySQL Server database. This class cannot be inherited. A MySqlConnection object represents a session to a MySQL Server data source. When you create an instance of MySqlConnection, all properties are set to their initial values. For a list of these values, see the MySqlConnection constructor. If the MySqlConnection goes out of scope, it is not closed. Therefore, you must explicitly close the connection by calling MySqlConnection.Close or MySqlConnection.Dispose. Examples The following example creates a MySqlCommand and a MySqlConnection. The MySqlConnection is opened and set as the MySqlCommand.Connection for the MySqlCommand. The example then calls MySqlCommand.ExecuteNonQuery, and closes the connection. To accomplish this, the ExecuteNonQuery is passed a connection string and a query string that is a SQL INSERT statement. Visual Basic example:
Public Sub InsertRow(myConnectionString As String) ' If the connection string is null, use a default. If myConnectionString = "" Then myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass" End If Dim myConnection As New MySqlConnection(myConnectionString) Dim myInsertQuery As String = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)" Dim myCommand As New MySqlCommand(myInsertQuery) myCommand.Connection = myConnection myConnection.Open() myCommand.ExecuteNonQuery() myCommand.Connection.Close() End Sub
C# example:
public void InsertRow(string myConnectionString) { // If the connection string is null, use a default. if(myConnectionString == "") { myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass"; } MySqlConnection myConnection = new MySqlConnection(myConnectionString); string myInsertQuery = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)"; MySqlCommand myCommand = new MySqlCommand(myInsertQuery); myCommand.Connection = myConnection; myConnection.Open(); myCommand.ExecuteNonQuery();
1180
Connector/NET Examples
myCommand.Connection.Close(); }
You can change the value for these properties only by using the ConnectionString property. Examples Overload methods for MySqlConnection Initializes a new instance of the MySqlConnection class.
You can change the value for these properties only by using the ConnectionString property. Examples Parameters: The connection properties used to open the MySQL database.
25.2.3.3.3. Open
Opens a database connection with the property settings specified by the ConnectionString. Exception: Cannot open a connection without specifying a data source or server.
1181
Connector/NET Examples
Exception: A connection-level error occurred while opening the connection. The MySqlConnection draws an open connection from the connection pool if one is available. Otherwise, it establishes a new connection to an instance of MySQL. Examples The following example creates a MySqlConnection, opens it, displays some of its properties, then closes the connection. Visual Basic example:
Public Sub CreateMySqlConnection(myConnString As String) Dim myConnection As New MySqlConnection(myConnString) myConnection.Open() MessageBox.Show("ServerVersion: " + myConnection.ServerVersion _ + ControlChars.Cr + "State: " + myConnection.State.ToString()) myConnection.Close() End Sub
C# example:
public void CreateMySqlConnection(string myConnString) { MySqlConnection myConnection = new MySqlConnection(myConnString); myConnection.Open(); MessageBox.Show("ServerVersion: " + myConnection.ServerVersion + "\nState: " + myConnection.State.ToString()); myConnection.Close(); }
25.2.3.3.4. Database
Gets the name of the current database or the database to be used after a connection is opened. Returns: The name of the current database or the name of the database to be used after a connection is opened. The default value is an empty string. The Database property does not update dynamically. If you change the current database using a SQL statement, then this property may reflect the wrong value. If you change the current database using the ChangeDatabase method, this property is updated to reflect the new database. Examples The following example creates a MySqlConnection and displays some of its read-only properties. Visual Basic example:
Public Sub CreateMySqlConnection() Dim myConnString As String = _ "Persist Security Info=False;database=test;server=localhost;user id=joeuser;pwd=pass" Dim myConnection As New MySqlConnection( myConnString ) myConnection.Open() MessageBox.Show( "Server Version: " + myConnection.ServerVersion _ + ControlChars.NewLine + "Database: " + myConnection.Database ) myConnection.ChangeDatabase( "test2" ) MessageBox.Show( "ServerVersion: " + myConnection.ServerVersion _ + ControlChars.NewLine + "Database: " + myConnection.Database ) myConnection.Close() End Sub
C# example:
1182
Connector/NET Examples
public void CreateMySqlConnection() { string myConnString = "Persist Security Info=False;database=test;server=localhost;user id=joeuser;pwd=pass"; MySqlConnection myConnection = new MySqlConnection( myConnString ); myConnection.Open(); MessageBox.Show( "Server Version: " + myConnection.ServerVersion + "\nDatabase: " + myConnection.Database ); myConnection.ChangeDatabase( "test2" ); MessageBox.Show( "ServerVersion: " + myConnection.ServerVersion + "\nDatabase: " + myConnection.Database ); myConnection.Close(); }
25.2.3.3.5. State
Gets the current state of the connection. Returns: A bitwise combination of the System.Data.ConnectionState values. The default is Closed. The allowed state changes are: From Closed to Open, using the Open method of the connection object. From Open to Closed, using either the Close method or the Dispose method of the connection object. Examples The following example creates a MySqlConnection, opens it, displays some of its properties, then closes the connection. Visual Basic example:
Public Sub CreateMySqlConnection(myConnString As String) Dim myConnection As New MySqlConnection(myConnString) myConnection.Open() MessageBox.Show("ServerVersion: " + myConnection.ServerVersion _ + ControlChars.Cr + "State: " + myConnection.State.ToString()) myConnection.Close() End Sub
C# example:
public void CreateMySqlConnection(string myConnString) { MySqlConnection myConnection = new MySqlConnection(myConnString); myConnection.Open(); MessageBox.Show("ServerVersion: " + myConnection.ServerVersion + "\nState: " + myConnection.State.ToString()); myConnection.Close(); }
25.2.3.3.6. ServerVersion
Gets a string containing the version of the MySQL server to which the client is connected. Returns: The version of the instance of MySQL. Exception: The connection is closed. Examples
1183
Connector/NET Examples
The following example creates a MySqlConnection, opens it, displays some of its properties, then closes the connection. Visual Basic example:
Public Sub CreateMySqlConnection(myConnString As String) Dim myConnection As New MySqlConnection(myConnString) myConnection.Open() MessageBox.Show("ServerVersion: " + myConnection.ServerVersion _ + ControlChars.Cr + "State: " + myConnection.State.ToString()) myConnection.Close() End Sub
C# example:
public void CreateMySqlConnection(string myConnString) { MySqlConnection myConnection = new MySqlConnection(myConnString); myConnection.Open(); MessageBox.Show("ServerVersion: " + myConnection.ServerVersion + "\nState: " + myConnection.State.ToString()); myConnection.Close(); }
25.2.3.3.7. Close
Closes the connection to the database. This is the preferred method of closing any open connection. The Close method rolls back any pending transactions. It then releases the connection to the connection pool, or closes the connection if connection pooling is disabled. An application can call Close more than one time. No exception is generated. Examples The following example creates a MySqlConnection, opens it, displays some of its properties, then closes the connection. Visual Basic example:
Public Sub CreateMySqlConnection(myConnString As String) Dim myConnection As New MySqlConnection(myConnString) myConnection.Open() MessageBox.Show("ServerVersion: " + myConnection.ServerVersion _ + ControlChars.Cr + "State: " + myConnection.State.ToString()) myConnection.Close() End Sub
C# example:
public void CreateMySqlConnection(string myConnString) { MySqlConnection myConnection = new MySqlConnection(myConnString); myConnection.Open(); MessageBox.Show("ServerVersion: " + myConnection.ServerVersion + "\nState: " + myConnection.State.ToString()); myConnection.Close(); }
25.2.3.3.8. CreateCommand
Creates and returns a MySqlCommand object associated with the MySqlConnection. Returns: A MySqlCommand object.
1184
Connector/NET Examples
25.2.3.3.9. BeginTransaction
Begins a database transaction. Returns: An object representing the new transaction. Exception: Parallel transactions are not supported. This command is equivalent to the MySQL BEGIN TRANSACTION command. You must explicitly commit or roll back the transaction using the MySqlTransaction.Commit or MySqlTransaction.Rollback method. Note. If you do not specify an isolation level, the default isolation level is used. To specify an isolation level with the BeginTransaction method, use the overload that takes the iso parameter. Examples The following example creates a MySqlConnection and a MySqlTransaction. It also demonstrates how to use the BeginTransaction, a MySqlTransaction.Commit, and MySqlTransaction.Rollback methods. Visual Basic example:
Public Sub RunTransaction(myConnString As String) Dim myConnection As New MySqlConnection(myConnString) myConnection.Open() Dim myCommand As MySqlCommand = myConnection.CreateCommand() Dim myTrans As MySqlTransaction ' Start a local transaction myTrans = myConnection.BeginTransaction() ' Must assign both transaction object and connection ' to Command object for a pending local transaction myCommand.Connection = myConnection myCommand.Transaction = myTrans Try myCommand.CommandText = "Insert into Test (id, desc) VALUES (100, 'Description')" myCommand.ExecuteNonQuery() myCommand.CommandText = "Insert into Test (id, desc) VALUES (101, 'Description')" myCommand.ExecuteNonQuery() myTrans.Commit() Console.WriteLine("Both records are written to database.") Catch e As Exception Try myTrans.Rollback() Catch ex As MySqlException If Not myTrans.Connection Is Nothing Then Console.WriteLine("An exception of type " + ex.GetType().ToString() + _ " was encountered while attempting to roll back the transaction.") End If End Try Console.WriteLine("An exception of type " + e.GetType().ToString() + _ "was encountered while inserting the data.") Console.WriteLine("Neither record was written to database.") Finally myConnection.Close() End Try End Sub
C# example:
public void RunTransaction(string myConnString) {
1185
Connector/NET Examples
MySqlConnection myConnection = new MySqlConnection(myConnString); myConnection.Open(); MySqlCommand myCommand = myConnection.CreateCommand(); MySqlTransaction myTrans; // Start a local transaction myTrans = myConnection.BeginTransaction(); // Must assign both transaction object and connection // to Command object for a pending local transaction myCommand.Connection = myConnection; myCommand.Transaction = myTrans; try { myCommand.CommandText = "insert into Test (id, desc) VALUES (100, 'Description')"; myCommand.ExecuteNonQuery(); myCommand.CommandText = "insert into Test (id, desc) VALUES (101, 'Description')"; myCommand.ExecuteNonQuery(); myTrans.Commit(); Console.WriteLine("Both records are written to database."); } catch(Exception e) { try { myTrans.Rollback(); } catch (SqlException ex) { if (myTrans.Connection != null) { Console.WriteLine("An exception of type " + ex.GetType() + " was encountered while attempting to roll back the transaction."); } } Console.WriteLine("An exception of type " + e.GetType() + " was encountered while inserting the data."); Console.WriteLine("Neither record was written to database."); } finally { myConnection.Close(); } }
25.2.3.3.10. BeginTransaction1
Begins a database transaction with the specified isolation level. Parameters: The isolation level under which the transaction should run. Returns: An object representing the new transaction. Exception: Parallel exceptions are not supported. This command is equivalent to the MySQL BEGIN TRANSACTION command. You must explicitly commit or roll back the transaction using the MySqlTransaction.Commit or MySqlTransaction.Rollback method. Note. If you do not specify an isolation level, the default isolation level is used. To specify an isolation level with the BeginTransaction method, use the overload that takes the iso parameter. Examples The following example creates a MySqlConnection and a MySqlTransaction. It also demonstrates how to use the BeginTransaction, a MySqlTransaction.Commit, and MySqlTransaction.Rollback methods.
1186
Connector/NET Examples
C# example:
public void RunTransaction(string myConnString) { MySqlConnection myConnection = new MySqlConnection(myConnString); myConnection.Open(); MySqlCommand myCommand = myConnection.CreateCommand(); MySqlTransaction myTrans; // Start a local transaction myTrans = myConnection.BeginTransaction(); // Must assign both transaction object and connection // to Command object for a pending local transaction myCommand.Connection = myConnection; myCommand.Transaction = myTrans; try { myCommand.CommandText = "insert into Test (id, desc) VALUES (100, 'Description')"; myCommand.ExecuteNonQuery(); myCommand.CommandText = "insert into Test (id, desc) VALUES (101, 'Description')"; myCommand.ExecuteNonQuery(); myTrans.Commit(); Console.WriteLine("Both records are written to database."); } catch(Exception e) { try { myTrans.Rollback(); } catch (SqlException ex)
1187
Connector/NET Examples
{ if (myTrans.Connection != null) { Console.WriteLine("An exception of type " + ex.GetType() + " was encountered while attempting to roll back the transaction."); } } Console.WriteLine("An exception of type " + e.GetType() + " was encountered while inserting the data."); Console.WriteLine("Neither record was written to database."); } finally { myConnection.Close(); } }
25.2.3.3.11. ChangeDatabase
Changes the current database for an open MySqlConnection. Parameters: The name of the database to use. The value supplied in the database parameter must be a valid database name. The database parameter cannot contain a null value, an empty string, or a string with only blank characters. When you are using connection pooling against MySQL, and you close the connection, it is returned to the connection pool. The next time the connection is retrieved from the pool, the reset connection request executes before the user performs any operations. Exception: The database name is not valid. Exception: The connection is not open. Exception: Cannot change the database. Examples The following example creates a MySqlConnection and displays some of its read-only properties. Visual Basic example:
Public Sub CreateMySqlConnection() Dim myConnString As String = _ "Persist Security Info=False;database=test;server=localhost;user id=joeuser;pwd=pass" Dim myConnection As New MySqlConnection( myConnString ) myConnection.Open() MessageBox.Show( "Server Version: " + myConnection.ServerVersion _ + ControlChars.NewLine + "Database: " + myConnection.Database ) myConnection.ChangeDatabase( "test2" ) MessageBox.Show( "ServerVersion: " + myConnection.ServerVersion _ + ControlChars.NewLine + "Database: " + myConnection.Database ) myConnection.Close() End Sub
C# example:
public void CreateMySqlConnection() { string myConnString = "Persist Security Info=False;database=test;server=localhost;user id=joeuser;pwd=pass"; MySqlConnection myConnection = new MySqlConnection( myConnString ); myConnection.Open(); MessageBox.Show( "Server Version: " + myConnection.ServerVersion + "\nDatabase: " + myConnection.Database );
1188
Connector/NET Examples
myConnection.ChangeDatabase( "test2" ); MessageBox.Show( "ServerVersion: " + myConnection.ServerVersion + "\nDatabase: " + myConnection.Database ); myConnection.Close(); }
25.2.3.3.12. StateChange
Occurs when the state of the connection changes. The StateChange event fires whenever the State changes from closed to opened, or from opened to closed. StateChange fires immediately after the MySqlConnection transitions. If an event handler throws an exception from within the StateChange event, the exception propagates to the caller of the Open or Close method. The StateChange event is not raised unless you explicitly call Close or Dispose. The event handler receives an argument of type System.Data.StateChangeEventArgs containing data related to this event. The following StateChangeEventArgs properties provide information specific to this event. Property Description
System.Data.StateChangeEventArgs.CurrentState Gets the new state of the connection. The connection object will be in the new state already when the event is fired. System.Data.StateChangeEventArgs.OriginalState Gets the original state of the connection.
25.2.3.3.13. InfoMessage
Occurs when MySQL returns warnings as a result of executing a command or query.
25.2.3.3.14. ConnectionTimeout
Gets the time to wait while trying to establish a connection before terminating the attempt and generating an error. Exception: The value set is less than 0. A value of 0 indicates no limit, and should be avoided in a MySqlConnection.ConnectionString because an attempt to connect will wait indefinitely. Examples The following example creates a MySqlConnection and sets some of its properties in the connection string. Visual Basic example:
Public Sub CreateSqlConnection() Dim myConnection As New MySqlConnection() myConnection.ConnectionString = "Persist Security Info=False;Username=user;Password=pass;database=tes myConnection.Open() End Sub
C# example:
public void CreateSqlConnection() { MySqlConnection myConnection = new MySqlConnection(); myConnection.ConnectionString = "Persist Security Info=False;Username=user;Password=pass;database=tes myConnection.Open();
1189
Connector/NET Examples
25.2.3.3.15. ConnectionString
Gets or sets the string used to connect to a MySQL Server database. The ConnectionString returned may not be exactly like what was originally set but will be indentical in terms of keyword/value pairs. Security information will not be included unless the Persist Security Info value is set to true. You can use the ConnectionString property to connect to a database. The following example illustrates a typical connection string.
"Persist Security Info=False;database=MyDB;server=MySqlServer;user id=myUser;Password=myPass"
The ConnectionString property can be set only when the connection is closed. Many of the connection string values have corresponding read-only properties. When the connection string is set, all of these properties are updated, except when an error is detected. In this case, none of the properties are updated. MySqlConnection properties return only those settings contained in the ConnectionString. To connect to a local machine, specify "localhost" for the server. If you do not specify a server, localhost is assumed. Resetting the ConnectionString on a closed connection resets all connection string values (and related properties) including the password. For example, if you set a connection string that includes "Database= MyDb", and then reset the connection string to "Data Source=myserver;User Id=myUser;Password=myPass", the MySqlConnection.Database property is no longer set to MyDb. The connection string is parsed immediately after being set. If errors in syntax are found when parsing, a runtime exception, such as ArgumentException, is generated. Other errors can be found only when an attempt is made to open the connection. The basic format of a connection string consists of a series of keyword/value pairs separated by semicolons. The equal sign (=) connects each keyword and its value. To include values that contain a semicolon, single-quote character, or double-quote character, the value must be enclosed in double quotes. If the value contains both a semicolon and a double-quote character, the value can be enclosed in single quotes. The single quote is also useful if the value begins with a double-quote character. Conversely, the double quote can be used if the value begins with a single quote. If the value contains both single-quote and double-quote characters, the quote character used to enclose the value must be doubled each time it occurs within the value. To include preceding or trailing spaces in the string value, the value must be enclosed in either single quotes or double quotes. Any leading or trailing spaces around integer, Boolean, or enumerated values are ignored, even if enclosed in quotes. However, spaces within a string literal keyword or value are preserved. Using .NET Framework version 1.1, single or double quotes may be used within a connection string without using delimiters (for example, Data Source= my'Server or Data Source= my"Server), unless a quote character is the first or last character in the value. To include an equal sign (=) in a keyword or value, it must be preceded by another equal sign. For example, in the hypothetical connection string
"key==word=value"
the keyword is "key=word" and the value is "value". If a specific keyword in a keyword= value pair occurs multiple times in a connection string, the last occurrence listed is used in the value set. Keywords are not case sensitive.
1190
Connector/NET Examples
The following table lists the valid names for keyword values within the ConnectionString. Name Connect Timeout, Connection Timeout Default 15 Description The length of time (in seconds) to wait for a connection to the server before terminating the attempt and generating an error. The name or network address of the instance of MySQL to which to connect. Multiple hosts can be specified separated by &. This can be useful where multiple MySQL servers are configured for replication and you are not concerned about the precise server you are connecting to. No attempt is made by the provider to synchronize writes to the database so care should be taken when using this option. In Unix environment with Mono, this can be a fully qualified path to MySQL socket filename. With this configuration, the Unix socket will be used instead of TCP/IP socket. Currently only a single socket name can be given so accessing MySQL in a replicated environment using Unix sockets is not currently supported. When true, instructs the provider to ignore any calls to MySqlCommand.Prepare(). This option is provided to prevent issues with corruption of the statements when use with server side prepared statements. If you want to use server-side prepare statements, set this option to false. This option was added in Connector/NET 5.0.3. The port MySQL is using to listen for connections. Specify -1 for this value to use a named pipe connection (Windows only). This value is ignored if Unix socket is used. Specifies the type of connection to make to the server.Values can be: socket or tcp for a socket connection pipe for a named pipe connection unix for a Unix socket connection memory to use MySQL shared memory
localhost
Ignore Prepare
true
Port
3306
Protocol
socket
1191
Connector/NET Examples
Specifies the character set that should be used to encode all queries sent to the server. Resultsets are still returned in the character set of the data returned. false When true, various pieces of information is output to any configured TraceListeners. When true, multiple SQL statements can be sent with one command execution. -NoteStarting with MySQL 4.1.1, batch statements should be separated by the server-defined seperator character. Commands sent to earlier versions of MySQL should be seperated with ';'. For Connector/NET 5.0.3 and later, when true, SSL encryption is used for all data sent between the client and server if the server has a certificate installed. Recognized values are true, false, yes, and no. In versions before 5.0.3, this option had no effect. The name of the database to use intially The password for the MySQL account being used. false When set to false or no (strongly recommended), security-sensitive information, such as the password, is not returned as part of the connection if the connection is open or has ever been in an open state. Resetting the connection string resets all connection string values including the password. Recognized values are true, false, yes, and no. The MySQL login account being used. MYSQL The name of the shared memory object to use for communication if the connection protocol is set to memory. True to have MySqlDataReader.GetValue() return a MySqlDateTime for date or datetime columns that have
Logging
Allow Batch
true
Encrypt
false
false
1192
Connector/NET Examples
illegal values. False will cause a System.DateTime object to be returned for legal values and an exception will be thrown for illegal values. Convert Zero Datetime false True to have MySqlDataReader.GetValue() and MySqlDataReader.GetDateTime() return DateTime.MinValue for date or datetime columns that have illegal values. Allows use of '@' symbol as a parameter marker. See MySqlCommand for more info. This is for compatibility only. All future code should be written to use the new '?' parameter marker. When set to the name of a named pipe, the MySqlConnection will attempt to connect to MySQL on that named pipe.This settings only applies to the Windows platform.
false
mysql
The following table lists the valid names for connection pooling values within the ConnectionString. For more information about connection pooling, see Connection Pooling for the MySql Data Provider.
Default 0
Description When a connection is returned to the pool, its creation time is compared with the current time, and the connection is destroyed if that time span (in seconds) exceeds the value specified by Connection Lifetime. This is useful in clustered configurations to force load balancing between a running server and a server just brought online. A value of zero (0) causes pooled connections to have the maximum connection timeout. The maximum number of connections allowed in the pool. The minimum number of connections allowed in the pool. When true, the MySqlConnection object is drawn from the appropriate pool, or if necessary, is created and added to the appropriate pool.
100 0 true
1193
Connector/NET Examples
Recognized values are true, false, yes, and no. Reset Pooled Connections, true ResetConnections, ResetPooledConnections Specifies whether a ping and a reset should be sent to the server before a pooled connection is returned. Not resetting will yeild faster connection opens but also will not clear out session items such as temp tables. Specifies whether server variables should be updated when a pooled connection is returned. Turning this one will yeild faster opens but will also not catch any server changes made by other connections.
When setting keyword or connection pooling values that require a Boolean value, you can use 'yes' instead of 'true', and 'no' instead of 'false'. Note The MySql Data Provider uses the native socket protocol to communicate with MySQL. Therefore, it does not support the use of an ODBC data source name (DSN) when connecting to MySQL because it does not add an ODBC layer. CAUTION In this release, the application should use caution when constructing a connection string based on user input (for example when retrieving user ID and password information from a dialog box, and appending it to the connection string). The application should ensure that a user cannot embed extra connection string parameters in these values (for example, entering a password as "validpassword;database=somedb" in an attempt to attach to a different database). Examples The following example creates a MySqlConnection and sets some of its properties Visual Basic example:
Public Sub CreateConnection() Dim myConnection As New MySqlConnection() myConnection.ConnectionString = "Persist Security Info=False;database=myDB;server=myHost;Connect Timeou myConnection.Open() End Sub 'CreateConnection
C# example:
public void CreateConnection() { MySqlConnection myConnection = new MySqlConnection(); myConnection.ConnectionString = "Persist Security Info=False;database=myDB;server=myHost;Connect Timeou myConnection.Open(); }
Examples The following example creates a MySqlConnection in Unix environment with Mono installed. MySQL socket filename used in this example is "/var/lib/mysql/mysql.sock". The actual filename depends on your MySQL configuration. Visual Basic example:
1194
Connector/NET Examples
Public Sub CreateConnection() Dim myConnection As New MySqlConnection() myConnection.ConnectionString = "database=myDB;server=/var/lib/mysql/mysql.sock;user id=myUser; pwd myConnection.Open() End Sub 'CreateConnection
C# example:
public void CreateConnection() { MySqlConnection myConnection = new MySqlConnection(); myConnection.ConnectionString = "database=myDB;server=/var/lib/mysql/mysql.sock;user id=myUser; pwd myConnection.Open(); }
25.2.3.4. MySqlDataAdapter
Represents a set of data commands and a database connection that are used to fill a dataset and update a MySQL database. This class cannot be inherited. The MySQLDataAdapter, serves as a bridge between a System.Data.DataSet and MySQL for retrieving and saving data. The MySQLDataAdapter provides this bridge by mapping DbDataAdapter.Fill, which changes the data in the DataSet to match the data in the data source, and DbDataAdapter.Update, which changes the data in the data source to match the data in the DataSet, using the appropriate SQL statements against the data source. When the MySQLDataAdapter fills a DataSet, it will create the necessary tables and columns for the returned data if they do not already exist. However, primary key information will not be included in the implicitly created schema unless the System.Data.MissingSchemaAction property is set to System.Data.MissingSchemaAction.AddWithKey. You may also have the MySQLDataAdapter create the schema of the DataSet, including primary key information, before filling it with data using System.Data.Common.DbDataAdapter.FillSchema. MySQLDataAdapter is used in conjunction with MySqlConnection and MySqlCommand to increase performance when connecting to a MySQL database. The MySQLDataAdapter also includes the MySqlDataAdapter.SelectCommand, MySqlDataAdapter.InsertCommand, MySqlDataAdapter.DeleteCommand, MySqlDataAdapter.UpdateCommand, and DataAdapter.TableMappings properties to facilitate the loading and updating of data. When an instance of MySQLDataAdapter is created, the read/write properties are set to initial values. For a list of these values, see the MySQLDataAdapter constructor. Note. Please be aware that the DataColumn class in .NET 1.0 and 1.1 does not allow columns with type of UInt16, UInt32, or UInt64 to be autoincrement columns. If you plan to use autoincremement columns with MySQL, you should consider using signed integer columns. Examples The following example creates a MySqlCommand and a MySqlConnection. The MySqlConnection is opened and set as the MySqlCommand.Connection for the MySqlCommand. The example then calls MySqlCommand.ExecuteNonQuery, and closes the connection. To accomplish this, the ExecuteNonQuery is passed a connection string and a query string that is a SQL INSERT statement. Visual Basic example:
Public Function SelectRows(dataSet As DataSet, connection As String, query As String) As DataSet Dim conn As New MySqlConnection(connection) Dim adapter As New MySqlDataAdapter() adapter.SelectCommand = new MySqlCommand(query, conn)
1195
Connector/NET Examples
C# example:
public DataSet SelectRows(DataSet dataset,string connection,string query) { MySqlConnection conn = new MySqlConnection(connection); MySqlDataAdapter adapter = new MySqlDataAdapter(); adapter.SelectCommand = new MySqlCommand(query, conn); adapter.Fill(dataset); return dataset; }
You can change the value of any of these properties through a separate call to the property. Examples The following example creates a MySqlDataAdapter and sets some of its properties. Visual Basic example:
Public Sub CreateSqlDataAdapter() Dim conn As MySqlConnection = New MySqlConnection("Data Source=localhost;" & _ "database=test") Dim da As MySqlDataAdapter = New MySqlDataAdapter da.MissingSchemaAction = MissingSchemaAction.AddWithKey da.SelectCommand = New MySqlCommand("SELECT id, name FROM mytable", conn) da.InsertCommand = New MySqlCommand("INSERT INTO mytable (id, name) " & _ "VALUES (?id, ?name)", conn) da.UpdateCommand = New MySqlCommand("UPDATE mytable SET id=?id, name=?name " & _ "WHERE id=?oldId", conn) da.DeleteCommand = New MySqlCommand("DELETE FROM mytable WHERE id=?id", conn) da.InsertCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id") da.InsertCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name")
da.UpdateCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id") da.UpdateCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name") da.UpdateCommand.Parameters.Add("?oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion. da.DeleteCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Ori End Sub
C# example:
public static void CreateSqlDataAdapter() { MySqlConnection conn = new MySqlConnection("Data Source=localhost;database=test"); MySqlDataAdapter da = new MySqlDataAdapter();
1196
Connector/NET Examples
da.MissingSchemaAction = MissingSchemaAction.AddWithKey; da.SelectCommand = new MySqlCommand("SELECT id, name FROM mytable", conn); da.InsertCommand = new MySqlCommand("INSERT INTO mytable (id, name) " + "VALUES (?id, ?name)", conn); da.UpdateCommand = new MySqlCommand("UPDATE mytable SET id=?id, name=?name " + "WHERE id=?oldId", conn); da.DeleteCommand = new MySqlCommand("DELETE FROM mytable WHERE id=?id", conn); da.InsertCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id"); da.InsertCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name");
da.UpdateCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id"); da.UpdateCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name"); da.UpdateCommand.Parameters.Add("?oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVers da.DeleteCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion }
You can change the value of any of these properties through a separate call to the property. When SelectCommand (or any of the other command properties) is assigned to a previously created MySqlCommand, the MySqlCommand is not cloned. The SelectCommand maintains a reference to the previously created MySqlCommand object. Examples The following example creates a MySqlDataAdapter and sets some of its properties. Visual Basic example:
Public Sub CreateSqlDataAdapter() Dim conn As MySqlConnection = New MySqlConnection("Data Source=localhost;" & _ "database=test") Dim cmd as new MySqlCommand("SELECT id, name FROM mytable", conn) Dim da As MySqlDataAdapter = New MySqlDataAdapter(cmd) da.MissingSchemaAction = MissingSchemaAction.AddWithKey da.InsertCommand = New MySqlCommand("INSERT INTO mytable (id, name) " & _ "VALUES (?id, ?name)", conn) da.UpdateCommand = New MySqlCommand("UPDATE mytable SET id=?id, name=?name " & _ "WHERE id=?oldId", conn) da.DeleteCommand = New MySqlCommand("DELETE FROM mytable WHERE id=?id", conn) da.InsertCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id") da.InsertCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name")
da.UpdateCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id") da.UpdateCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name") da.UpdateCommand.Parameters.Add("?oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVers da.DeleteCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion End Sub
1197
Connector/NET Examples
C# example:
public static void CreateSqlDataAdapter() { MySqlConnection conn = new MySqlConnection("Data Source=localhost;database=test"); MySqlCommand cmd = new MySqlCommand("SELECT id, name FROM mytable", conn); MySqlDataAdapter da = new MySqlDataAdapter(cmd); da.MissingSchemaAction = MissingSchemaAction.AddWithKey; da.InsertCommand = new MySqlCommand("INSERT INTO mytable (id, name) " + "VALUES (?id, ?name)", conn); da.UpdateCommand = new MySqlCommand("UPDATE mytable SET id=?id, name=?name " + "WHERE id=?oldId", conn); da.DeleteCommand = new MySqlCommand("DELETE FROM mytable WHERE id=?id", conn); da.InsertCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id"); da.InsertCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name");
da.UpdateCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id"); da.UpdateCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name"); da.UpdateCommand.Parameters.Add("?oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion. da.DeleteCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Ori }
You can change the value of any of these properties through a separate call to the property. Examples The following example creates a MySqlDataAdapter and sets some of its properties. Visual Basic example:
Public Sub CreateSqlDataAdapter() Dim conn As MySqlConnection = New MySqlConnection("Data Source=localhost;" & _ "database=test") Dim da As MySqlDataAdapter = New MySqlDataAdapter("SELECT id, name FROM mytable", conn) da.MissingSchemaAction = MissingSchemaAction.AddWithKey da.InsertCommand = New MySqlCommand("INSERT INTO mytable (id, name) " & _ "VALUES (?id, ?name)", conn) da.UpdateCommand = New MySqlCommand("UPDATE mytable SET id=?id, name=?name " & _ "WHERE id=?oldId", conn) da.DeleteCommand = New MySqlCommand("DELETE FROM mytable WHERE id=?id", conn)
1198
Connector/NET Examples
da.UpdateCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id") da.UpdateCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name") da.UpdateCommand.Parameters.Add("?oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVers da.DeleteCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion End Sub
C# example:
public static void CreateSqlDataAdapter() { MySqlConnection conn = new MySqlConnection("Data Source=localhost;database=test"); MySqlDataAdapter da = new MySqlDataAdapter("SELECT id, name FROM mytable", conn); da.MissingSchemaAction = MissingSchemaAction.AddWithKey; da.InsertCommand = new MySqlCommand("INSERT INTO mytable (id, name) " + "VALUES (?id, ?name)", conn); da.UpdateCommand = new MySqlCommand("UPDATE mytable SET id=?id, name=?name " + "WHERE id=?oldId", conn); da.DeleteCommand = new MySqlCommand("DELETE FROM mytable WHERE id=?id", conn); da.InsertCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id"); da.InsertCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name");
da.UpdateCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id"); da.UpdateCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name"); da.UpdateCommand.Parameters.Add("?oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVers da.DeleteCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion }
You can change the value of any of these properties through a separate call to the property. Examples The following example creates a MySqlDataAdapter and sets some of its properties. Visual Basic example:
Public Sub CreateSqlDataAdapter() Dim da As MySqlDataAdapter = New MySqlDataAdapter("SELECT id, name FROM mytable", "Data Source=loca Dim conn As MySqlConnection = da.SelectCommand.Connection da.MissingSchemaAction = MissingSchemaAction.AddWithKey da.InsertCommand = New MySqlCommand("INSERT INTO mytable (id, name) " & _ "VALUES (?id, ?name)", conn) da.UpdateCommand = New MySqlCommand("UPDATE mytable SET id=?id, name=?name " & _ "WHERE id=?oldId", conn)
1199
Connector/NET Examples
da.DeleteCommand = New MySqlCommand("DELETE FROM mytable WHERE id=?id", conn) da.InsertCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id") da.InsertCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name")
da.UpdateCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id") da.UpdateCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name") da.UpdateCommand.Parameters.Add("?oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion. da.DeleteCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Ori End Sub
C# example:
public static void CreateSqlDataAdapter() { MySqlDataAdapter da = new MySqlDataAdapter("SELECT id, name FROM mytable", "Data Source=localhost;datab MySqlConnection conn = da.SelectCommand.Connection; da.MissingSchemaAction = MissingSchemaAction.AddWithKey; da.InsertCommand = new MySqlCommand("INSERT INTO mytable (id, name) " + "VALUES (?id, ?name)", conn); da.UpdateCommand = new MySqlCommand("UPDATE mytable SET id=?id, name=?name " + "WHERE id=?oldId", conn); da.DeleteCommand = new MySqlCommand("DELETE FROM mytable WHERE id=?id", conn); da.InsertCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id"); da.InsertCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name");
da.UpdateCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id"); da.UpdateCommand.Parameters.Add("?name", MySqlDbType.VarChar, 40, "name"); da.UpdateCommand.Parameters.Add("?oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion. da.DeleteCommand.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Ori }
25.2.3.4.5. DeleteCommand
Gets or sets a SQL statement or stored procedure used to delete records from the data set. Value: A MySqlCommand used during System.Data.Common.DataAdapter.Update to delete records in the database that correspond to deleted rows in the DataSet. During System.Data.Common.DataAdapter.Update, if this property is not set and primary key information is present in the DataSet, the DeleteCommand can be generated automatically if you set the SelectCommand property and use the MySqlCommandBuilder. Then, any additional commands that you do not set are generated by the MySqlCommandBuilder. This generation logic requires key column information to be present in the DataSet. When DeleteCommand is assigned to a previously created MySqlCommand, the MySqlCommand is not cloned. The DeleteCommand maintains a reference to the previously created MySqlCommand object. Examples The following example creates a MySqlDataAdapter and sets the SelectCommand and DeleteCommand properties. It assumes you have already created a MySqlConnection object. Visual Basic example:
Public Shared Function CreateCustomerAdapter(conn As MySqlConnection) As MySqlDataAdapter Dim da As MySqlDataAdapter = New MySqlDataAdapter() Dim cmd As MySqlCommand Dim parm As MySqlParameter ' Create the SelectCommand. cmd = New MySqlCommand("SELECT * FROM mytable WHERE id=?id AND name=?name", conn) cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15) cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15) da.SelectCommand = cmd ' Create the DeleteCommand. cmd = New MySqlCommand("DELETE FROM mytable WHERE id=?id", conn)
1200
Connector/NET Examples
parm = cmd.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id") parm.SourceVersion = DataRowVersion.Original da.DeleteCommand = cmd Return da End Function
C# example:
public static MySqlDataAdapter CreateCustomerAdapter(MySqlConnection conn) { MySqlDataAdapter da = new MySqlDataAdapter(); MySqlCommand cmd; MySqlParameter parm; // Create the SelectCommand. cmd = new MySqlCommand("SELECT * FROM mytable WHERE id=?id AND name=?name", conn); cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15); cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15); da.SelectCommand = cmd; // Create the DeleteCommand. cmd = new MySqlCommand("DELETE FROM mytable WHERE id=?id", conn); parm = cmd.Parameters.Add("?id", MySqlDbType.VarChar, 5, "id"); parm.SourceVersion = DataRowVersion.Original; da.DeleteCommand = cmd; return da; }
25.2.3.4.6. InsertCommand
Gets or sets a SQL statement or stored procedure used to insert records into the data set. Value: A MySqlCommand used during System.Data.Common.DataAdapter.Update to insert records into the database that correspond to new rows in the DataSet. During System.Data.Common.DataAdapter.Update, if this property is not set and primary key information is present in the DataSet, the InsertCommand can be generated automatically if you set the SelectCommand property and use the MySqlCommandBuilder. Then, any additional commands that you do not set are generated by the MySqlCommandBuilder. This generation logic requires key column information to be present in the DataSet. When InsertCommand is assigned to a previously created MySqlCommand, the MySqlCommand is not cloned. The InsertCommand maintains a reference to the previously created MySqlCommand object. Note. If execution of this command returns rows, these rows may be added to the DataSet depending on how you set the MySqlCommand.UpdatedRowSource property of the MySqlCommand object. Examples The following example creates a MySqlDataAdapter and sets the SelectCommand and InsertCommand properties. It assumes you have already created a MySqlConnection object. Visual Basic example:
Public Shared Function CreateCustomerAdapter(conn As MySqlConnection) As MySqlDataAdapter Dim da As MySqlDataAdapter = New MySqlDataAdapter() Dim cmd As MySqlCommand Dim parm As MySqlParameter ' Create the SelectCommand. cmd = New MySqlCommand("SELECT * FROM mytable WHERE id=?id AND name=?name", conn) cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15) cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15) da.SelectCommand = cmd ' Create the InsertCommand. cmd = New MySqlCommand("INSERT INTO mytable (id,name) VALUES (?id, ?name)", conn) cmd.Parameters.Add( "?id", MySqlDbType.VarChar, 15, "id" )
1201
Connector/NET Examples
cmd.Parameters.Add( "?name", MySqlDbType.VarChar, 15, "name" ) da.InsertCommand = cmd Return da End Function
C# example:
public static MySqlDataAdapter CreateCustomerAdapter(MySqlConnection conn) { MySqlDataAdapter da = new MySqlDataAdapter(); MySqlCommand cmd; MySqlParameter parm; // Create the SelectCommand. cmd = new MySqlCommand("SELECT * FROM mytable WHERE id=?id AND name=?name", conn); cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15); cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15); da.SelectCommand = cmd; // Create the InsertCommand. cmd = new MySqlCommand("INSERT INTO mytable (id,name) VALUES (?id,?name)", conn); cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15, "id" ); cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15, "name" ); da.InsertCommand = cmd; return da; }
25.2.3.4.7. UpdateCommand
Gets or sets a SQL statement or stored procedure used to updated records in the data source. Value: A MySqlCommand used during System.Data.Common.DataAdapter.Update to update records in the database with data from the DataSet. During System.Data.Common.DataAdapter.Update, if this property is not set and primary key information is present in the DataSet, the UpdateCommand can be generated automatically if you set the SelectCommand property and use the MySqlCommandBuilder. Then, any additional commands that you do not set are generated by the MySqlCommandBuilder. This generation logic requires key column information to be present in the DataSet. When UpdateCommand is assigned to a previously created MySqlCommand, the MySqlCommand is not cloned. The UpdateCommand maintains a reference to the previously created MySqlCommand object. Note. If execution of this command returns rows, these rows may be merged with the DataSet depending on how you set the MySqlCommand.UpdatedRowSource property of the MySqlCommand object. Examples The following example creates a MySqlDataAdapter and sets the SelectCommand and UpdateCommand properties. It assumes you have already created a MySqlConnection object. Visual Basic example:
Public Shared Function CreateCustomerAdapter(conn As MySqlConnection) As MySqlDataAdapter Dim da As MySqlDataAdapter = New MySqlDataAdapter() Dim cmd As MySqlCommand Dim parm As MySqlParameter ' Create the SelectCommand. cmd = New MySqlCommand("SELECT * FROM mytable WHERE id=?id AND name=?name", conn) cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15) cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15) da.SelectCommand = cmd ' Create the UpdateCommand. cmd = New MySqlCommand("UPDATE mytable SET id=?id, name=?name WHERE id=?oldId", conn)
1202
Connector/NET Examples
cmd.Parameters.Add( "?id", MySqlDbType.VarChar, 15, "id" ) cmd.Parameters.Add( "?name", MySqlDbType.VarChar, 15, "name" ) parm = cmd.Parameters.Add("?oldId", MySqlDbType.VarChar, 15, "id") parm.SourceVersion = DataRowVersion.Original da.UpdateCommand = cmd Return da End Function
C# example:
public static MySqlDataAdapter CreateCustomerAdapter(MySqlConnection conn) { MySqlDataAdapter da = new MySqlDataAdapter(); MySqlCommand cmd; MySqlParameter parm; // Create the SelectCommand. cmd = new MySqlCommand("SELECT * FROM mytable WHERE id=?id AND name=?name", conn); cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15); cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15); da.SelectCommand = cmd; // Create the UpdateCommand. cmd = new MySqlCommand("UPDATE mytable SET id=?id, name=?name WHERE id=?oldId", conn); cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15, "id" ); cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15, "name" ); parm = cmd.Parameters.Add( "?oldId", MySqlDbType.VarChar, 15, "id" ); parm.SourceVersion = DataRowVersion.Original; da.UpdateCommand = cmd; return da; }
25.2.3.4.8. SelectCommand
Gets or sets a SQL statement or stored procedure used to select records in the data source. Value: A MySqlCommand used during System.Data.Common.DbDataAdapter.Fill to select records from the database for placement in the DataSet. When SelectCommand is assigned to a previously created MySqlCommand, the MySqlCommand is not cloned. The SelectCommand maintains a reference to the previously created MySqlCommand object. If the SelectCommand does not return any rows, no tables are added to the DataSet, and no exception is raised. Examples The following example creates a MySqlDataAdapter and sets the SelectCommand and InsertCommand properties. It assumes you have already created a MySqlConnection object. Visual Basic example:
Public Shared Function CreateCustomerAdapter(conn As MySqlConnection) As MySqlDataAdapter Dim da As MySqlDataAdapter = New MySqlDataAdapter() Dim cmd As MySqlCommand Dim parm As MySqlParameter ' Create the SelectCommand. cmd = New MySqlCommand("SELECT * FROM mytable WHERE id=?id AND name=?name", conn) cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15) cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15) da.SelectCommand = cmd ' Create the InsertCommand. cmd = New MySqlCommand("INSERT INTO mytable (id,name) VALUES (?id, ?name)", conn)
1203
Connector/NET Examples
cmd.Parameters.Add( "?id", MySqlDbType.VarChar, 15, "id" ) cmd.Parameters.Add( "?name", MySqlDbType.VarChar, 15, "name" ) da.InsertCommand = cmd Return da End Function
C# example:
public static MySqlDataAdapter CreateCustomerAdapter(MySqlConnection conn) { MySqlDataAdapter da = new MySqlDataAdapter(); MySqlCommand cmd; MySqlParameter parm; // Create the SelectCommand. cmd = new MySqlCommand("SELECT * FROM mytable WHERE id=?id AND name=?name", conn); cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15); cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15); da.SelectCommand = cmd; // Create the InsertCommand. cmd = new MySqlCommand("INSERT INTO mytable (id,name) VALUES (?id,?name)", conn); cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15, "id" ); cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15, "name" ); da.InsertCommand = cmd; return da; }
25.2.3.5. MySqlDataReader
To create a MySQLDataReader, you must call the MySqlCommand.ExecuteReader method of the MySqlCommand object, rather than directly using a constructor. While the MySqlDataReader is in use, the associated MySqlConnection is busy serving the MySqlDataReader, and no other operations can be performed on the MySqlConnection other than closing it. This is the case until the MySqlDataReader.Close method of the MySqlDataReader is called. MySqlDataReader.IsClosed and MySqlDataReader.RecordsAffected are the only properties that you can call after the MySqlDataReader is closed. Though the RecordsAffected property may be accessed at any time while the MySqlDataReader exists, always call Close before returning the value of RecordsAffected to ensure an accurate return value. For optimal performance, MySqlDataReader avoids creating unnecessary objects or making unnecessary copies of data. As a result, multiple calls to methods such as MySqlDataReader.GetValue return a reference to the same object. Use caution if you are modifying the underlying value of the objects returned by methods such as GetValue. Examples The following example creates a MySqlConnection, a MySqlCommand, and a MySqlDataReader. The example reads through the data, writing it out to the console. Finally, the example closes the MySqlDataReader, then the MySqlConnection. Visual Basic example:
Public Sub ReadMyData(myConnString As String) Dim mySelectQuery As String = "SELECT OrderID, CustomerID FROM Orders" Dim myConnection As New MySqlConnection(myConnString) Dim myCommand As New MySqlCommand(mySelectQuery, myConnection) myConnection.Open() Dim myReader As MySqlDataReader myReader = myCommand.ExecuteReader() ' Always call Read before accessing data. While myReader.Read() Console.WriteLine((myReader.GetInt32(0) & ", " & myReader.GetString(1)))
1204
Connector/NET Examples
End While ' always call Close when done reading. myReader.Close() ' Close the connection when done with it. myConnection.Close() End Sub 'ReadMyData
C# example:
public void ReadMyData(string myConnString) { string mySelectQuery = "SELECT OrderID, CustomerID FROM Orders"; MySqlConnection myConnection = new MySqlConnection(myConnString); MySqlCommand myCommand = new MySqlCommand(mySelectQuery,myConnection); myConnection.Open(); MySqlDataReader myReader; myReader = myCommand.ExecuteReader(); // Always call Read before accessing data. while (myReader.Read()) { Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1)); } // always call Close when done reading. myReader.Close(); // Close the connection when done with it. myConnection.Close(); }
25.2.3.5.1. GetBytes
GetBytes returns the number of available bytes in the field. In most cases this is the exact length of the field. However, the number returned may be less than the true length of the field if GetBytes has already been used to obtain bytes from the field. This may be the case, for example, if the MySqlDataReader is reading a large data structure into a buffer. For more information, see the SequentialAccess setting for MySqlCommand.CommandBehavior. If you pass a buffer that is a null reference (Nothing in Visual Basic), GetBytes returns the length of the field in bytes. No conversions are performed; therefore the data retrieved must already be a byte array.
25.2.3.5.2. GetTimeSpan
Gets the value of the specified column as a TimeSpan object. Parameters: The zero-based column ordinal. Returns: The value of the specified column.
25.2.3.5.3. GetDateTime
Gets the value of the specified column as a System.DateTime object. Note. MySql allows date columns to contain the value '0000-00-00' and datetime columns to contain the value '0000-00-00 00:00:00'. The DateTime structure cannot contain or represent these values. To read a datetime value from a column that might contain zero values, use GetMySqlDateTime. The behavior of reading a zero datetime column using this method is defined by the ZeroDateTimeBehavior connection string option. For more information on this option, please refer to MySqlConnection.ConnectionString. Parameters: The zero-based column ordinal. Returns: The value of the specified column.
1205
Connector/NET Examples
25.2.3.5.4. GetMySqlDateTime
Gets the value of the specified column as a MySql.Data.Types.MySqlDateTime object. Parameters: The zero-based column ordinal. Returns: The value of the specified column.
25.2.3.5.5. GetString
Gets the value of the specified column as a String object. Parameters: The zero-based column ordinal. Returns: The value of the specified column.
25.2.3.5.6. GetDecimal
Gets the value of the specified column as a Decimal object. Parameters: The zero-based column ordinal. Returns: The value of the specified column.
25.2.3.5.7. GetDouble
Gets the value of the specified column as a double-precision floating point number. Parameters: The zero-based column ordinal. Returns: The value of the specified column.
25.2.3.5.8. GetFloat
Gets the value of the specified column as a single-precision floating point number. Parameters: The zero-based column ordinal. Returns: The value of the specified column.
25.2.3.5.9. GetGiud
Gets the value of the specified column as a globally-unique identifier (GUID). Parameters: The zero-based column ordinal. Returns: The value of the specified column.
25.2.3.5.10. GetInt16
Gets the value of the specified column as a 16-bit signed integer. Parameters: The zero-based column ordinal. Returns: The value of the specified column.
25.2.3.5.11. GetInt32
Gets the value of the specified column as a 32-bit signed integer. Parameters: The zero-based column ordinal.
1206
Connector/NET Examples
25.2.3.5.12. GetInt64
Gets the value of the specified column as a 64-bit signed integer. Parameters: The zero-based column ordinal. Returns: The value of the specified column.
25.2.3.5.13. GetUInt16
Gets the value of the specified column as a 16-bit unsigned integer. Parameters: The zero-based column ordinal. Returns: The value of the specified column.
25.2.3.5.14. GetUInt32
Gets the value of the specified column as a 32-bit unsigned integer. Parameters: The zero-based column ordinal. Returns: The value of the specified column.
25.2.3.5.15. GetUInt64
Gets the value of the specified column as a 64-bit unsigned integer. Parameters: The zero-based column ordinal. Returns: The value of the specified column.
25.2.3.6. MySqlException
This class is created whenever the MySql Data Provider encounters an error generated from the server. Any open connections are not automatically closed when an exception is thrown. If the client application determines that the exception is fatal, it should close any open MySqlDataReader objects or MySqlConnection objects. Examples The following example generates a MySqlException due to a missing server, and then displays the exception. Visual Basic example:
Public Sub ShowException() Dim mySelectQuery As String = "SELECT column1 FROM table1" Dim myConnection As New MySqlConnection ("Data Source=localhost;Database=Sample;") Dim myCommand As New MySqlCommand(mySelectQuery, myConnection) Try myCommand.Connection.Open() Catch e As MySqlException MessageBox.Show( e.Message ) End Try End Sub
C# example:
1207
Connector/NET Examples
public void ShowException() { string mySelectQuery = "SELECT column1 FROM table1"; MySqlConnection myConnection = new MySqlConnection("Data Source=localhost;Database=Sample;"); MySqlCommand myCommand = new MySqlCommand(mySelectQuery,myConnection); try { myCommand.Connection.Open(); } catch (MySqlException e) { MessageBox.Show( e.Message ); } }
25.2.3.7. MySqlParameter
Parameter names are not case sensitive. Examples The following example creates multiple instances of MySqlParameter through the MySqlParameterCollection collection within the MySqlDataAdapter. These parameters are used to select data from the data source and place the data in the DataSet. This example assumes that a DataSet and a MySqlDataAdapter have already been created with the appropriate schema, commands, and connection. Visual Basic example:
Public Sub AddSqlParameters() ' ... ' create myDataSet and myDataAdapter ' ... myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", MySqlDbType.VarChar, 80).Value = "toasters" myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", MySqlDbType.Long).Value = 239 myDataAdapter.Fill(myDataSet) End Sub 'AddSqlParameters
C# example:
public void AddSqlParameters() { // ... // create myDataSet and myDataAdapter // ... myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", MySqlDbType.VarChar, 80).Value = "toasters"; myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", MySqlDbType.Long).Value = 239; myDataAdapter.Fill(myDataSet); }
25.2.3.8. MySqlParameterCollection
The number of the parameters in the collection must be equal to the number of parameter placeholders within the command text, or an exception will be generated. Examples The following example creates multiple instances of MySqlParameter through the MySqlParameterCollection collection within the MySqlDataAdapter. These parameters are used to select data within the data source and place the data in the DataSet. This code assumes that a DataSet and a MySqlDataAdapter have already been created with the appropriate schema, commands, and connection.
1208
Connector/NET Examples
Public Sub AddParameters() ' ... ' create myDataSet and myDataAdapter ' ... myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", MySqlDbType.VarChar, 80).Value = "toast myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", MySqlDbType.Long).Value = 239 myDataAdapter.Fill(myDataSet) End Sub 'AddSqlParameters
C# example:
public void AddSqlParameters() { // ... // create myDataSet and myDataAdapter // ... myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", MySqlDbType.VarChar, 80).Value = "toaster myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", MySqlDbType.Long).Value = 239; myDataAdapter.Fill(myDataSet); }
25.2.3.9. MySqlTransaction
Represents a SQL transaction to be made in a MySQL database. This class cannot be inherited. The application creates a MySqlTransaction object by calling MySqlConnection.BeginTransaction on the MySqlConnection object. All subsequent operations associated with the transaction (for example, committing or aborting the transaction), are performed on the MySqlTransaction object. Examples The following example creates a MySqlConnection and a MySqlTransaction. It also demonstrates how to use the MySqlConnection.BeginTransaction, MySqlTransaction.Commit, and MySqlTransaction.Rollback methods. Visual Basic example:
Public Sub RunTransaction(myConnString As String) Dim myConnection As New MySqlConnection(myConnString) myConnection.Open() Dim myCommand As MySqlCommand = myConnection.CreateCommand() Dim myTrans As MySqlTransaction ' Start a local transaction myTrans = myConnection.BeginTransaction() ' Must assign both transaction object and connection ' to Command object for a pending local transaction myCommand.Connection = myConnection myCommand.Transaction = myTrans
Try myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Descripti myCommand.ExecuteNonQuery() myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Descripti myCommand.ExecuteNonQuery() myTrans.Commit() Console.WriteLine("Both records are written to database.") Catch e As Exception Try myTrans.Rollback() Catch ex As MySqlException If Not myTrans.Connection Is Nothing Then
1209
Connector/NET Examples
Console.WriteLine("An exception of type " & ex.GetType().ToString() & _ " was encountered while attempting to roll back the transaction.") End If End Try Console.WriteLine("An exception of type " & e.GetType().ToString() & _ "was encountered while inserting the data.") Console.WriteLine("Neither record was written to database.") Finally myConnection.Close() End Try End Sub 'RunTransaction
C# example:
public void RunTransaction(string myConnString) { MySqlConnection myConnection = new MySqlConnection(myConnString); myConnection.Open(); MySqlCommand myCommand = myConnection.CreateCommand(); MySqlTransaction myTrans; // Start a local transaction myTrans = myConnection.BeginTransaction(); // Must assign both transaction object and connection // to Command object for a pending local transaction myCommand.Connection = myConnection; myCommand.Transaction = myTrans; try { myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description') myCommand.ExecuteNonQuery(); myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description') myCommand.ExecuteNonQuery(); myTrans.Commit(); Console.WriteLine("Both records are written to database."); } catch(Exception e) { try { myTrans.Rollback(); } catch (MySqlException ex) { if (myTrans.Connection != null) { Console.WriteLine("An exception of type " + ex.GetType() + " was encountered while attempting to roll back the transaction."); } } Console.WriteLine("An exception of type " + e.GetType() + " was encountered while inserting the data."); Console.WriteLine("Neither record was written to database."); } finally { myConnection.Close(); } }
25.2.3.9.1. Rollback
Rolls back a transaction from a pending state. The Rollback method is equivalent to the MySQL statement ROLLBACK. The transaction can only be rolled back from a pending state (after BeginTransaction has been called, but before Commit is called). Examples
1210
Connector/NET Examples
The following example creates MySqlConnection and a MySqlTransaction. It also demonstrates how to use the MySqlConnection.BeginTransaction, Commit, and Rollback methods. Visual Basic example:
Public Sub RunSqlTransaction(myConnString As String) Dim myConnection As New MySqlConnection(myConnString) myConnection.Open() Dim myCommand As MySqlCommand = myConnection.CreateCommand() Dim myTrans As MySqlTransaction ' Start a local transaction myTrans = myConnection.BeginTransaction() ' Must assign both transaction object and connection ' to Command object for a pending local transaction myCommand.Connection = myConnection myCommand.Transaction = myTrans Try myCommand.CommandText = "Insert into mytable (id, desc) VALUES (100, 'Description')" myCommand.ExecuteNonQuery() myCommand.CommandText = "Insert into mytable (id, desc) VALUES (101, 'Description')" myCommand.ExecuteNonQuery() myTrans.Commit() Console.WriteLine("Success.") Catch e As Exception Try myTrans.Rollback() Catch ex As MySqlException If Not myTrans.Connection Is Nothing Then Console.WriteLine("An exception of type " & ex.GetType().ToString() & _ " was encountered while attempting to roll back the transaction.") End If End Try Console.WriteLine("An exception of type " & e.GetType().ToString() & _ "was encountered while inserting the data.") Console.WriteLine("Neither record was written to database.") Finally myConnection.Close() End Try End Sub
C# example:
public void RunSqlTransaction(string myConnString) { MySqlConnection myConnection = new MySqlConnection(myConnString); myConnection.Open(); MySqlCommand myCommand = myConnection.CreateCommand(); MySqlTransaction myTrans; // Start a local transaction myTrans = myConnection.BeginTransaction(); // Must assign both transaction object and connection // to Command object for a pending local transaction myCommand.Connection = myConnection; myCommand.Transaction = myTrans; try { myCommand.CommandText = "Insert into mytable (id, desc) VALUES (100, 'Description')"; myCommand.ExecuteNonQuery(); myCommand.CommandText = "Insert into mytable (id, desc) VALUES (101, 'Description')"; myCommand.ExecuteNonQuery(); myTrans.Commit(); Console.WriteLine("Both records are written to database."); } catch(Exception e) { try {
1211
Connector/NET Examples
myTrans.Rollback(); } catch (MySqlException ex) { if (myTrans.Connection != null) { Console.WriteLine("An exception of type " + ex.GetType() + " was encountered while attempting to roll back the transaction."); } } Console.WriteLine("An exception of type " + e.GetType() + " was encountered while inserting the data."); Console.WriteLine("Neither record was written to database."); } finally { myConnection.Close(); } }
25.2.3.9.2. Commit
Commits the database transaction. The Commit method is equivalent to the MySQL SQL statement COMMIT. Examples The following example creates MySqlConnection and a MySqlTransaction. It also demonstrates how to use the MySqlConnection.BeginTransaction, Commit, and Rollback methods. Visual Basic example:
Public Sub RunSqlTransaction(myConnString As String) Dim myConnection As New MySqlConnection(myConnString) myConnection.Open() Dim myCommand As MySqlCommand = myConnection.CreateCommand() Dim myTrans As MySqlTransaction ' Start a local transaction myTrans = myConnection.BeginTransaction() ' Must assign both transaction object and connection ' to Command object for a pending local transaction myCommand.Connection = myConnection myCommand.Transaction = myTrans Try myCommand.CommandText = "Insert into mytable (id, desc) VALUES (100, 'Description')" myCommand.ExecuteNonQuery() myCommand.CommandText = "Insert into mytable (id, desc) VALUES (101, 'Description')" myCommand.ExecuteNonQuery() myTrans.Commit() Console.WriteLine("Success.") Catch e As Exception Try myTrans.Rollback() Catch ex As MySqlException If Not myTrans.Connection Is Nothing Then Console.WriteLine("An exception of type " & ex.GetType().ToString() & _ " was encountered while attempting to roll back the transaction.") End If End Try Console.WriteLine("An exception of type " & e.GetType().ToString() & _ "was encountered while inserting the data.") Console.WriteLine("Neither record was written to database.") Finally
1212
Connector/NET Reference
C# example:
public void RunSqlTransaction(string myConnString) { MySqlConnection myConnection = new MySqlConnection(myConnString); myConnection.Open(); MySqlCommand myCommand = myConnection.CreateCommand(); MySqlTransaction myTrans; // Start a local transaction myTrans = myConnection.BeginTransaction(); // Must assign both transaction object and connection // to Command object for a pending local transaction myCommand.Connection = myConnection; myCommand.Transaction = myTrans; try { myCommand.CommandText = "Insert into mytable (id, desc) VALUES (100, 'Description')"; myCommand.ExecuteNonQuery(); myCommand.CommandText = "Insert into mytable (id, desc) VALUES (101, 'Description')"; myCommand.ExecuteNonQuery(); myTrans.Commit(); Console.WriteLine("Both records are written to database."); } catch(Exception e) { try { myTrans.Rollback(); } catch (MySqlException ex) { if (myTrans.Connection != null) { Console.WriteLine("An exception of type " + ex.GetType() + " was encountered while attempting to roll back the transaction."); } } Console.WriteLine("An exception of type " + e.GetType() + " was encountered while inserting the data."); Console.WriteLine("Neither record was written to database."); } finally { myConnection.Close(); } }
25.2.4.1. MySql.Data.MySqlClient
Namespace hierarchy Classes Class MySqlCommand MySqlCommandBuilder MySqlConnection Description
1213
Connector/NET Reference
MySqlDataAdapter MySqlDataReader Provides a means of reading a forward-only stream of rows from a MySQL database. This class cannot be inherited. Collection of error codes that can be returned by the server The exception that is thrown when MySQL returns an error. This class cannot be inherited. Helper class that makes it easier to work with the provider. Provides data for the InfoMessage event. This class cannot be inherited. Represents a parameter to a MySqlCommand , and optionally, its mapping to DataSetcolumns. This class cannot be inherited. Represents a collection of parameters relevant to a MySqlCommand as well as their respective mappings to columns in a DataSet. This class cannot be inherited. Provides data for the RowUpdated event. This class cannot be inherited. Provides data for the RowUpdating event. This class cannot be inherited.
MySqlParameterCollection
Description Represents the method that will handle the InfoMessage event of a MySqlConnection. Represents the method that will handle the RowUpdatedevent of a MySqlDataAdapter . Represents the method that will handle the RowUpdatingevent of a MySqlDataAdapter .
Enumerations Enumeration MySqlDbType MySqlErrorCode Description Specifies MySQL specific data type of a field, property, for use in a MySqlParameter .
25.2.4.1.1. MySql.Data.MySqlClientHierarchy
See Also MySql.Data.MySqlClient Namespace
1214
Connector/NET Reference
Syntax: C#
public sealed class MySqlCommand : Component, IDbCommand, ICloneable
Thread Safety Public static (Shared in Visual Basic) members of this type are safe for multithreaded operations. Instance members are not guaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlCommand Members , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1. MySqlCommand Members MySqlCommand overview Public Instance Constructors MySqlCommand Overloaded. Initializes a new instance of the MySqlCommand class.
Public Instance Properties CommandText CommandTimeout CommandType Connection Container(inherited from Component) IsPrepared Parameters Site(inherited from Component) Transaction UpdatedRowSource Public Instance Methods Cancel Attempts to cancel the execution of a MySqlCommand. This operation is not supported. Gets or sets the ISiteof the Component. Gets the IContainerthat contains the Component.
CreateObjRef(inherited from MarshalByRefObject) Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. CreateParameter Dispose(inherited from Component) Creates a new instance of a MySqlParameter object. Releases all resources used by the Component.
1215
Connector/NET Reference
Determines whether the specified Objectis equal to the current Object. Overloaded. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Retrieves the current lifetime service object that controls the lifetime policy for this instance. Gets the Typeof the current instance. Obtains a lifetime service object to control the lifetime policy for this instance. Returns a Stringcontaining the name of the Component, if any. This method should not be overridden.
GetLifetimeService(inherited from MarshalByRefObject) GetType(inherited from Object) InitializeLifetimeService(inherited from MarshalByRefObject) Prepare ToString(inherited from Component)
Public Instance Events Disposed(inherited from Component) Adds an event handler to listen to the Disposedevent on the component.
See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1. MySqlCommand Constructor Initializes a new instance of the MySqlCommand class. Overload List Initializes a new instance of the MySqlCommand class. public MySqlCommand(); public MySqlCommand(string); public MySqlCommand(string,MySqlConnection); public MySqlCommand(string,MySqlConnection,MySqlTransaction); See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.1. MySqlCommand Constructor () Initializes a new instance of the MySqlCommand class. Syntax: Visual Basic
Overloads Public Sub New()
Syntax: C#
public MySqlCommand();
1216
Connector/NET Reference
See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace , MySqlCommand Constructor Overload List 25.2.4.1.2.1.1.2. MySqlCommand Constructor (String) Syntax: Visual Basic
Overloads Public Sub New( _ ByVal cmdText As String _ )
Syntax: C#
public MySqlCommand( stringcmdText );
See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace , MySqlCommand Constructor Overload List 25.2.4.1.2.1.1.3. MySqlCommand Constructor (String, MySqlConnection) Syntax: Visual Basic
Overloads Public Sub New( _ ByVal cmdText As String, _ ByVal connection As MySqlConnection _ )
Syntax: C#
public MySqlCommand( stringcmdText, MySqlConnectionconnection );
See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace , MySqlCommand Constructor Overload List 25.2.4.1.2.1.1.3.1. MySqlConnection Class For a list of all members of this type, see MySqlConnection Members . Syntax: Visual Basic
NotInheritable Public Class MySqlConnection_ Inherits Component_ Implements IDbConnection, ICloneable
Syntax: C#
public sealed class MySqlConnection : Component, IDbConnection, ICloneable
Thread Safety Public static (Shared in Visual Basic) members of this type are safe for multithreaded operations. Instance members are not guaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient
1217
Connector/NET Reference
Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlConnection Members , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1. MySqlConnection Members MySqlConnection overview Public Instance Constructors MySqlConnection Overloaded. Initializes a new instance of the MySqlConnection class.
Public Instance Properties ConnectionString ConnectionTimeout Container(inherited from Component) Database DataSource ServerThread ServerVersion Site(inherited from Component) State UseCompression Indicates if this connection should use compression when communicating with the server. Gets or sets the ISiteof the Component. Gets the name of the MySQL server to which to connect. Returns the id of the server thread this connection is executing on Gets the IContainerthat contains the Component.
Public Instance Methods BeginTransaction ChangeDatabase Close CreateCommand CreateObjRef(inherited from MarshalByRefObject) Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. Dispose(inherited from Component) Equals(inherited from Object) GetHashCode(inherited from Object) Releases all resources used by the Component. Determines whether the specified Objectis equal to the current Object. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Retrieves the current lifetime service object that controls the lifetime policy for this instance. Gets the Typeof the current instance. Obtains a lifetime service object to control the lifetime policy for this instance. Overloaded.
1218
Connector/NET Reference
Open Ping ToString(inherited from Component) Ping Returns a Stringcontaining the name of the Component, if any. This method should not be overridden.
Public Instance Events Disposed(inherited from Component) InfoMessage StateChange See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.1. MySqlConnection Constructor Initializes a new instance of the MySqlConnection class. Overload List Initializes a new instance of the MySqlConnection class. public MySqlConnection(); public MySqlConnection(string); See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.1.1. MySqlConnection Constructor () Initializes a new instance of the MySqlConnection class. Syntax: Visual Basic
Overloads Public Sub New()
Syntax: C#
public MySqlConnection();
See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace , MySqlConnection Constructor Overload List 25.2.4.1.2.1.1.3.1.1.1.2. MySqlConnection Constructor (String) Syntax: Visual Basic
Overloads Public Sub New( _ ByVal connectionString As String _ )
Syntax: C#
public MySqlConnection( stringconnectionString
1219
Connector/NET Reference
);
See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace , MySqlConnection Constructor Overload List 25.2.4.1.2.1.1.3.1.1.2. ConnectionString Property Syntax: Visual Basic
NotOverridable Public Property ConnectionString As String _ _ Implements IDbConnection.ConnectionString
Syntax: C#
public string ConnectionString {get; set;}
Implements IDbConnection.ConnectionString See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.3. ConnectionTimeout Property Syntax: Visual Basic
NotOverridable Public ReadOnly Property ConnectionTimeout As Integer _ _ Implements IDbConnection.ConnectionTimeout
Syntax: C#
public int ConnectionTimeout {get;}
Implements IDbConnection.ConnectionTimeout See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.4. Database Property Syntax: Visual Basic
NotOverridable Public ReadOnly Property Database As String _ _ Implements IDbConnection.Database
Syntax: C#
public string Database {get;}
1220
Connector/NET Reference
25.2.4.1.2.1.1.3.1.1.5. DataSource Property Gets the name of the MySQL server to which to connect. Syntax: Visual Basic
Public ReadOnly Property DataSource As String
Syntax: C#
public string DataSource {get;}
See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.6. ServerThread Property Returns the id of the server thread this connection is executing on Syntax: Visual Basic
Public ReadOnly Property ServerThread As Integer
Syntax: C#
public int ServerThread {get;}
See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.7. ServerVersion Property Syntax: Visual Basic
Public ReadOnly Property ServerVersion As String
Syntax: C#
public string ServerVersion {get;}
See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.8. State Property Syntax: Visual Basic
NotOverridable Public ReadOnly Property State As ConnectionState _ _ Implements IDbConnection.State
Syntax: C#
public System.Data.ConnectionState State {get;}
1221
Connector/NET Reference
25.2.4.1.2.1.1.3.1.1.9. UseCompression Property Indicates if this connection should use compression when communicating with the server. Syntax: Visual Basic
Public ReadOnly Property UseCompression As Boolean
Syntax: C#
public bool UseCompression {get;}
See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.10. BeginTransaction Method Overload List public MySqlTransaction BeginTransaction(); public MySqlTransaction BeginTransaction(IsolationLevel); See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.10.1. MySqlConnection.BeginTransaction Method () Syntax: Visual Basic
Overloads Public Function BeginTransaction() As MySqlTransaction
Syntax: C#
public MySqlTransaction BeginTransaction();
See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace , MySqlConnection.BeginTransaction Overload List 25.2.4.1.2.1.1.3.1.1.10.1.1. MySqlTransaction Class For a list of all members of this type, see MySqlTransaction Members . Syntax: Visual Basic
NotInheritable Public Class MySqlTransaction_ Implements IDbTransaction, IDisposable
Syntax: C#
public sealed class MySqlTransaction : IDbTransaction, IDisposable
Thread Safety Public static (Sharedin Visual Basic) members of this type are safe for multithreaded operations. Instance members are notguaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient
1222
Connector/NET Reference
Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlTransaction Members , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.10.1.1.1. MySqlTransaction Members MySqlTransaction overview Public Instance Properties Connection Gets the MySqlConnection object associated with the transaction, or a null reference (Nothing in Visual Basic) if the transaction is no longer valid. Specifies the IsolationLevelfor this transaction.
IsolationLevel Public Instance Methods Commit Equals(inherited from Object) GetHashCode(inherited from Object)
Determines whether the specified Objectis equal to the current Object. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Gets the Typeof the current instance. Returns a Stringthat represents the current Object.
MySqlTransaction Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.10.1.1.1.1. Connection Property Gets the MySqlConnection object associated with the transaction, or a null reference (Nothing in Visual Basic) if the transaction is no longer valid. Syntax: Visual Basic
Public ReadOnly Property Connection As MySqlConnection
Syntax: C#
public MySqlConnection Connection {get;}
Property Value The MySqlConnection object associated with this transaction. Remarks A single application may have multiple database connections, each with zero or more transactions. This property enables you to determine the connection object associated with a particular transaction created by BeginTransaction . See Also MySqlTransaction Class , MySql.Data.MySqlClient Namespace
1223
Connector/NET Reference
25.2.4.1.2.1.1.3.1.1.10.1.1.1.2. IsolationLevel Property Specifies the IsolationLevelfor this transaction. Syntax: Visual Basic
NotOverridable Public ReadOnly Property IsolationLevel As IsolationLevel _ _ Implements IDbTransaction.IsolationLevel
Syntax: C#
public System.Data.IsolationLevel IsolationLevel {get;}
Property Value The IsolationLevel for this transaction. The default is ReadCommitted. Implements IDbTransaction.IsolationLevel Remarks Parallel transactions are not supported. Therefore, the IsolationLevel applies to the entire transaction. See Also MySqlTransaction Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.10.1.1.1.3. MySqlTransaction.Commit Method Syntax: Visual Basic
NotOverridable Public Sub Commit() _ _ Implements IDbTransaction.Commit
Syntax: C#
public void Commit();
Implements IDbTransaction.Commit See Also MySqlTransaction Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.10.1.1.1.4. MySqlTransaction.Rollback Method Syntax: Visual Basic
NotOverridable Public Sub Rollback() _ _ Implements IDbTransaction.Rollback
Syntax: C#
public void Rollback();
Implements IDbTransaction.Rollback
1224
Connector/NET Reference
See Also MySqlTransaction Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.10.2. MySqlConnection.BeginTransaction Method (IsolationLevel) Syntax: Visual Basic
Overloads Public Function BeginTransaction( _ ByVal iso As IsolationLevel _ ) As MySqlTransaction
Syntax: C#
public MySqlTransaction BeginTransaction( IsolationLeveliso );
See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace , MySqlConnection.BeginTransaction Overload List 25.2.4.1.2.1.1.3.1.1.11. MySqlConnection.ChangeDatabase Method Syntax: Visual Basic
NotOverridable Public Sub ChangeDatabase( _ ByVal databaseName As String _ ) _ _ Implements IDbConnection.ChangeDatabase
Syntax: C#
public void ChangeDatabase( stringdatabaseName );
Implements IDbConnection.ChangeDatabase See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.12. MySqlConnection.Close Method Syntax: Visual Basic
NotOverridable Public Sub Close() _ _ Implements IDbConnection.Close
Syntax: C#
public void Close();
1225
Connector/NET Reference
Syntax: C#
public MySqlCommand CreateCommand();
See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.14. MySqlConnection.Open Method Syntax: Visual Basic
NotOverridable Public Sub Open() _ _ Implements IDbConnection.Open
Syntax: C#
public void Open();
Implements IDbConnection.Open See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.15. MySqlConnection.Ping Method Ping Syntax: Visual Basic
Public Function Ping() As Boolean
Syntax: C#
public bool Ping();
Return Value See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.16. MySqlConnection.InfoMessage Event Syntax: Visual Basic
Public Event InfoMessage As MySqlInfoMessageEventHandler
Syntax: C#
public event MySqlInfoMessageEventHandler InfoMessage;
1226
Connector/NET Reference
25.2.4.1.2.1.1.3.1.1.16.1. MySqlInfoMessageEventHandler Delegate Represents the method that will handle the InfoMessage event of a MySqlConnection . Syntax: Visual Basic
Public Delegate Sub MySqlInfoMessageEventHandler( _ ByVal sender As Object, _ ByVal args As MySqlInfoMessageEventArgs _ )
Syntax: C#
public delegate void MySqlInfoMessageEventHandler( objectsender, MySqlInfoMessageEventArgsargs );
Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.16.1.1. MySqlInfoMessageEventArgs Class Provides data for the InfoMessage event. This class cannot be inherited. For a list of all members of this type, see MySqlInfoMessageEventArgs Members . Syntax: Visual Basic
Public Class MySqlInfoMessageEventArgs_ Inherits EventArgs
Syntax: C#
public class MySqlInfoMessageEventArgs : EventArgs
Thread Safety Public static (Sharedin Visual Basic) members of this type are safe for multithreaded operations. Instance members are notguaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlInfoMessageEventArgs Members , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.16.1.1.1. MySqlInfoMessageEventArgs Members MySqlInfoMessageEventArgs overview Public Instance Constructors MySqlInfoMessageEventArgs Constructor Initializes a new instance of the MySqlInfoMessageEventArgs class.
1227
Connector/NET Reference
Public Instance Fields errors Public Instance Methods Equals(inherited from Object) GetHashCode(inherited from Object) Determines whether the specified Objectis equal to the current Object. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Gets the Typeof the current instance. Returns a Stringthat represents the current Object.
GetType(inherited from Object) ToString(inherited from Object) Protected Instance Methods Finalize(inherited from Object)
Allows an Objectto attempt to free resources and perform other cleanup operations before the Objectis reclaimed by garbage collection. Creates a shallow copy of the current Object.
MySqlInfoMessageEventArgs Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.16.1.1.1.1. MySqlInfoMessageEventArgs Constructor Initializes a new instance of the MySqlInfoMessageEventArgs class. Syntax: Visual Basic
Public Sub New()
Syntax: C#
public MySqlInfoMessageEventArgs();
See Also MySqlInfoMessageEventArgs Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.16.1.1.1.2. MySqlInfoMessageEventArgs.errors Field Syntax: Visual Basic
Public errors As MySqlError()
Syntax: C#
public MySqlError[] errors;
See Also MySqlInfoMessageEventArgs Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.16.1.1.1.2.1. MySqlError Class Collection of error codes that can be returned by the server For a list of all members of this type, see MySqlError Members . Syntax: Visual Basic
1228
Connector/NET Reference
Syntax: C#
public class MySqlError
Thread Safety Public static (Shared in Visual Basic) members of this type are safe for multithreaded operations. Instance members are not guaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlError Members , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.16.1.1.1.2.1.1. MySqlError Members MySqlError overview Public Instance Constructors MySqlError Constructor Public Instance Properties Code Level Message Public Instance Methods Equals(inherited from Object) GetHashCode(inherited from Object) Determines whether the specified Objectis equal to the current Object. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Gets the Typeof the current instance. Returns a Stringthat represents the current Object. Error code Error level Error message
GetType(inherited from Object) ToString(inherited from Object) Protected Instance Methods Finalize(inherited from Object)
Allows an Objectto attempt to free resources and perform other cleanup operations before the Objectis reclaimed by garbage collection. Creates a shallow copy of the current Object.
MySqlError Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.16.1.1.1.2.1.1.1. MySqlError Constructor Syntax: Visual Basic
1229
Connector/NET Reference
Public Sub New( _ ByVal level As String, _ ByVal code As Integer, _ ByVal message As String _ )
Syntax: C#
public MySqlError( stringlevel, intcode, stringmessage );
Parameters level: code: message: See Also MySqlError Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.16.1.1.1.2.1.1.2. Code Property Error code Syntax: Visual Basic
Public ReadOnly Property Code As Integer
Syntax: C#
public int Code {get;}
See Also MySqlError Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.16.1.1.1.2.1.1.3. Level Property Error level Syntax: Visual Basic
Public ReadOnly Property Level As String
Syntax: C#
public string Level {get;}
See Also MySqlError Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.16.1.1.1.2.1.1.4. Message Property Error message Syntax: Visual Basic
Public ReadOnly Property Message As String
Syntax: C#
1230
Connector/NET Reference
See Also MySqlError Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.3.1.1.17. MySqlConnection.StateChange Event Syntax: Visual Basic
Public Event StateChange As StateChangeEventHandler
Syntax: C#
public event StateChangeEventHandler StateChange;
See Also MySqlConnection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.1.4. MySqlCommand Constructor (String, MySqlConnection, MySqlTransaction) Syntax: Visual Basic
Overloads Public Sub New( _ ByVal cmdText As String, _ ByVal connection As MySqlConnection, _ ByVal transaction As MySqlTransaction _ )
Syntax: C#
public MySqlCommand( stringcmdText, MySqlConnectionconnection, MySqlTransactiontransaction );
See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace , MySqlCommand Constructor Overload List 25.2.4.1.2.1.2. CommandText Property Syntax: Visual Basic
NotOverridable Public Property CommandText As String _ _ Implements IDbCommand.CommandText
Syntax: C#
public string CommandText {get; set;}
Implements IDbCommand.CommandText See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.3. CommandTimeout Property Syntax: Visual Basic
1231
Connector/NET Reference
Syntax: C#
public int CommandTimeout {get; set;}
Implements IDbCommand.CommandTimeout See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.4. CommandType Property Syntax: Visual Basic
NotOverridable Public Property CommandType As CommandType _ _ Implements IDbCommand.CommandType
Syntax: C#
public System.Data.CommandType CommandType {get; set;}
Implements IDbCommand.CommandType See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.5. Connection Property Syntax: Visual Basic
Public Property Connection As MySqlConnection
Syntax: C#
public MySqlConnection Connection {get; set;}
See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.6. IsPrepared Property Syntax: Visual Basic
Public ReadOnly Property IsPrepared As Boolean
Syntax: C#
public bool IsPrepared {get;}
See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7. Parameters Property Syntax: Visual Basic
1232
Connector/NET Reference
Syntax: C#
public MySqlParameterCollection Parameters {get;}
See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1. MySqlParameterCollection Class Represents a collection of parameters relevant to a MySqlCommand as well as their respective mappings to columns in a DataSet. This class cannot be inherited. For a list of all members of this type, see MySqlParameterCollection Members . Syntax: Visual Basic
NotInheritable Public Class MySqlParameterCollection_ Inherits MarshalByRefObject_ Implements IDataParameterCollection, IList, ICollection, IEnumerable
Syntax: C#
Thread Safety Public static (Shared in Visual Basic) members of this type are safe for multithreaded operations. Instance members are not guaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlParameterCollection Members , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1. MySqlParameterCollection Members MySqlParameterCollection overview Public Instance Constructors MySqlParameterCollection Constructor Initializes a new instance of the MySqlParameterCollection class.
Public Instance Properties Count Item Gets the number of MySqlParameter objects in the collection. Overloaded. Gets the MySqlParameter with a specified attribute. In C#, this property is the indexer for the MySqlParameterCollection class.
Public Instance Methods Add Overloaded. Adds the specified MySqlParameter object to the MySqlParameterCollection .
1233
Connector/NET Reference
Removes all items from the collection. Overloaded. Gets a value indicating whether a MySqlParameter exists in the collection. Copies MySqlParameter objects from the MySqlParameterCollection to the specified array.
CreateObjRef(inherited from MarshalByRefObject) Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. Equals(inherited from Object) GetHashCode(inherited from Object) Determines whether the specified Objectis equal to the current Object. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Retrieves the current lifetime service object that controls the lifetime policy for this instance. Gets the Typeof the current instance. Overloaded. Gets the location of a MySqlParameter in the collection. Obtains a lifetime service object to control the lifetime policy for this instance. Inserts a MySqlParameter into the collection at the specified index. Removes the specified MySqlParameter from the collection. Overloaded. Removes the specified MySqlParameter from the collection. Returns a Stringthat represents the current Object.
GetLifetimeService(inherited from MarshalByRefObject) GetType(inherited from Object) IndexOf InitializeLifetimeService(inherited from MarshalByRefObject) Insert Remove RemoveAt ToString(inherited from Object) See Also
MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.1. MySqlParameterCollection Constructor Initializes a new instance of the MySqlParameterCollection class. Syntax: Visual Basic
Public Sub New()
Syntax: C#
public MySqlParameterCollection();
See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.2. Count Property Gets the number of MySqlParameter objects in the collection. Syntax: Visual Basic
NotOverridable Public ReadOnly Property Count As Integer _ _
1234
Connector/NET Reference
Implements ICollection.Count
Syntax: C#
public int Count {get;}
Implements ICollection.Count See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3. Item Property Gets the MySqlParameter with a specified attribute. In C#, this property is the indexer for the MySqlParameterCollection class. Overload List Gets the MySqlParameter at the specified index. public MySqlParameter this[int] {get; set;} Gets the MySqlParameter with the specified name. public MySqlParameter this[string] {get; set;} See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1. MySqlParameter Class Represents a parameter to a MySqlCommand , and optionally, its mapping to DataSetcolumns. This class cannot be inherited. For a list of all members of this type, see MySqlParameter Members . Syntax: Visual Basic
NotInheritable Public Class MySqlParameter_ Inherits MarshalByRefObject_ Implements IDataParameter, IDbDataParameter, ICloneable
Syntax: C#
public sealed class MySqlParameter : MarshalByRefObject, IDataParameter, IDbDataParameter, ICloneable
Thread Safety Public static (Shared in Visual Basic) members of this type are safe for multithreaded operations. Instance members are not guaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlParameter Members , MySql.Data.MySqlClient Namespace
1235
Connector/NET Reference
25.2.4.1.2.1.7.1.1.3.1.1. MySqlParameter Members MySqlParameter overview Public Instance Constructors MySqlParameter Overloaded. Initializes a new instance of the MySqlParameter class.
Public Instance Properties DbType Direction Gets or sets the DbTypeof the parameter. Gets or sets a value indicating whether the parameter is input-only, output-only, bidirectional, or a stored procedure return value parameter. As of MySql version 4.1 and earlier, input-only is the only valid choice. Gets or sets a value indicating whether the parameter accepts null values. Gets or sets the MySqlDbType of the parameter. Gets or sets the name of the MySqlParameter. Gets or sets the maximum number of digits used to represent the Value property. Gets or sets the number of decimal places to which Value is resolved. Gets or sets the maximum size, in bytes, of the data within the column. Gets or sets the name of the source column that is mapped to the DataSetand used for loading or returning the Value . Gets or sets the DataRowVersionto use when loading Value . Gets or sets the value of the parameter.
CreateObjRef(inherited from MarshalByRefObject) Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. Equals(inherited from Object) GetHashCode(inherited from Object) Determines whether the specified Objectis equal to the current Object. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Retrieves the current lifetime service object that controls the lifetime policy for this instance. Gets the Typeof the current instance. Obtains a lifetime service object to control the lifetime policy for this instance. Overridden. Gets a string containing the ParameterName .
GetLifetimeService(inherited from MarshalByRefObject) GetType(inherited from Object) InitializeLifetimeService(inherited from MarshalByRefObject) ToString
1236
Connector/NET Reference
See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.1. MySqlParameter Constructor Initializes a new instance of the MySqlParameter class. Overload List Initializes a new instance of the MySqlParameter class. public MySqlParameter(); Initializes a new instance of the MySqlParameter class with the parameter name and the data type. public MySqlParameter(string,MySqlDbType); Initializes a new instance of the MySqlParameter class with the parameter name, the MySqlDbType , and the size. public MySqlParameter(string,MySqlDbType,int); Initializes a new instance of the MySqlParameter class with the parameter name, the type of the parameter, the size of the parameter, a ParameterDirection, the precision of the parameter, the scale of the parameter, the source column, a DataRowVersionto use, and the value of the parameter. public MySqlParameter(string,MySqlDbType,int,ParameterDirection,bool,byte,byte,string,DataRowVersion,object); Initializes a new instance of the MySqlParameter class with the parameter name, the MySqlDbType , the size, and the source column name. public MySqlParameter(string,MySqlDbType,int,string); Initializes a new instance of the MySqlParameter class with the parameter name and a value of the new MySqlParameter. public MySqlParameter(string,object); See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.1.1. MySqlParameter Constructor () Initializes a new instance of the MySqlParameter class. Syntax: Visual Basic
Overloads Public Sub New()
Syntax: C#
public MySqlParameter();
See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace , MySqlParameter Constructor Overload List 25.2.4.1.2.1.7.1.1.3.1.1.1.2. MySqlParameter Constructor (String, MySqlDbType) Initializes a new instance of the MySqlParameter class with the parameter name and the data type.
1237
Connector/NET Reference
Syntax: C#
public MySqlParameter( stringparameterName, MySqlDbTypedbType );
Parameters parameterName: The name of the parameter to map. dbType: One of the MySqlDbType values. See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace , MySqlParameter Constructor Overload List 25.2.4.1.2.1.7.1.1.3.1.1.1.2.1. MySqlDbType Enumeration Specifies MySQL specific data type of a field, property, for use in a MySqlParameter . Syntax: Visual Basic
Public Enum MySqlDbType
Syntax: C#
public enum MySqlDbType
Members Member Name VarString Timestamp LongBlob Time TinyBlob Datetime Decimal UByte Blob Double A BLOB or TEXT column with a maximum length of 65535 (2^16 - 1) characters A normal-size (double-precision) floating-point number. Allowable values are -1.7976931348623157E Description A variable-length string containing 0 to 65535 characters A timestamp. The range is '1970-01-01 00:00:01' to sometime in the year 2037 A BLOB or TEXT column with a maximum length of 4294967295 or 4G (2^32 - 1) characters The range is '-838:59:59' to '838:59:59'. A BLOB or TEXT column with a maximum length of 255 (2^8 - 1) characters The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'. A fixed precision and scale numeric value between -1038 -1 and 10 38 -1.
1238
Connector/NET Reference
+308 to -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to 1.7976931348623157E+308. Newdate Byte Date VarChar UInt16 UInt24 Int16 A 16-bit signed integer. The signed range is -32768 to 32767. The unsigned range is 0 to 65535 New Decimal A set. A string object that can have zero or more values, each of which must be chosen from the list of values 'value1', 'value2', ... A SET can have a maximum of 64 members. Obsolete Use VarChar type An enumeration. A string object that can have only one value, chosen from the list of values 'value1', 'value2', ..., NULL or the special "" error value. An ENUM can have a maximum of 65535 distinct values Obsolete Use Datetime or Date type The signed range is -128 to 127. The unsigned range is 0 to 255. Date The supported range is '1000-01-01' to '9999-12-31'. A variable-length string containing 0 to 255 characters
NewDecimal Set
String Enum
Geometry UInt64 Int64 UInt32 Int24 Bit Float Specifies a 24 (3 byte) signed or unsigned value. Bit-field data type A small (single-precision) floating-point number. Allowable values are -3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E-38 to 3.402823466E+38. A year in 2- or 4-digit format (default is 4-digit). The allowable values are 1901 to 2155, 0000 in the 4-digit year format, and 1970-2069 if you use the 2-digit format (70-69) A 32-bit signed integer A BLOB or TEXT column with a maximum length of 16777215 (2^24 - 1) characters A 64-bit signed integer.
Year
Int32 MediumBlob
1239
Connector/NET Reference
MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.1.3. MySqlParameter Constructor (String, MySqlDbType, Int32) Initializes a new instance of the MySqlParameter class with the parameter name, the MySqlDbType , and the size. Syntax: Visual Basic
Overloads Public Sub New( _ ByVal parameterName As String, _ ByVal dbType As MySqlDbType, _ ByVal size As Integer _ )
Syntax: C#
public MySqlParameter( stringparameterName, MySqlDbTypedbType, intsize );
Parameters parameterName: The name of the parameter to map. dbType: One of the MySqlDbType values. size: The length of the parameter. See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace , MySqlParameter Constructor Overload List 25.2.4.1.2.1.7.1.1.3.1.1.1.4. MySqlParameter Constructor (String, MySqlDbType, Int32, ParameterDirection, Boolean, Byte, Byte, String, DataRowVersion, Object) Initializes a new instance of the MySqlParameter class with the parameter name, the type of the parameter, the size of the parameter, a ParameterDirection, the precision of the parameter, the scale of the parameter, the source column, a DataRowVersionto use, and the value of the parameter. Syntax: Visual Basic
Overloads Public Sub New( _ ByVal parameterName As String, _ ByVal dbType As MySqlDbType, _ ByVal size As Integer, _ ByVal direction As ParameterDirection, _ ByVal isNullable As Boolean, _ ByVal precision As Byte, _ ByVal scale As Byte, _ ByVal sourceColumn As String, _ ByVal sourceVersion As DataRowVersion, _ ByVal value As Object _ )
Syntax: C#
public MySqlParameter( stringparameterName, MySqlDbTypedbType, intsize, ParameterDirectiondirection, boolisNullable, byteprecision, bytescale,
1240
Connector/NET Reference
Parameters parameterName: The name of the parameter to map. dbType: One of the MySqlDbType values. size: The length of the parameter. direction: One of the ParameterDirectionvalues. isNullable: true if the value of the field can be null, otherwise false. precision: The total number of digits to the left and right of the decimal point to which Value is resolved. scale: The total number of decimal places to which Value is resolved. sourceColumn: The name of the source column. sourceVersion: One of the DataRowVersionvalues. value: An Objectthat is the value of the MySqlParameter . Exceptions Exception Type ArgumentException See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace , MySqlParameter Constructor Overload List 25.2.4.1.2.1.7.1.1.3.1.1.1.4.1. Value Property Gets or sets the value of the parameter. Syntax: Visual Basic
NotOverridable Public Property Value As Object _ _ Implements IDataParameter.Value
Condition
Syntax: C#
public object Value {get; set;}
Implements IDataParameter.Value See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.1.5. MySqlParameter Constructor (String, MySqlDbType, Int32, String) Initializes a new instance of the MySqlParameter class with the parameter name, the MySqlDbType , the size, and the source column name.
1241
Connector/NET Reference
Syntax: C#
public MySqlParameter( stringparameterName, MySqlDbTypedbType, intsize, stringsourceColumn );
Parameters parameterName: The name of the parameter to map. dbType: One of the MySqlDbType values. size: The length of the parameter. sourceColumn: The name of the source column. See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace , MySqlParameter Constructor Overload List 25.2.4.1.2.1.7.1.1.3.1.1.1.6. MySqlParameter Constructor (String, Object) Initializes a new instance of the MySqlParameter class with the parameter name and a value of the new MySqlParameter. Syntax: Visual Basic
Overloads Public Sub New( _ ByVal parameterName As String, _ ByVal value As Object _ )
Syntax: C#
public MySqlParameter( stringparameterName, objectvalue );
Parameters parameterName: The name of the parameter to map. value: An Objectthat is the value of the MySqlParameter . See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace , MySqlParameter Constructor Overload List 25.2.4.1.2.1.7.1.1.3.1.1.2. DbType Property Gets or sets the DbTypeof the parameter.
1242
Connector/NET Reference
Syntax: C#
public System.Data.DbType DbType {get; set;}
Implements IDataParameter.DbType See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.3. Direction Property Gets or sets a value indicating whether the parameter is input-only, output-only, bidirectional, or a stored procedure return value parameter. As of MySql version 4.1 and earlier, input-only is the only valid choice. Syntax: Visual Basic
NotOverridable Public Property Direction As ParameterDirection _ _ Implements IDataParameter.Direction
Syntax: C#
public System.Data.ParameterDirection Direction {get; set;}
Implements IDataParameter.Direction See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.4. IsNullable Property Gets or sets a value indicating whether the parameter accepts null values. Syntax: Visual Basic
NotOverridable Public Property IsNullable As Boolean _ _ Implements IDataParameter.IsNullable
Syntax: C#
public bool IsNullable {get; set;}
Implements IDataParameter.IsNullable See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.5. IsUnsigned Property Syntax: Visual Basic
1243
Connector/NET Reference
Syntax: C#
public bool IsUnsigned {get; set;}
See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.6. MySqlDbType Property Gets or sets the MySqlDbType of the parameter. Syntax: Visual Basic
Public Property MySqlDbType As MySqlDbType
Syntax: C#
public MySqlDbType MySqlDbType {get; set;}
See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.7. ParameterName Property Gets or sets the name of the MySqlParameter. Syntax: Visual Basic
NotOverridable Public Property ParameterName As String _ _ Implements IDataParameter.ParameterName
Syntax: C#
public string ParameterName {get; set;}
Implements IDataParameter.ParameterName See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.8. Precision Property Gets or sets the maximum number of digits used to represent the Value property. Syntax: Visual Basic
NotOverridable Public Property Precision As Byte _ _ Implements IDbDataParameter.Precision
Syntax: C#
public byte Precision {get; set;}
1244
Connector/NET Reference
MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.9. Scale Property Gets or sets the number of decimal places to which Value is resolved. Syntax: Visual Basic
NotOverridable Public Property Scale As Byte _ _ Implements IDbDataParameter.Scale
Syntax: C#
public byte Scale {get; set;}
Implements IDbDataParameter.Scale See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.10. Size Property Gets or sets the maximum size, in bytes, of the data within the column. Syntax: Visual Basic
NotOverridable Public Property Size As Integer _ _ Implements IDbDataParameter.Size
Syntax: C#
public int Size {get; set;}
Implements IDbDataParameter.Size See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.11. SourceColumn Property Gets or sets the name of the source column that is mapped to the DataSetand used for loading or returning the Value . Syntax: Visual Basic
NotOverridable Public Property SourceColumn As String _ _ Implements IDataParameter.SourceColumn
Syntax: C#
public string SourceColumn {get; set;}
1245
Connector/NET Reference
MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.12. SourceVersion Property Gets or sets the DataRowVersionto use when loading Value . Syntax: Visual Basic
NotOverridable Public Property SourceVersion As DataRowVersion _ _ Implements IDataParameter.SourceVersion
Syntax: C#
public System.Data.DataRowVersion SourceVersion {get; set;}
Implements IDataParameter.SourceVersion See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.1.1.13. MySqlParameter.ToString Method Overridden. Gets a string containing the ParameterName . Syntax: Visual Basic
Overrides Public Function ToString() As String
Syntax: C#
public override string ToString();
Return Value See Also MySqlParameter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.3.2. Item Property (Int32) Gets the MySqlParameter at the specified index. Syntax: Visual Basic
Overloads Public Default Property Item( _ ByVal index As Integer _ ) As MySqlParameter
Syntax: C#
public MySqlParameter this[ intindex ] {get; set;}
See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.Item Overload List 25.2.4.1.2.1.7.1.1.3.3. Item Property (String) Gets the MySqlParameter with the specified name.
1246
Connector/NET Reference
Syntax: C#
public MySqlParameter this[ stringname ] {get; set;}
See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.Item Overload List 25.2.4.1.2.1.7.1.1.4. Add Method Adds the specified MySqlParameter object to the MySqlParameterCollection . Overload List Adds the specified MySqlParameter object to the MySqlParameterCollection . public MySqlParameter Add(MySqlParameter); Adds the specified MySqlParameter object to the MySqlParameterCollection . public int Add(object); Adds a MySqlParameter to the MySqlParameterCollection given the parameter name and the data type. public MySqlParameter Add(string,MySqlDbType); Adds a MySqlParameter to the MySqlParameterCollection with the parameter name, the data type, and the column length. public MySqlParameter Add(string,MySqlDbType,int); Adds a MySqlParameter to the MySqlParameterCollection with the parameter name, the data type, the column length, and the source column name. public MySqlParameter Add(string,MySqlDbType,int,string); Adds a MySqlParameter to the MySqlParameterCollection given the specified parameter name and value. public MySqlParameter Add(string,object); See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.4.1. MySqlParameterCollection.Add Method (MySqlParameter) Adds the specified MySqlParameter object to the MySqlParameterCollection . Syntax: Visual Basic
Overloads Public Function Add( _ ByVal value As MySqlParameter _ ) As MySqlParameter
Syntax: C#
1247
Connector/NET Reference
Parameters value: The MySqlParameter to add to the collection. Return Value The newly added MySqlParameter object. See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.Add Overload List 25.2.4.1.2.1.7.1.1.4.2. MySqlParameterCollection.Add Method (Object) Adds the specified MySqlParameter object to the MySqlParameterCollection . Syntax: Visual Basic
NotOverridable Overloads Public Function Add( _ ByVal value As Object _ ) As Integer _ _ Implements IList.Add
Syntax: C#
public int Add( objectvalue );
Parameters value: The MySqlParameter to add to the collection. Return Value The index of the new MySqlParameter object. Implements IList.Add See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.Add Overload List 25.2.4.1.2.1.7.1.1.4.3. MySqlParameterCollection.Add Method (String, MySqlDbType) Adds a MySqlParameter to the MySqlParameterCollection given the parameter name and the data type. Syntax: Visual Basic
Overloads Public Function Add( _ ByVal parameterName As String, _ ByVal dbType As MySqlDbType _ ) As MySqlParameter
Syntax: C#
1248
Connector/NET Reference
Parameters parameterName: The name of the parameter. dbType: One of the MySqlDbType values. Return Value The newly added MySqlParameter object. See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.Add Overload List 25.2.4.1.2.1.7.1.1.4.4. MySqlParameterCollection.Add Method (String, MySqlDbType, Int32) Adds a MySqlParameter to the MySqlParameterCollection with the parameter name, the data type, and the column length. Syntax: Visual Basic
Overloads Public Function Add( _ ByVal parameterName As String, _ ByVal dbType As MySqlDbType, _ ByVal size As Integer _ ) As MySqlParameter
Syntax: C#
public MySqlParameter Add( stringparameterName, MySqlDbTypedbType, intsize );
Parameters parameterName: The name of the parameter. dbType: One of the MySqlDbType values. size: The length of the column. Return Value The newly added MySqlParameter object. See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.Add Overload List 25.2.4.1.2.1.7.1.1.4.5. MySqlParameterCollection.Add Method (String, MySqlDbType, Int32, String) Adds a MySqlParameter to the MySqlParameterCollection with the parameter name, the data type, the column length, and the source column name. Syntax: Visual Basic
Overloads Public Function Add( _
1249
Connector/NET Reference
ByVal parameterName As String, _ ByVal dbType As MySqlDbType, _ ByVal size As Integer, _ ByVal sourceColumn As String _ ) As MySqlParameter
Syntax: C#
public MySqlParameter Add( stringparameterName, MySqlDbTypedbType, intsize, stringsourceColumn );
Parameters parameterName: The name of the parameter. dbType: One of the MySqlDbType values. size: The length of the column. sourceColumn: The name of the source column. Return Value The newly added MySqlParameter object. See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.Add Overload List 25.2.4.1.2.1.7.1.1.4.6. MySqlParameterCollection.Add Method (String, Object) Adds a MySqlParameter to the MySqlParameterCollection given the specified parameter name and value. Syntax: Visual Basic
Overloads Public Function Add( _ ByVal parameterName As String, _ ByVal value As Object _ ) As MySqlParameter
Syntax: C#
public MySqlParameter Add( stringparameterName, objectvalue );
Parameters parameterName: The name of the parameter. value: The Value of the MySqlParameter to add to the collection. Return Value The newly added MySqlParameter object. See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.Add Overload List
1250
Connector/NET Reference
25.2.4.1.2.1.7.1.1.5. MySqlParameterCollection.Clear Method Removes all items from the collection. Syntax: Visual Basic
NotOverridable Public Sub Clear() _ _ Implements IList.Clear
Syntax: C#
public void Clear();
Implements IList.Clear See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.6. Contains Method Gets a value indicating whether a MySqlParameter exists in the collection. Overload List Gets a value indicating whether a MySqlParameter exists in the collection. public bool Contains(object); Gets a value indicating whether a MySqlParameter with the specified parameter name exists in the collection. public bool Contains(string); See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.6.1. MySqlParameterCollection.Contains Method (Object) Gets a value indicating whether a MySqlParameter exists in the collection. Syntax: Visual Basic
NotOverridable Overloads Public Function Contains( _ ByVal value As Object _ ) As Boolean _ _ Implements IList.Contains
Syntax: C#
public bool Contains( objectvalue );
Parameters value: The value of the MySqlParameter object to find. Return Value true if the collection contains the MySqlParameter object; otherwise, false.
1251
Connector/NET Reference
Implements IList.Contains See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.Contains Overload List 25.2.4.1.2.1.7.1.1.6.2. MySqlParameterCollection.Contains Method (String) Gets a value indicating whether a MySqlParameter with the specified parameter name exists in the collection. Syntax: Visual Basic
NotOverridable Overloads Public Function Contains( _ ByVal name As String _ ) As Boolean _ _ Implements IDataParameterCollection.Contains
Syntax: C#
public bool Contains( stringname );
Parameters name: The name of the MySqlParameter object to find. Return Value true if the collection contains the parameter; otherwise, false. Implements IDataParameterCollection.Contains See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.Contains Overload List 25.2.4.1.2.1.7.1.1.7. MySqlParameterCollection.CopyTo Method Copies MySqlParameter objects from the MySqlParameterCollection to the specified array. Syntax: Visual Basic
NotOverridable Public Sub CopyTo( _ ByVal array As Array, _ ByVal index As Integer _ ) _ _ Implements ICollection.CopyTo
Syntax: C#
public void CopyTo( Arrayarray, intindex );
Parameters
1252
Connector/NET Reference
array: index: Implements ICollection.CopyTo See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.8. IndexOf Method Gets the location of a MySqlParameter in the collection. Overload List Gets the location of a MySqlParameter in the collection. public int IndexOf(object); Gets the location of the MySqlParameter in the collection with a specific parameter name. public int IndexOf(string); See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.8.1. MySqlParameterCollection.IndexOf Method (Object) Gets the location of a MySqlParameter in the collection. Syntax: Visual Basic
NotOverridable Overloads Public Function IndexOf( _ ByVal value As Object _ ) As Integer _ _ Implements IList.IndexOf
Syntax: C#
public int IndexOf( objectvalue );
Parameters value: The MySqlParameter object to locate. Return Value The zero-based location of the MySqlParameter in the collection. Implements IList.IndexOf See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.IndexOf Overload List
1253
Connector/NET Reference
25.2.4.1.2.1.7.1.1.8.2. MySqlParameterCollection.IndexOf Method (String) Gets the location of the MySqlParameter in the collection with a specific parameter name. Syntax: Visual Basic
NotOverridable Overloads Public Function IndexOf( _ ByVal parameterName As String _ ) As Integer _ _ Implements IDataParameterCollection.IndexOf
Syntax: C#
public int IndexOf( stringparameterName );
Parameters parameterName: The name of the MySqlParameter object to retrieve. Return Value The zero-based location of the MySqlParameter in the collection. Implements IDataParameterCollection.IndexOf See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.IndexOf Overload List 25.2.4.1.2.1.7.1.1.9. MySqlParameterCollection.Insert Method Inserts a MySqlParameter into the collection at the specified index. Syntax: Visual Basic
NotOverridable Public Sub Insert( _ ByVal index As Integer, _ ByVal value As Object _ ) _ _ Implements IList.Insert
Syntax: C#
public void Insert( intindex, objectvalue );
1254
Connector/NET Reference
MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.10. MySqlParameterCollection.Remove Method Removes the specified MySqlParameter from the collection. Syntax: Visual Basic
NotOverridable Public Sub Remove( _ ByVal value As Object _ ) _ _ Implements IList.Remove
Syntax: C#
public void Remove( objectvalue );
Parameters value: Implements IList.Remove See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.11. RemoveAt Method Removes the specified MySqlParameter from the collection. Overload List Removes the specified MySqlParameter from the collection using a specific index. public void RemoveAt(int); Removes the specified MySqlParameter from the collection using the parameter name. public void RemoveAt(string); See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.7.1.1.11.1. MySqlParameterCollection.RemoveAt Method (Int32) Removes the specified MySqlParameter from the collection using a specific index. Syntax: Visual Basic
NotOverridable Overloads Public Sub RemoveAt( _ ByVal index As Integer _ ) _ _ Implements IList.RemoveAt
Syntax: C#
public void RemoveAt( intindex );
1255
Connector/NET Reference
Parameters index: The zero-based index of the parameter. Implements IList.RemoveAt See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.RemoveAt Overload List 25.2.4.1.2.1.7.1.1.11.2. MySqlParameterCollection.RemoveAt Method (String) Removes the specified MySqlParameter from the collection using the parameter name. Syntax: Visual Basic
NotOverridable Overloads Public Sub RemoveAt( _ ByVal name As String _ ) _ _ Implements IDataParameterCollection.RemoveAt
Syntax: C#
public void RemoveAt( stringname );
Parameters name: The name of the MySqlParameter object to retrieve. Implements IDataParameterCollection.RemoveAt See Also MySqlParameterCollection Class , MySql.Data.MySqlClient Namespace , MySqlParameterCollection.RemoveAt Overload List 25.2.4.1.2.1.8. Transaction Property Syntax: Visual Basic
Public Property Transaction As MySqlTransaction
Syntax: C#
public MySqlTransaction Transaction {get; set;}
See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.9. UpdatedRowSource Property Syntax: Visual Basic
NotOverridable Public Property UpdatedRowSource As UpdateRowSource _ _ Implements IDbCommand.UpdatedRowSource
Syntax: C#
1256
Connector/NET Reference
Implements IDbCommand.UpdatedRowSource See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.10. MySqlCommand.Cancel Method Attempts to cancel the execution of a MySqlCommand. This operation is not supported. Syntax: Visual Basic
NotOverridable Public Sub Cancel() _ _ Implements IDbCommand.Cancel
Syntax: C#
public void Cancel();
Implements IDbCommand.Cancel Remarks Cancelling an executing command is currently not supported on any version of MySQL. Exceptions Exception Type NotSupportedException See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.11. MySqlCommand.CreateParameter Method Creates a new instance of a MySqlParameter object. Syntax: Visual Basic
Public Function CreateParameter() As MySqlParameter
Syntax: C#
public MySqlParameter CreateParameter();
Return Value A MySqlParameter object. Remarks This method is a strongly-typed version of CreateParameter. See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace
1257
Connector/NET Reference
Syntax: C#
public int ExecuteNonQuery();
Implements IDbCommand.ExecuteNonQuery See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13. ExecuteReader Method Overload List public MySqlDataReader ExecuteReader(); public MySqlDataReader ExecuteReader(CommandBehavior); See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1. MySqlCommand.ExecuteReader Method () Syntax: Visual Basic
Overloads Public Function ExecuteReader() As MySqlDataReader
Syntax: C#
public MySqlDataReader ExecuteReader();
See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace , MySqlCommand.ExecuteReader Overload List 25.2.4.1.2.1.13.1.1. MySqlDataReader Class Provides a means of reading a forward-only stream of rows from a MySQL database. This class cannot be inherited. For a list of all members of this type, see MySqlDataReader Members . Syntax: Visual Basic
NotInheritable Public Class MySqlDataReader_ Inherits MarshalByRefObject_ Implements IEnumerable, IDataReader, IDisposable, IDataRecord
Syntax: C#
Thread Safety
1258
Connector/NET Reference
Public static (Shared in Visual Basic) members of this type are safe for multithreaded operations. Instance members are not guaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlDataReader Members , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1. MySqlDataReader Members MySqlDataReader overview Public Instance Properties Depth Gets a value indicating the depth of nesting for the current row. This method is not supported currently and always returns 0. Gets the number of columns in the current row. Gets a value indicating whether the MySqlDataReader contains one or more rows. Gets a value indicating whether the data reader is closed. Overloaded. Overloaded. Gets the value of a column in its native format. In C#, this property is the indexer for the MySqlDataReader class. Gets the number of rows changed, inserted, or deleted by execution of the SQL statement.
RecordsAffected
CreateObjRef(inherited from MarshalByRefObject) Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. Equals(inherited from Object) GetBoolean GetByte GetBytes Determines whether the specified Objectis equal to the current Object. Gets the value of the specified column as a Boolean. Gets the value of the specified column as a byte. Reads a stream of bytes from the specified column offset into the buffer an array starting at the given buffer offset. Gets the value of the specified column as a single character. Reads a stream of characters from the specified column offset into the buffer as an array starting at the given buffer offset. Gets the name of the source data type.
GetChar GetChars
GetDataTypeName GetDateTime
1259
Connector/NET Reference
GetDecimal GetDouble GetFieldType GetFloat GetGuid GetHashCode(inherited from Object) Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Gets the Type that is the data type of the object.
GetInt16 GetInt32 GetInt64 GetLifetimeService(inherited from MarshalByRefObject) GetMySqlDateTime GetName GetOrdinal GetSchemaTable GetString GetTimeSpan GetType(inherited from Object) GetUInt16 GetUInt32 GetUInt64 GetValue GetValues InitializeLifetimeService(inherited from MarshalByRefObject) IsDBNull NextResult Read ToString(inherited from Object) See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.1. Depth Property Gets a value indicating the depth of nesting for the current row. This method is not supported currently and always returns 0. Syntax: Visual Basic Gets the value of the specified column in its native format. Gets all attribute columns in the collection for the current row. Obtains a lifetime service object to control the lifetime policy for this instance. Gets a value indicating whether the column contains non-existent or missing values. Advances the data reader to the next result, when reading the results of batch SQL statements. Advances the MySqlDataReader to the next record. Returns a Stringthat represents the current Object. Gets the Typeof the current instance. Gets the name of the specified column. Gets the column ordinal, given the name of the column. Returns a DataTable that describes the column metadata of the MySqlDataReader. Retrieves the current lifetime service object that controls the lifetime policy for this instance.
1260
Connector/NET Reference
Syntax: C#
public int Depth {get;}
Implements IDataReader.Depth See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.2. FieldCount Property Gets the number of columns in the current row. Syntax: Visual Basic
NotOverridable Public ReadOnly Property FieldCount As Integer _ _ Implements IDataRecord.FieldCount
Syntax: C#
public int FieldCount {get;}
Implements IDataRecord.FieldCount See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.3. HasRows Property Gets a value indicating whether the MySqlDataReader contains one or more rows. Syntax: Visual Basic
Public ReadOnly Property HasRows As Boolean
Syntax: C#
public bool HasRows {get;}
See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.4. IsClosed Property Gets a value indicating whether the data reader is closed. Syntax: Visual Basic
NotOverridable Public ReadOnly Property IsClosed As Boolean _ _ Implements IDataReader.IsClosed
Syntax: C#
1261
Connector/NET Reference
Implements IDataReader.IsClosed See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.5. Item Property Overloaded. Gets the value of a column in its native format. In C#, this property is the indexer for the MySqlDataReader class. Overload List Overloaded. Gets the value of a column in its native format. In C#, this property is the indexer for the MySqlDataReader class. public object this[int] {get;} Gets the value of a column in its native format. In C#, this property is the indexer for the MySqlDataReader class. public object this[string] {get;} See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.5.1. Item Property (Int32) Overloaded. Gets the value of a column in its native format. In C#, this property is the indexer for the MySqlDataReader class. Syntax: Visual Basic
NotOverridable Overloads Public Default ReadOnly Property Item( _ ByVal i As Integer _ ) _ _ Implements IDataRecord.Item As Object _ _ Implements IDataRecord.Item
Syntax: C#
public object this[ inti ] {get;}
Implements IDataRecord.Item See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace , MySqlDataReader.Item Overload List 25.2.4.1.2.1.13.1.1.1.5.2. Item Property (String) Gets the value of a column in its native format. In C#, this property is the indexer for the MySqlDataReader class.
1262
Connector/NET Reference
Syntax: C#
public object this[ stringname ] {get;}
Implements IDataRecord.Item See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace , MySqlDataReader.Item Overload List 25.2.4.1.2.1.13.1.1.1.6. RecordsAffected Property Gets the number of rows changed, inserted, or deleted by execution of the SQL statement. Syntax: Visual Basic
NotOverridable Public ReadOnly Property RecordsAffected As Integer _ _ Implements IDataReader.RecordsAffected
Syntax: C#
public int RecordsAffected {get;}
Implements IDataReader.RecordsAffected See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.7. MySqlDataReader.Close Method Closes the MySqlDataReader object. Syntax: Visual Basic
NotOverridable Public Sub Close() _ _ Implements IDataReader.Close
Syntax: C#
public void Close();
1263
Connector/NET Reference
MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.8. MySqlDataReader.GetBoolean Method Gets the value of the specified column as a Boolean. Syntax: Visual Basic
NotOverridable Public Function GetBoolean( _ ByVal i As Integer _ ) As Boolean _ _ Implements IDataRecord.GetBoolean
Syntax: C#
public bool GetBoolean( inti );
Parameters i: Return Value Implements IDataRecord.GetBoolean See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.9. MySqlDataReader.GetByte Method Gets the value of the specified column as a byte. Syntax: Visual Basic
NotOverridable Public Function GetByte( _ ByVal i As Integer _ ) As Byte _ _ Implements IDataRecord.GetByte
Syntax: C#
public byte GetByte( inti );
Parameters i: Return Value Implements IDataRecord.GetByte See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace
1264
Connector/NET Reference
25.2.4.1.2.1.13.1.1.1.10. MySqlDataReader.GetBytes Method Reads a stream of bytes from the specified column offset into the buffer an array starting at the given buffer offset. Syntax: Visual Basic
NotOverridable Public Function GetBytes( _ ByVal i As Integer, _ ByVal dataIndex As Long, _ ByVal buffer As Byte(), _ ByVal bufferIndex As Integer, _ ByVal length As Integer _ ) As Long _ _ Implements IDataRecord.GetBytes
Syntax: C#
public long GetBytes( inti, longdataIndex, byte[]buffer, intbufferIndex, intlength );
Parameters i: The zero-based column ordinal. dataIndex: The index within the field from which to begin the read operation. buffer: The buffer into which to read the stream of bytes. bufferIndex: The index for buffer to begin the read operation. length: The maximum length to copy into the buffer. Return Value The actual number of bytes read. Implements IDataRecord.GetBytes See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.11. MySqlDataReader.GetChar Method Gets the value of the specified column as a single character. Syntax: Visual Basic
NotOverridable Public Function GetChar( _ ByVal i As Integer _ ) As Char _ _ Implements IDataRecord.GetChar
Syntax: C#
public char GetChar(
1265
Connector/NET Reference
inti );
Parameters i: Return Value Implements IDataRecord.GetChar See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.12. MySqlDataReader.GetChars Method Reads a stream of characters from the specified column offset into the buffer as an array starting at the given buffer offset. Syntax: Visual Basic
NotOverridable Public Function GetChars( _ ByVal i As Integer, _ ByVal fieldOffset As Long, _ ByVal buffer As Char(), _ ByVal bufferoffset As Integer, _ ByVal length As Integer _ ) As Long _ _ Implements IDataRecord.GetChars
Syntax: C#
public long GetChars( inti, longfieldOffset, char[]buffer, intbufferoffset, intlength );
Parameters i: fieldOffset: buffer: bufferoffset: length: Return Value Implements IDataRecord.GetChars See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace
1266
Connector/NET Reference
25.2.4.1.2.1.13.1.1.1.13. MySqlDataReader.GetDataTypeName Method Gets the name of the source data type. Syntax: Visual Basic
NotOverridable Public Function GetDataTypeName( _ ByVal i As Integer _ ) As String _ _ Implements IDataRecord.GetDataTypeName
Syntax: C#
public string GetDataTypeName( inti );
Parameters i: Return Value Implements IDataRecord.GetDataTypeName See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.14. MySqlDataReader.GetDateTime Method Syntax: Visual Basic
NotOverridable Public Function GetDateTime( _ ByVal index As Integer _ ) As Date _ _ Implements IDataRecord.GetDateTime
Syntax: C#
public DateTime GetDateTime( intindex );
Implements IDataRecord.GetDateTime See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.15. MySqlDataReader.GetDecimal Method Syntax: Visual Basic
NotOverridable Public Function GetDecimal( _ ByVal index As Integer _ ) As Decimal _ _ Implements IDataRecord.GetDecimal
Syntax: C#
1267
Connector/NET Reference
Implements IDataRecord.GetDecimal See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.16. MySqlDataReader.GetDouble Method Syntax: Visual Basic
NotOverridable Public Function GetDouble( _ ByVal index As Integer _ ) As Double _ _ Implements IDataRecord.GetDouble
Syntax: C#
public double GetDouble( intindex );
Implements IDataRecord.GetDouble See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.17. MySqlDataReader.GetFieldType Method Gets the Type that is the data type of the object. Syntax: Visual Basic
NotOverridable Public Function GetFieldType( _ ByVal i As Integer _ ) As Type _ _ Implements IDataRecord.GetFieldType
Syntax: C#
public Type GetFieldType( inti );
1268
Connector/NET Reference
MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.18. MySqlDataReader.GetFloat Method Syntax: Visual Basic
NotOverridable Public Function GetFloat( _ ByVal index As Integer _ ) As Single _ _ Implements IDataRecord.GetFloat
Syntax: C#
public float GetFloat( intindex );
Implements IDataRecord.GetFloat See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.19. MySqlDataReader.GetGuid Method Syntax: Visual Basic
NotOverridable Public Function GetGuid( _ ByVal index As Integer _ ) As Guid _ _ Implements IDataRecord.GetGuid
Syntax: C#
public Guid GetGuid( intindex );
Implements IDataRecord.GetGuid See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.20. MySqlDataReader.GetInt16 Method Syntax: Visual Basic
NotOverridable Public Function GetInt16( _ ByVal index As Integer _ ) As Short _ _ Implements IDataRecord.GetInt16
Syntax: C#
public short GetInt16( intindex );
Implements
1269
Connector/NET Reference
IDataRecord.GetInt16 See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.21. MySqlDataReader.GetInt32 Method Syntax: Visual Basic
NotOverridable Public Function GetInt32( _ ByVal index As Integer _ ) As Integer _ _ Implements IDataRecord.GetInt32
Syntax: C#
public int GetInt32( intindex );
Implements IDataRecord.GetInt32 See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.22. MySqlDataReader.GetInt64 Method Syntax: Visual Basic
NotOverridable Public Function GetInt64( _ ByVal index As Integer _ ) As Long _ _ Implements IDataRecord.GetInt64
Syntax: C#
public long GetInt64( intindex );
Implements IDataRecord.GetInt64 See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.23. MySqlDataReader.GetMySqlDateTime Method Syntax: Visual Basic
Public Function GetMySqlDateTime( _ ByVal index As Integer _ ) As MySqlDateTime
Syntax: C#
public MySqlDateTime GetMySqlDateTime( intindex
1270
Connector/NET Reference
);
See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.24. MySqlDataReader.GetName Method Gets the name of the specified column. Syntax: Visual Basic
NotOverridable Public Function GetName( _ ByVal i As Integer _ ) As String _ _ Implements IDataRecord.GetName
Syntax: C#
public string GetName( inti );
Parameters i: Return Value Implements IDataRecord.GetName See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.25. MySqlDataReader.GetOrdinal Method Gets the column ordinal, given the name of the column. Syntax: Visual Basic
NotOverridable Public Function GetOrdinal( _ ByVal name As String _ ) As Integer _ _ Implements IDataRecord.GetOrdinal
Syntax: C#
public int GetOrdinal( stringname );
1271
Connector/NET Reference
See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.26. MySqlDataReader.GetSchemaTable Method Returns a DataTable that describes the column metadata of the MySqlDataReader. Syntax: Visual Basic
NotOverridable Public Function GetSchemaTable() As DataTable _ _ Implements IDataReader.GetSchemaTable
Syntax: C#
public DataTable GetSchemaTable();
Return Value Implements IDataReader.GetSchemaTable See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.27. MySqlDataReader.GetString Method Syntax: Visual Basic
NotOverridable Public Function GetString( _ ByVal index As Integer _ ) As String _ _ Implements IDataRecord.GetString
Syntax: C#
public string GetString( intindex );
Implements IDataRecord.GetString See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.28. MySqlDataReader.GetTimeSpan Method Syntax: Visual Basic
Public Function GetTimeSpan( _ ByVal index As Integer _ ) As TimeSpan
Syntax: C#
public TimeSpan GetTimeSpan( intindex );
1272
Connector/NET Reference
See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.29. MySqlDataReader.GetUInt16 Method Syntax: Visual Basic
Public Function GetUInt16( _ ByVal index As Integer _ ) As UInt16
Syntax: C#
public ushort GetUInt16( intindex );
See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.30. MySqlDataReader.GetUInt32 Method Syntax: Visual Basic
Public Function GetUInt32( _ ByVal index As Integer _ ) As UInt32
Syntax: C#
public uint GetUInt32( intindex );
See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.31. MySqlDataReader.GetUInt64 Method Syntax: Visual Basic
Public Function GetUInt64( _ ByVal index As Integer _ ) As UInt64
Syntax: C#
public ulong GetUInt64( intindex );
See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.32. MySqlDataReader.GetValue Method Gets the value of the specified column in its native format. Syntax: Visual Basic
NotOverridable Public Function GetValue( _ ByVal i As Integer _
1273
Connector/NET Reference
Syntax: C#
public object GetValue( inti );
Parameters i: Return Value Implements IDataRecord.GetValue See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.33. MySqlDataReader.GetValues Method Gets all attribute columns in the collection for the current row. Syntax: Visual Basic
NotOverridable Public Function GetValues( _ ByVal values As Object() _ ) As Integer _ _ Implements IDataRecord.GetValues
Syntax: C#
public int GetValues( object[]values );
Parameters values: Return Value Implements IDataRecord.GetValues See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.34. MySqlDataReader.IsDBNull Method Gets a value indicating whether the column contains non-existent or missing values. Syntax: Visual Basic
NotOverridable Public Function IsDBNull( _ ByVal i As Integer _ ) As Boolean _
1274
Connector/NET Reference
_ Implements IDataRecord.IsDBNull
Syntax: C#
public bool IsDBNull( inti );
Parameters i: Return Value Implements IDataRecord.IsDBNull See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.35. MySqlDataReader.NextResult Method Advances the data reader to the next result, when reading the results of batch SQL statements. Syntax: Visual Basic
NotOverridable Public Function NextResult() As Boolean _ _ Implements IDataReader.NextResult
Syntax: C#
public bool NextResult();
Return Value Implements IDataReader.NextResult See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.1.1.1.36. MySqlDataReader.Read Method Advances the MySqlDataReader to the next record. Syntax: Visual Basic
NotOverridable Public Function Read() As Boolean _ _ Implements IDataReader.Read
Syntax: C#
public bool Read();
1275
Connector/NET Reference
IDataReader.Read See Also MySqlDataReader Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.13.2. MySqlCommand.ExecuteReader Method (CommandBehavior) Syntax: Visual Basic
Overloads Public Function ExecuteReader( _ ByVal behavior As CommandBehavior _ ) As MySqlDataReader
Syntax: C#
public MySqlDataReader ExecuteReader( CommandBehaviorbehavior );
See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace , MySqlCommand.ExecuteReader Overload List 25.2.4.1.2.1.14. MySqlCommand.ExecuteScalar Method Syntax: Visual Basic
NotOverridable Public Function ExecuteScalar() As Object _ _ Implements IDbCommand.ExecuteScalar
Syntax: C#
public object ExecuteScalar();
Implements IDbCommand.ExecuteScalar See Also MySqlCommand Class , MySql.Data.MySqlClient Namespace 25.2.4.1.2.1.15. MySqlCommand.Prepare Method Syntax: Visual Basic
NotOverridable Public Sub Prepare() _ _ Implements IDbCommand.Prepare
Syntax: C#
public void Prepare();
1276
Connector/NET Reference
Syntax: C#
public sealed class MySqlCommandBuilder : Component
Thread Safety Public static (Sharedin Visual Basic) members of this type are safe for multithreaded operations. Instance members are notguaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlCommandBuilder Members , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1. MySqlCommandBuilder Members MySqlCommandBuilder overview Public Static (Shared) Methods DeriveParameters Overloaded. Retrieves parameter information from the stored procedure specified in the MySqlCommand and populates the Parameters collection of the specified MySqlCommand object. This method is not currently supported since stored procedures are not available in MySql.
Public Instance Constructors MySqlCommandBuilder Overloaded. Initializes a new instance of the MySqlCommandBuilder class.
Public Instance Properties Container(inherited from Component) DataAdapter QuotePrefix QuoteSuffix Site(inherited from Component) Public Instance Methods CreateObjRef(inherited from MarshalByRefObject) Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. Gets or sets the ISiteof the Component. Gets the IContainerthat contains the Component.
1277
Connector/NET Reference
Dispose(inherited from Component) Equals(inherited from Object) GetDeleteCommand GetHashCode(inherited from Object)
Releases all resources used by the Component. Determines whether the specified Objectis equal to the current Object. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Retrieves the current lifetime service object that controls the lifetime policy for this instance. Gets the Typeof the current instance. Obtains a lifetime service object to control the lifetime policy for this instance. Returns a Stringcontaining the name of the Component, if any. This method should not be overridden.
GetInsertCommand GetLifetimeService(inherited from MarshalByRefObject) GetType(inherited from Object) GetUpdateCommand InitializeLifetimeService(inherited from MarshalByRefObject) RefreshSchema ToString(inherited from Component)
Public Instance Events Disposed(inherited from Component) Adds an event handler to listen to the Disposedevent on the component.
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.1. DeriveParameters Method Retrieves parameter information from the stored procedure specified in the MySqlCommand and populates the Parameters collection of the specified MySqlCommand object. This method is not currently supported since stored procedures are not available in MySql. Overload List Retrieves parameter information from the stored procedure specified in the MySqlCommand and populates the Parameters collection of the specified MySqlCommand object. This method is not currently supported since stored procedures are not available in MySql. public static void DeriveParameters(MySqlCommand); public static void DeriveParameters(MySqlCommand,bool); See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.1.1. MySqlCommandBuilder.DeriveParameters Method (MySqlCommand) Retrieves parameter information from the stored procedure specified in the MySqlCommand and populates the Parameters collection of the specified MySqlCommand object. This method is not currently supported since stored procedures are not available in MySql. Syntax: Visual Basic
Overloads Public Shared Sub DeriveParameters( _
1278
Connector/NET Reference
Syntax: C#
public static void DeriveParameters( MySqlCommandcommand );
Parameters command: The MySqlCommand referencing the stored procedure from which the parameter information is to be derived. The derived parameters are added to the Parameters collection of the MySqlCommand. Exceptions Exception Type InvalidOperationException Condition The command text is not a valid stored procedure name.
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace , MySqlCommandBuilder.DeriveParameters Overload List 25.2.4.1.3.1.1.2. MySqlCommandBuilder.DeriveParameters Method (MySqlCommand, Boolean) Syntax: Visual Basic
Overloads Public Shared Sub DeriveParameters( _ ByVal command As MySqlCommand, _ ByVal useProc As Boolean _ )
Syntax: C#
public static void DeriveParameters( MySqlCommandcommand, booluseProc );
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace , MySqlCommandBuilder.DeriveParameters Overload List 25.2.4.1.3.1.2. MySqlCommandBuilder Constructor Initializes a new instance of the MySqlCommandBuilder class. Overload List Initializes a new instance of the MySqlCommandBuilder class. public MySqlCommandBuilder(); public MySqlCommandBuilder(MySqlDataAdapter); public MySqlCommandBuilder(MySqlDataAdapter,bool); public MySqlCommandBuilder(bool); See Also
1279
Connector/NET Reference
MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.1. MySqlCommandBuilder Constructor () Initializes a new instance of the MySqlCommandBuilder class. Syntax: Visual Basic
Overloads Public Sub New()
Syntax: C#
public MySqlCommandBuilder();
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace , MySqlCommandBuilder Constructor Overload List 25.2.4.1.3.1.2.2. MySqlCommandBuilder Constructor (MySqlDataAdapter) Syntax: Visual Basic
Overloads Public Sub New( _ ByVal adapter As MySqlDataAdapter _ )
Syntax: C#
public MySqlCommandBuilder( MySqlDataAdapteradapter );
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace , MySqlCommandBuilder Constructor Overload List 25.2.4.1.3.1.2.2.1. MySqlDataAdapter Class For a list of all members of this type, see MySqlDataAdapter Members . Syntax: Visual Basic
NotInheritable Public Class MySqlDataAdapter_ Inherits DbDataAdapter
Syntax: C#
public sealed class MySqlDataAdapter : DbDataAdapter
Thread Safety Public static (Sharedin Visual Basic) members of this type are safe for multithreaded operations. Instance members are notguaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlDataAdapter Members , MySql.Data.MySqlClient Namespace
1280
Connector/NET Reference
25.2.4.1.3.1.2.2.1.1. MySqlDataAdapter Members MySqlDataAdapter overview Public Instance Constructors MySqlDataAdapter Overloaded. Initializes a new instance of the MySqlDataAdapter class.
Public Instance Properties AcceptChangesDuringFill(inherited from DataAdapter) Gets or sets a value indicating whether AcceptChangesis called on a DataRowafter it is added to the DataTableduring any of the Fill operations. Gets or sets whether AcceptChangesis called during a Update. Gets the IContainerthat contains the Component. Gets or sets a value that specifies whether to generate an exception when an error is encountered during a row update. Overloaded. Gets or sets the LoadOptionthat determines how the adapter fills the DataTablefrom the DbDataReader. Overloaded. Determines the action to take when incoming data does not have a matching table or column. Determines the action to take when existing DataSetschema does not match incoming data. Gets or sets whether the Fillmethod should return provider-specific values or common CLScompliant values. Overloaded. Gets or sets the ISiteof the Component. Gets a collection that provides the master mapping between a source table and a DataTable. Gets or sets a value that enables or disables batch processing support, and specifies the number of commands that can be executed in a batch. Overloaded.
AcceptChangesDuringUpdate(inherited from DataAdapter) Container(inherited from Component) ContinueUpdateOnError(inherited from DataAdapter) DeleteCommand FillLoadOption(inherited from DataAdapter)
InsertCommand MissingMappingAction(inherited from DataAdapter) MissingSchemaAction(inherited from DataAdapter) ReturnProviderSpecificTypes(inherited from DataAdapter) SelectCommand Site(inherited from Component) TableMappings(inherited from DataAdapter) UpdateBatchSize(inherited from DbDataAdapter)
CreateObjRef(inherited from MarshalByRefObject) Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. Dispose(inherited from Component) Equals(inherited from Object) Releases all resources used by the Component. Determines whether the specified Objectis equal to the current Object.
1281
Connector/NET Reference
Overloaded. Adds or refreshes rows in the DataSetto match those in the data source using the DataSetname, and creates a DataTablenamed "Table." Overloaded. Configures the schema of the specified DataTablebased on the specified SchemaType.
GetFillParameters(inherited from DbDataAdapter) Gets the parameters set by the user when executing an SQL SELECT statement. GetHashCode(inherited from Object) Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Retrieves the current lifetime service object that controls the lifetime policy for this instance. Gets the Typeof the current instance. Obtains a lifetime service object to control the lifetime policy for this instance. Resets FillLoadOptionto its default state and causes Fillto honor AcceptChangesDuringFill.
GetLifetimeService(inherited from MarshalByRefObject) GetType(inherited from Object) InitializeLifetimeService(inherited from MarshalByRefObject) ResetFillLoadOption(inherited from DataAdapter)
ShouldSerializeAcceptChangesDuringFill(inherited Determines whether the from DataAdapter) AcceptChangesDuringFillproperty should be persisted. ShouldSerializeFillLoadOption(inherited from DataAdapter) ToString(inherited from Component) Determines whether the FillLoadOptionproperty should be persisted. Returns a Stringcontaining the name of the Component, if any. This method should not be overridden. Overloaded. Calls the respective INSERT, UPDATE, or DELETE statements for each inserted, updated, or deleted row in the specified DataSet.
Public Instance Events Disposed(inherited from Component) FillError(inherited from DataAdapter) RowUpdated Adds an event handler to listen to the Disposedevent on the component. Returned when an error occurs during a fill operation. Occurs during Update after a command is executed against the data source. The attempt to update is made, so the event fires. Occurs during Update before a command is executed against the data source. The attempt to update is made, so the event fires.
RowUpdating
Protected Internal Instance Properties FillCommandBehavior(inherited from DbDataAdapter) See Also MySqlDataAdapter Class , MySql.Data.MySqlClient Namespace Gets or sets the behavior of the command used to fill the data adapter.
1282
Connector/NET Reference
25.2.4.1.3.1.2.2.1.1.1. MySqlDataAdapter Constructor Initializes a new instance of the MySqlDataAdapter class. Overload List Initializes a new instance of the MySqlDataAdapter class. public MySqlDataAdapter(); public MySqlDataAdapter(MySqlCommand); public MySqlDataAdapter(string,MySqlConnection); public MySqlDataAdapter(string,string); See Also MySqlDataAdapter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.1.1. MySqlDataAdapter Constructor () Initializes a new instance of the MySqlDataAdapter class. Syntax: Visual Basic
Overloads Public Sub New()
Syntax: C#
public MySqlDataAdapter();
See Also MySqlDataAdapter Class , MySql.Data.MySqlClient Namespace , MySqlDataAdapter Constructor Overload List 25.2.4.1.3.1.2.2.1.1.1.2. MySqlDataAdapter Constructor (MySqlCommand) Syntax: Visual Basic
Overloads Public Sub New( _ ByVal selectCommand As MySqlCommand _ )
Syntax: C#
public MySqlDataAdapter( MySqlCommandselectCommand );
See Also MySqlDataAdapter Class , MySql.Data.MySqlClient Namespace , MySqlDataAdapter Constructor Overload List 25.2.4.1.3.1.2.2.1.1.1.3. MySqlDataAdapter Constructor (String, MySqlConnection) Syntax: Visual Basic
Overloads Public Sub New( _ ByVal selectCommandText As String, _ ByVal connection As MySqlConnection _ )
1283
Connector/NET Reference
Syntax: C#
public MySqlDataAdapter( stringselectCommandText, MySqlConnectionconnection );
See Also MySqlDataAdapter Class , MySql.Data.MySqlClient Namespace , MySqlDataAdapter Constructor Overload List 25.2.4.1.3.1.2.2.1.1.1.4. MySqlDataAdapter Constructor (String, String) Syntax: Visual Basic
Overloads Public Sub New( _ ByVal selectCommandText As String, _ ByVal selectConnString As String _ )
Syntax: C#
public MySqlDataAdapter( stringselectCommandText, stringselectConnString );
See Also MySqlDataAdapter Class , MySql.Data.MySqlClient Namespace , MySqlDataAdapter Constructor Overload List 25.2.4.1.3.1.2.2.1.1.2. DeleteCommand Property Syntax: Visual Basic
Overloads Public Property DeleteCommand As MySqlCommand
Syntax: C#
new public MySqlCommand DeleteCommand {get; set;}
See Also MySqlDataAdapter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.3. InsertCommand Property Syntax: Visual Basic
Overloads Public Property InsertCommand As MySqlCommand
Syntax: C#
new public MySqlCommand InsertCommand {get; set;}
See Also MySqlDataAdapter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.4. SelectCommand Property Syntax: Visual Basic
Overloads Public Property SelectCommand As MySqlCommand
1284
Connector/NET Reference
Syntax: C#
new public MySqlCommand SelectCommand {get; set;}
See Also MySqlDataAdapter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.5. UpdateCommand Property Syntax: Visual Basic
Overloads Public Property UpdateCommand As MySqlCommand
Syntax: C#
new public MySqlCommand UpdateCommand {get; set;}
See Also MySqlDataAdapter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.6. MySqlDataAdapter.RowUpdated Event Occurs during Update after a command is executed against the data source. The attempt to update is made, so the event fires. Syntax: Visual Basic
Public Event RowUpdated As MySqlRowUpdatedEventHandler
Syntax: C#
public event MySqlRowUpdatedEventHandler RowUpdated;
Event Data The event handler receives an argument of type MySqlRowUpdatedEventArgs containing data related to this event. The following MySqlRowUpdatedEventArgsproperties provide information specific to this event. Property Command Errors Description Gets or sets the MySqlCommand executed when Update is called. Gets any errors generated by the .NET Framework data provider when the Commandwas executed. Gets the number of rows changed, inserted, or deleted by execution of the SQL statement. Gets the DataRowsent through an Update. Gets the number of rows processed in a batch of updated records. Gets the type of SQL statement executed. Gets the UpdateStatusof the Commandproperty. Gets the DataTableMappingsent through an Update.
See Also
1285
Connector/NET Reference
MySqlDataAdapter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.6.1. MySqlRowUpdatedEventHandler Delegate Represents the method that will handle the RowUpdatedevent of a MySqlDataAdapter . Syntax: Visual Basic
Public Delegate Sub MySqlRowUpdatedEventHandler( _ ByVal sender As Object, _ ByVal e As MySqlRowUpdatedEventArgs _ )
Syntax: C#
public delegate void MySqlRowUpdatedEventHandler( objectsender, MySqlRowUpdatedEventArgse );
Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.6.1.1. MySqlRowUpdatedEventArgs Class Provides data for the RowUpdated event. This class cannot be inherited. For a list of all members of this type, see MySqlRowUpdatedEventArgs Members . Syntax: Visual Basic
NotInheritable Public Class MySqlRowUpdatedEventArgs_ Inherits RowUpdatedEventArgs
Syntax: C#
public sealed class MySqlRowUpdatedEventArgs : RowUpdatedEventArgs
Thread Safety Public static (Sharedin Visual Basic) members of this type are safe for multithreaded operations. Instance members are notguaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlRowUpdatedEventArgs Members , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.6.1.1.1. MySqlRowUpdatedEventArgs Members MySqlRowUpdatedEventArgs overview Public Instance Constructors
1286
Connector/NET Reference
MySqlRowUpdatedEventArgs Constructor
Public Instance Properties Command Errors(inherited from RowUpdatedEventArgs) Overloaded. Gets or sets the MySqlCommand executed when Update is called. Gets any errors generated by the .NET Framework data provider when the Commandwas executed. Gets the number of rows changed, inserted, or deleted by execution of the SQL statement. Gets the DataRowsent through an Update.
RowCount(inherited from RowUpdatedEventArgs) Gets the number of rows processed in a batch of updated records. StatementType(inherited from RowUpdatedEventArgs) Status(inherited from RowUpdatedEventArgs) TableMapping(inherited from RowUpdatedEventArgs) Public Instance Methods CopyToRows(inherited from RowUpdatedEventArgs) Equals(inherited from Object) GetHashCode(inherited from Object) Overloaded. Copies references to the modified rows into the provided array. Determines whether the specified Objectis equal to the current Object. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Gets the Typeof the current instance. Returns a Stringthat represents the current Object. Gets the type of SQL statement executed. Gets the UpdateStatusof the Commandproperty. Gets the DataTableMappingsent through an Update.
MySqlRowUpdatedEventArgs Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.6.1.1.1.1. MySqlRowUpdatedEventArgs Constructor Initializes a new instance of the MySqlRowUpdatedEventArgs class. Syntax: Visual Basic
Public Sub New( _ ByVal row As DataRow, _ ByVal command As IDbCommand, _ ByVal statementType As StatementType, _ ByVal tableMapping As DataTableMapping _ )
Syntax: C#
public MySqlRowUpdatedEventArgs( DataRowrow, IDbCommandcommand, StatementTypestatementType, DataTableMappingtableMapping
1287
Connector/NET Reference
);
Parameters row: The DataRowsent through an Update. command: The IDbCommandexecuted when Updateis called. statementType: One of the StatementTypevalues that specifies the type of query executed. tableMapping: The DataTableMappingsent through an Update. See Also MySqlRowUpdatedEventArgs Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.6.1.1.1.2. Command Property Gets or sets the MySqlCommand executed when Update is called. Syntax: Visual Basic
Overloads Public ReadOnly Property Command As MySqlCommand
Syntax: C#
new public MySqlCommand Command {get;}
See Also MySqlRowUpdatedEventArgs Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.7. MySqlDataAdapter.RowUpdating Event Occurs during Update before a command is executed against the data source. The attempt to update is made, so the event fires. Syntax: Visual Basic
Public Event RowUpdating As MySqlRowUpdatingEventHandler
Syntax: C#
public event MySqlRowUpdatingEventHandler RowUpdating;
Event Data The event handler receives an argument of type MySqlRowUpdatingEventArgs containing data related to this event. The following MySqlRowUpdatingEventArgsproperties provide information specific to this event. Property Command Errors Description Gets or sets the MySqlCommand to execute when performing the Update. Gets any errors generated by the .NET Framework data provider when the Commandexecutes. Gets the DataRowthat will be sent to the server as part of an insert, update, or delete operation. Gets the type of SQL statement to execute. Gets or sets the UpdateStatusof the Commandproperty.
1288
Connector/NET Reference
TableMapping
See Also MySqlDataAdapter Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.7.1. MySqlRowUpdatingEventHandler Delegate Represents the method that will handle the RowUpdatingevent of a MySqlDataAdapter . Syntax: Visual Basic
Public Delegate Sub MySqlRowUpdatingEventHandler( _ ByVal sender As Object, _ ByVal e As MySqlRowUpdatingEventArgs _ )
Syntax: C#
public delegate void MySqlRowUpdatingEventHandler( objectsender, MySqlRowUpdatingEventArgse );
Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.7.1.1. MySqlRowUpdatingEventArgs Class Provides data for the RowUpdating event. This class cannot be inherited. For a list of all members of this type, see MySqlRowUpdatingEventArgs Members . Syntax: Visual Basic
NotInheritable Public Class MySqlRowUpdatingEventArgs_ Inherits RowUpdatingEventArgs
Syntax: C#
public sealed class MySqlRowUpdatingEventArgs : RowUpdatingEventArgs
Thread Safety Public static (Sharedin Visual Basic) members of this type are safe for multithreaded operations. Instance members are notguaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlRowUpdatingEventArgs Members , MySql.Data.MySqlClient Namespace
1289
Connector/NET Reference
25.2.4.1.3.1.2.2.1.1.7.1.1.1. MySqlRowUpdatingEventArgs Members MySqlRowUpdatingEventArgs overview Public Instance Constructors MySqlRowUpdatingEventArgs Constructor Initializes a new instance of the MySqlRowUpdatingEventArgs class.
Public Instance Properties Command Errors(inherited from RowUpdatingEventArgs) Overloaded. Gets or sets the MySqlCommand to execute when performing the Update. Gets any errors generated by the .NET Framework data provider when the Commandexecutes. Gets the DataRowthat will be sent to the server as part of an insert, update, or delete operation. Gets the type of SQL statement to execute. Gets or sets the UpdateStatusof the Commandproperty. Gets the DataTableMappingto send through the Update.
Row(inherited from RowUpdatingEventArgs) StatementType(inherited from RowUpdatingEventArgs) Status(inherited from RowUpdatingEventArgs) TableMapping(inherited from RowUpdatingEventArgs) Public Instance Methods Equals(inherited from Object) GetHashCode(inherited from Object)
Determines whether the specified Objectis equal to the current Object. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Gets the Typeof the current instance. Returns a Stringthat represents the current Object.
MySqlRowUpdatingEventArgs Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.7.1.1.1.1. MySqlRowUpdatingEventArgs Constructor Initializes a new instance of the MySqlRowUpdatingEventArgs class. Syntax: Visual Basic
Public Sub New( _ ByVal row As DataRow, _ ByVal command As IDbCommand, _ ByVal statementType As StatementType, _ ByVal tableMapping As DataTableMapping _ )
Syntax: C#
public MySqlRowUpdatingEventArgs( DataRowrow, IDbCommandcommand, StatementTypestatementType,
1290
Connector/NET Reference
DataTableMappingtableMapping );
Parameters row: The DataRowto Update. command: The IDbCommandto execute during Update. statementType: One of the StatementTypevalues that specifies the type of query executed. tableMapping: The DataTableMappingsent through an Update. See Also MySqlRowUpdatingEventArgs Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.2.1.1.7.1.1.1.2. Command Property Gets or sets the MySqlCommand to execute when performing the Update. Syntax: Visual Basic
Overloads Public Property Command As MySqlCommand
Syntax: C#
new public MySqlCommand Command {get; set;}
See Also MySqlRowUpdatingEventArgs Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.2.3. MySqlCommandBuilder Constructor (MySqlDataAdapter, Boolean) Syntax: Visual Basic
Overloads Public Sub New( _ ByVal adapter As MySqlDataAdapter, _ ByVal lastOneWins As Boolean _ )
Syntax: C#
public MySqlCommandBuilder( MySqlDataAdapteradapter, boollastOneWins );
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace , MySqlCommandBuilder Constructor Overload List 25.2.4.1.3.1.2.4. MySqlCommandBuilder Constructor (Boolean) Syntax: Visual Basic
Overloads Public Sub New( _ ByVal lastOneWins As Boolean _ )
Syntax: C#
public MySqlCommandBuilder( boollastOneWins
1291
Connector/NET Reference
);
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace , MySqlCommandBuilder Constructor Overload List 25.2.4.1.3.1.3. DataAdapter Property Syntax: Visual Basic
Public Property DataAdapter As MySqlDataAdapter
Syntax: C#
public MySqlDataAdapter DataAdapter {get; set;}
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.4. QuotePrefix Property Syntax: Visual Basic
Public Property QuotePrefix As String
Syntax: C#
public string QuotePrefix {get; set;}
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.5. QuoteSuffix Property Syntax: Visual Basic
Public Property QuoteSuffix As String
Syntax: C#
public string QuoteSuffix {get; set;}
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.6. MySqlCommandBuilder.GetDeleteCommand Method Syntax: Visual Basic
Public Function GetDeleteCommand() As MySqlCommand
Syntax: C#
public MySqlCommand GetDeleteCommand();
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.7. MySqlCommandBuilder.GetInsertCommand Method Syntax: Visual Basic
1292
Connector/NET Reference
Syntax: C#
public MySqlCommand GetInsertCommand();
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.8. MySqlCommandBuilder.GetUpdateCommand Method Syntax: Visual Basic
Public Function GetUpdateCommand() As MySqlCommand
Syntax: C#
public MySqlCommand GetUpdateCommand();
See Also MySqlCommandBuilder Class , MySql.Data.MySqlClient Namespace 25.2.4.1.3.1.9. MySqlCommandBuilder.RefreshSchema Method Syntax: Visual Basic
Public Sub RefreshSchema()
Syntax: C#
public void RefreshSchema();
Syntax: C#
public sealed class MySqlException : SystemException
Thread Safety Public static (Sharedin Visual Basic) members of this type are safe for multithreaded operations. Instance members are notguaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also
1293
Connector/NET Reference
MySqlException Members , MySql.Data.MySqlClient Namespace 25.2.4.1.4.1. MySqlException Members MySqlException overview Public Instance Properties Data(inherited from Exception) Gets a collection of key/value pairs that provide additional, user-defined information about the exception. Gets or sets a link to the help file associated with this exception. Gets the Exceptioninstance that caused the current exception. Gets a message that describes the current exception. Gets a number that identifies the type of error. Gets or sets the name of the application or the object that causes the error. Gets a string representation of the frames on the call stack at the time the current exception was thrown. Gets the method that throws the current exception.
HelpLink(inherited from Exception) InnerException(inherited from Exception) Message(inherited from Exception) Number Source(inherited from Exception) StackTrace(inherited from Exception)
Public Instance Methods Equals(inherited from Object) GetBaseException(inherited from Exception) Determines whether the specified Objectis equal to the current Object. When overridden in a derived class, returns the Exceptionthat is the root cause of one or more subsequent exceptions. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. When overridden in a derived class, sets the SerializationInfowith information about the exception. Gets the runtime type of the current instance. Creates and returns a string representation of the current exception.
See Also MySqlException Class , MySql.Data.MySqlClient Namespace 25.2.4.1.4.1.1. Number Property Gets a number that identifies the type of error. Syntax: Visual Basic
Public ReadOnly Property Number As Integer
Syntax: C#
1294
Connector/NET Reference
Syntax: C#
public sealed class MySqlHelper
Thread Safety Public static (Shared in Visual Basic) members of this type are safe for multithreaded operations. Instance members are not guaranteed to be thread-safe. Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlHelper Members , MySql.Data.MySqlClient Namespace 25.2.4.1.5.1. MySqlHelper Members MySqlHelper overview Public Static (Shared) Methods ExecuteDataRow Executes a single SQL command and returns the first row of the resultset. A new MySqlConnection object is created, opened, and closed during this method. Overloaded. Executes a single SQL command and returns the resultset in a DataSet. A new MySqlConnection object is created, opened, and closed during this method. Overloaded. Executes a single command against a MySQL database. The MySqlConnection is assumed to be open when the method is called and remains open after the method completes. Overloaded. Executes a single command against a MySQL database. Overloaded. Execute a single command against a MySQL database. Updates the given table with data from the given DataSet
ExecuteDataset
ExecuteNonQuery
1295
Connector/NET Reference
Public Instance Methods Equals(inherited from Object) GetHashCode(inherited from Object) Determines whether the specified Objectis equal to the current Object. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Gets the Typeof the current instance. Returns a Stringthat represents the current Object.
MySqlHelper Class , MySql.Data.MySqlClient Namespace 25.2.4.1.5.1.1. MySqlHelper.ExecuteDataRow Method Executes a single SQL command and returns the first row of the resultset. A new MySqlConnection object is created, opened, and closed during this method. Syntax: Visual Basic
Public Shared Function ExecuteDataRow( _ ByVal connectionString As String, _ ByVal commandText As String, _ ParamArray parms As MySqlParameter() _ ) As DataRow
Syntax: C#
public static DataRow ExecuteDataRow( stringconnectionString, stringcommandText, params MySqlParameter[]parms );
Parameters connectionString: Settings to be used for the connection commandText: Command to execute parms: Parameters to use for the command Return Value DataRow containing the first row of the resultset See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace 25.2.4.1.5.1.2. ExecuteDataset Method Executes a single SQL command and returns the resultset in a DataSet. The state of the MySqlConnection object remains unchanged after execution of this method. Overload List Executes a single SQL command and returns the resultset in a DataSet. The state of the MySqlConnection object remains unchanged after execution of this method. public static DataSet ExecuteDataset(MySqlConnection,string);
1296
Connector/NET Reference
Executes a single SQL command and returns the resultset in a DataSet. The state of the MySqlConnection object remains unchanged after execution of this method. public static DataSet ExecuteDataset(MySqlConnection,string,params MySqlParameter[]); Executes a single SQL command and returns the resultset in a DataSet. A new MySqlConnection object is created, opened, and closed during this method. public static DataSet ExecuteDataset(string,string); Executes a single SQL command and returns the resultset in a DataSet. A new MySqlConnection object is created, opened, and closed during this method. public static DataSet ExecuteDataset(string,string,params MySqlParameter[]); See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace 25.2.4.1.5.1.2.1. MySqlHelper.ExecuteDataset Method (MySqlConnection, String) Executes a single SQL command and returns the resultset in a DataSet. The state of the MySqlConnection object remains unchanged after execution of this method. Syntax: Visual Basic
Overloads Public Shared Function ExecuteDataset( _ ByVal connection As MySqlConnection, _ ByVal commandText As String _ ) As DataSet
Syntax: C#
public static DataSet ExecuteDataset( MySqlConnectionconnection, stringcommandText );
Parameters connection: MySqlConnection object to use commandText: Command to execute Return Value DataSetcontaining the resultset See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace , MySqlHelper.ExecuteDataset Overload List 25.2.4.1.5.1.2.2. MySqlHelper.ExecuteDataset Method (MySqlConnection, String, MySqlParameter[]) Executes a single SQL command and returns the resultset in a DataSet. The state of the MySqlConnection object remains unchanged after execution of this method. Syntax: Visual Basic
Overloads Public Shared Function ExecuteDataset( _ ByVal connection As MySqlConnection, _ ByVal commandText As String, _ ParamArray commandParameters As MySqlParameter() _
1297
Connector/NET Reference
) As DataSet
Syntax: C#
public static DataSet ExecuteDataset( MySqlConnectionconnection, stringcommandText, params MySqlParameter[]commandParameters );
Parameters connection: MySqlConnection object to use commandText: Command to execute commandParameters: Parameters to use for the command Return Value DataSetcontaining the resultset See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace , MySqlHelper.ExecuteDataset Overload List 25.2.4.1.5.1.2.3. MySqlHelper.ExecuteDataset Method (String, String) Executes a single SQL command and returns the resultset in a DataSet. A new MySqlConnection object is created, opened, and closed during this method. Syntax: Visual Basic
Overloads Public Shared Function ExecuteDataset( _ ByVal connectionString As String, _ ByVal commandText As String _ ) As DataSet
Syntax: C#
public static DataSet ExecuteDataset( stringconnectionString, stringcommandText );
Parameters connectionString: Settings to be used for the connection commandText: Command to execute Return Value DataSetcontaining the resultset See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace , MySqlHelper.ExecuteDataset Overload List 25.2.4.1.5.1.2.4. MySqlHelper.ExecuteDataset Method (String, String, MySqlParameter[]) Executes a single SQL command and returns the resultset in a DataSet. A new MySqlConnection object is created, opened, and closed during this method.
1298
Connector/NET Reference
Syntax: C#
public static DataSet ExecuteDataset( stringconnectionString, stringcommandText, params MySqlParameter[]commandParameters );
Parameters connectionString: Settings to be used for the connection commandText: Command to execute commandParameters: Parameters to use for the command Return Value DataSetcontaining the resultset See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace , MySqlHelper.ExecuteDataset Overload List 25.2.4.1.5.1.3. ExecuteNonQuery Method Executes a single command against a MySQL database. The MySqlConnection is assumed to be open when the method is called and remains open after the method completes. Overload List Executes a single command against a MySQL database. The MySqlConnection is assumed to be open when the method is called and remains open after the method completes. public static int ExecuteNonQuery(MySqlConnection,string,params MySqlParameter[]); Executes a single command against a MySQL database. A new MySqlConnection is created using the ConnectionString given. public static int ExecuteNonQuery(string,string,params MySqlParameter[]); See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace 25.2.4.1.5.1.3.1. MySqlHelper.ExecuteNonQuery Method (MySqlConnection, String, MySqlParameter[]) Executes a single command against a MySQL database. The MySqlConnection is assumed to be open when the method is called and remains open after the method completes. Syntax: Visual Basic
Overloads Public Shared Function ExecuteNonQuery( _ ByVal connection As MySqlConnection, _ ByVal commandText As String, _ ParamArray commandParameters As MySqlParameter() _
1299
Connector/NET Reference
) As Integer
Syntax: C#
public static int ExecuteNonQuery( MySqlConnectionconnection, stringcommandText, params MySqlParameter[]commandParameters );
Parameters connection: MySqlConnection object to use commandText: SQL command to be executed commandParameters: Array of MySqlParameter objects to use with the command. Return Value See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace , MySqlHelper.ExecuteNonQuery Overload List 25.2.4.1.5.1.3.2. MySqlHelper.ExecuteNonQuery Method (String, String, MySqlParameter[]) Executes a single command against a MySQL database. A new MySqlConnection is created using the ConnectionString given. Syntax: Visual Basic
Overloads Public Shared Function ExecuteNonQuery( _ ByVal connectionString As String, _ ByVal commandText As String, _ ParamArray parms As MySqlParameter() _ ) As Integer
Syntax: C#
public static int ExecuteNonQuery( stringconnectionString, stringcommandText, params MySqlParameter[]parms );
Parameters connectionString: ConnectionString to use commandText: SQL command to be executed parms: Array of MySqlParameter objects to use with the command. Return Value See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace , MySqlHelper.ExecuteNonQuery Overload List 25.2.4.1.5.1.4. ExecuteReader Method Executes a single command against a MySQL database. Overload List
1300
Connector/NET Reference
Executes a single command against a MySQL database. public static MySqlDataReader ExecuteReader(string,string); Executes a single command against a MySQL database. public static MySqlDataReader ExecuteReader(string,string,params MySqlParameter[]); See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace 25.2.4.1.5.1.4.1. MySqlHelper.ExecuteReader Method (String, String) Executes a single command against a MySQL database. Syntax: Visual Basic
Overloads Public Shared Function ExecuteReader( _ ByVal connectionString As String, _ ByVal commandText As String _ ) As MySqlDataReader
Syntax: C#
public static MySqlDataReader ExecuteReader( stringconnectionString, stringcommandText );
Parameters connectionString: Settings to use for this command commandText: Command text to use Return Value MySqlDataReader object ready to read the results of the command See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace , MySqlHelper.ExecuteReader Overload List 25.2.4.1.5.1.4.2. MySqlHelper.ExecuteReader Method (String, String, MySqlParameter[]) Executes a single command against a MySQL database. Syntax: Visual Basic
Overloads Public Shared Function ExecuteReader( _ ByVal connectionString As String, _ ByVal commandText As String, _ ParamArray commandParameters As MySqlParameter() _ ) As MySqlDataReader
Syntax: C#
public static MySqlDataReader ExecuteReader( stringconnectionString, stringcommandText, params MySqlParameter[]commandParameters );
Parameters
1301
Connector/NET Reference
connectionString: Settings to use for this command commandText: Command text to use commandParameters: Array of MySqlParameter objects to use with the command Return Value MySqlDataReader object ready to read the results of the command See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace , MySqlHelper.ExecuteReader Overload List 25.2.4.1.5.1.5. ExecuteScalar Method Execute a single command against a MySQL database. Overload List Execute a single command against a MySQL database. public static object ExecuteScalar(MySqlConnection,string); Execute a single command against a MySQL database. public static object ExecuteScalar(MySqlConnection,string,params MySqlParameter[]); Execute a single command against a MySQL database. public static object ExecuteScalar(string,string); Execute a single command against a MySQL database. public static object ExecuteScalar(string,string,params MySqlParameter[]); See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace 25.2.4.1.5.1.5.1. MySqlHelper.ExecuteScalar Method (MySqlConnection, String) Execute a single command against a MySQL database. Syntax: Visual Basic
Overloads Public Shared Function ExecuteScalar( _ ByVal connection As MySqlConnection, _ ByVal commandText As String _ ) As Object
Syntax: C#
public static object ExecuteScalar( MySqlConnectionconnection, stringcommandText );
Parameters connection: MySqlConnection object to use commandText: Command text to use for the command Return Value
1302
Connector/NET Reference
The first column of the first row in the result set, or a null reference if the result set is empty. See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace , MySqlHelper.ExecuteScalar Overload List 25.2.4.1.5.1.5.2. MySqlHelper.ExecuteScalar Method (MySqlConnection, String, MySqlParameter[]) Execute a single command against a MySQL database. Syntax: Visual Basic
Overloads Public Shared Function ExecuteScalar( _ ByVal connection As MySqlConnection, _ ByVal commandText As String, _ ParamArray commandParameters As MySqlParameter() _ ) As Object
Syntax: C#
public static object ExecuteScalar( MySqlConnectionconnection, stringcommandText, params MySqlParameter[]commandParameters );
Parameters connection: MySqlConnection object to use commandText: Command text to use for the command commandParameters: Parameters to use for the command Return Value The first column of the first row in the result set, or a null reference if the result set is empty. See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace , MySqlHelper.ExecuteScalar Overload List 25.2.4.1.5.1.5.3. MySqlHelper.ExecuteScalar Method (String, String) Execute a single command against a MySQL database. Syntax: Visual Basic
Overloads Public Shared Function ExecuteScalar( _ ByVal connectionString As String, _ ByVal commandText As String _ ) As Object
Syntax: C#
public static object ExecuteScalar( stringconnectionString, stringcommandText );
Parameters connectionString: Settings to use for the update commandText: Command text to use for the update
1303
Connector/NET Reference
Return Value The first column of the first row in the result set, or a null reference if the result set is empty. See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace , MySqlHelper.ExecuteScalar Overload List 25.2.4.1.5.1.5.4. MySqlHelper.ExecuteScalar Method (String, String, MySqlParameter[]) Execute a single command against a MySQL database. Syntax: Visual Basic
Overloads Public Shared Function ExecuteScalar( _ ByVal connectionString As String, _ ByVal commandText As String, _ ParamArray commandParameters As MySqlParameter() _ ) As Object
Syntax: C#
public static object ExecuteScalar( stringconnectionString, stringcommandText, params MySqlParameter[]commandParameters );
Parameters connectionString: Settings to use for the command commandText: Command text to use for the command commandParameters: Parameters to use for the command Return Value The first column of the first row in the result set, or a null reference if the result set is empty. See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace , MySqlHelper.ExecuteScalar Overload List 25.2.4.1.5.1.6. MySqlHelper.UpdateDataSet Method Updates the given table with data from the given DataSet Syntax: Visual Basic
Public Shared Sub UpdateDataSet( _ ByVal connectionString As String, _ ByVal commandText As String, _ ByVal ds As DataSet, _ ByVal tablename As String _ )
Syntax: C#
public static void UpdateDataSet( stringconnectionString, stringcommandText, DataSetds, stringtablename );
Parameters
1304
Connector/NET Reference
connectionString: Settings to use for the update commandText: Command text to use for the update ds: DataSetcontaining the new data to use in the update tablename: Tablename in the dataset to update See Also MySqlHelper Class , MySql.Data.MySqlClient Namespace
Syntax: C#
public enum MySqlErrorCode
Members Member Name PacketTooLarge PasswordNotAllowed DuplicateKeyEntry HostNotPrivileged PasswordNoMatch AnonymousUser DuplicateKey KeyNotFound DuplicateKeyName Requirements Namespace: MySql.Data.MySqlClient Assembly: MySql.Data (in MySql.Data.dll) See Also MySql.Data.MySqlClient Namespace Description
25.2.4.2. MySql.Data.Types
Namespace hierarchy Classes Class MySqlConversionException MySqlDateTime MySqlValue Description Summary description for MySqlConversionException. Summary description for MySqlDateTime.
1305
Connector/NET Reference
25.2.4.2.1. MySql.Data.TypesHierarchy
See Also MySql.Data.Types Namespace
Syntax: C#
public class MySqlConversionException : ApplicationException
Thread Safety Public static (Sharedin Visual Basic) members of this type are safe for multithreaded operations. Instance members are notguaranteed to be thread-safe. Requirements Namespace: MySql.Data.Types Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlConversionException Members , MySql.Data.Types Namespace 25.2.4.2.2.1. MySqlConversionException Members MySqlConversionException overview Public Instance Constructors MySqlConversionException Constructor Public Instance Properties Data(inherited from Exception) Gets a collection of key/value pairs that provide additional, user-defined information about the exception. Gets or sets a link to the help file associated with this exception. Gets the Exceptioninstance that caused the current exception. Gets a message that describes the current exception. Gets or sets the name of the application or the object that causes the error. Gets a string representation of the frames on the call stack at the time the current exception was thrown. Ctor
HelpLink(inherited from Exception) InnerException(inherited from Exception) Message(inherited from Exception) Source(inherited from Exception) StackTrace(inherited from Exception)
1306
Connector/NET Reference
Public Instance Methods Equals(inherited from Object) GetBaseException(inherited from Exception) Determines whether the specified Objectis equal to the current Object. When overridden in a derived class, returns the Exceptionthat is the root cause of one or more subsequent exceptions. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. When overridden in a derived class, sets the SerializationInfowith information about the exception. Gets the runtime type of the current instance. Creates and returns a string representation of the current exception.
Protected Instance Properties HResult(inherited from Exception) Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.
Protected Instance Methods Finalize(inherited from Object) Allows an Objectto attempt to free resources and perform other cleanup operations before the Objectis reclaimed by garbage collection. Creates a shallow copy of the current Object.
MySqlConversionException Class , MySql.Data.Types Namespace 25.2.4.2.2.1.1. MySqlConversionException Constructor Syntax: Visual Basic
Public Sub New( _ ByVal msg As String _ )
Syntax: C#
public MySqlConversionException( stringmsg );
1307
Connector/NET Reference
For a list of all members of this type, see MySqlDateTime Members . Syntax: Visual Basic
Public Class MySqlDateTime_ Inherits MySqlValue_ Implements IConvertible, IComparable
Syntax: C#
public class MySqlDateTime : MySqlValue, IConvertible, IComparable
Thread Safety Public static (Shared in Visual Basic) members of this type are safe for multithreaded operations. Instance members are not guaranteed to be thread-safe. Requirements Namespace: MySql.Data.Types Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlDateTime Members , MySql.Data.Types Namespace 25.2.4.2.3.1. MySqlDateTime Members MySqlDateTime overview Public Static (Shared) Type Conversions Explicit MySqlDateTime to DateTime Conversion Public Instance Properties Day Hour IsNull (inherited from MySqlValue) IsValidDateTime Minute Month Second ValueAsObject (inherited from MySqlValue) Year Public Instance Methods Equals(inherited from Object) GetDateTime GetHashCode(inherited from Object) Determines whether the specified Objectis equal to the current Object. Returns this value as a DateTime Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Gets the Typeof the current instance. Indicates if this object contains a value that can be represented as a DateTime Returns the minute portion of this datetime Returns the month portion of this datetime Returns the second portion of this datetime Returns the value of this field as an object Returns the year portion of this datetime Returns the day portion of this datetime Returns the hour portion of this datetime
1308
Connector/NET Reference
ToString
Protected Instance Fields classType (inherited from MySqlValue) dbType (inherited from MySqlValue) isNull (inherited from MySqlValue) mySqlDbType (inherited from MySqlValue) mySqlTypeName (inherited from MySqlValue) objectValue (inherited from MySqlValue) Protected Instance Methods Finalize(inherited from Object) Allows an Objectto attempt to free resources and perform other cleanup operations before the Objectis reclaimed by garbage collection. Creates a shallow copy of the current Object. The system type represented by this value The generic dbtype of this value Is this value null The specific MySQL db type The MySQL specific typename of this value
MySqlDateTime Class , MySql.Data.Types Namespace 25.2.4.2.3.1.1. MySqlDateTime Explicit MySqlDateTime to DateTime Conversion Syntax: Visual Basic
MySqlDateTime.op_Explicit(val)
Syntax: C#
public static explicit operator DateTime( MySqlDateTimeval );
Parameters val: Return Value See Also MySqlDateTime Class , MySql.Data.Types Namespace 25.2.4.2.3.1.2. Day Property Returns the day portion of this datetime Syntax: Visual Basic
Public Property Day As Integer
Syntax: C#
public int Day {get; set;}
1309
Connector/NET Reference
25.2.4.2.3.1.3. Hour Property Returns the hour portion of this datetime Syntax: Visual Basic
Public Property Hour As Integer
Syntax: C#
public int Hour {get; set;}
See Also MySqlDateTime Class , MySql.Data.Types Namespace 25.2.4.2.3.1.4. IsNull Property Syntax: Visual Basic
Public Property IsNull As Boolean
Syntax: C#
public bool IsNull {get; set;}
See Also MySqlValue Class , MySql.Data.Types Namespace 25.2.4.2.3.1.4.1. MySqlValue Class For a list of all members of this type, see MySqlValue Members . Syntax: Visual Basic
MustInherit Public Class MySqlValue
Syntax: C#
public abstract class MySqlValue
Thread Safety Public static (Shared in Visual Basic) members of this type are safe for multithreaded operations. Instance members are not guaranteed to be thread-safe. Requirements Namespace: MySql.Data.Types Assembly: MySql.Data (in MySql.Data.dll) See Also MySqlValue Members , MySql.Data.Types Namespace 25.2.4.2.3.1.4.1.1. MySqlValue Members MySqlValue overview Protected Static (Shared) Fields numberFormat
1310
Connector/NET Reference
Public Instance Constructors MySqlValue Constructor Public Instance Properties IsNull ValueAsObject Public Instance Methods Equals(inherited from Object) GetHashCode(inherited from Object) Determines whether the specified Objectis equal to the current Object. Serves as a hash function for a particular type. GetHashCodeis suitable for use in hashing algorithms and data structures like a hash table. Gets the Typeof the current instance. Returns a string representation of this value Returns the value of this field as an object Initializes a new instance of the MySqlValue class.
GetType(inherited from Object) ToString Protected Instance Fields classType dbType isNull mySqlDbType mySqlTypeName objectValue Protected Instance Methods Finalize(inherited from Object)
The system type represented by this value The generic dbtype of this value Is this value null The specific MySQL db type The MySQL specific typename of this value
Allows an Objectto attempt to free resources and perform other cleanup operations before the Objectis reclaimed by garbage collection. Creates a shallow copy of the current Object.
MemberwiseClone(inherited from Object) See Also MySqlValue Class , MySql.Data.Types Namespace 25.2.4.2.3.1.4.1.1.1. MySqlValue.numberFormat Field Syntax: Visual Basic
Syntax: C#
protected static NumberFormatInfo numberFormat;
See Also MySqlValue Class , MySql.Data.Types Namespace 25.2.4.2.3.1.4.1.1.2. MySqlValue Constructor Initializes a new instance of the MySqlValue class.
1311
Connector/NET Reference
Syntax: C#
public MySqlValue();
See Also MySqlValue Class , MySql.Data.Types Namespace 25.2.4.2.3.1.4.1.1.3. ValueAsObject Property Returns the value of this field as an object Syntax: Visual Basic
Public ReadOnly Property ValueAsObject As Object
Syntax: C#
public object ValueAsObject {get;}
See Also MySqlValue Class , MySql.Data.Types Namespace 25.2.4.2.3.1.4.1.1.4. MySqlValue.ToString Method Returns a string representation of this value Syntax: Visual Basic
Overrides Public Function ToString() As String
Syntax: C#
public override string ToString();
See Also MySqlValue Class , MySql.Data.Types Namespace 25.2.4.2.3.1.4.1.1.5. MySqlValue.classType Field The system type represented by this value Syntax: Visual Basic
Protected classType As Type
Syntax: C#
protected Type classType;
See Also MySqlValue Class , MySql.Data.Types Namespace 25.2.4.2.3.1.4.1.1.6. MySqlValue.dbType Field The generic dbtype of this value Syntax: Visual Basic
1312
Connector/NET Reference
Syntax: C#
protected DbType dbType;
See Also MySqlValue Class , MySql.Data.Types Namespace 25.2.4.2.3.1.4.1.1.7. MySqlValue.mySqlDbType Field The specific MySQL db type Syntax: Visual Basic
Protected mySqlDbType As MySqlDbType
Syntax: C#
protected MySqlDbType mySqlDbType;
See Also MySqlValue Class , MySql.Data.Types Namespace 25.2.4.2.3.1.4.1.1.8. MySqlValue.mySqlTypeName Field The MySQL specific typename of this value Syntax: Visual Basic
Protected mySqlTypeName As String
Syntax: C#
protected string mySqlTypeName;
See Also MySqlValue Class , MySql.Data.Types Namespace 25.2.4.2.3.1.4.1.1.9. MySqlValue.objectValue Field Syntax: Visual Basic
Protected objectValue As Object
Syntax: C#
protected object objectValue;
See Also MySqlValue Class , MySql.Data.Types Namespace 25.2.4.2.3.1.5. IsValidDateTime Property Indicates if this object contains a value that can be represented as a DateTime Syntax: Visual Basic
Public ReadOnly Property IsValidDateTime As Boolean
Syntax: C#
1313
Connector/NET Reference
See Also MySqlDateTime Class , MySql.Data.Types Namespace 25.2.4.2.3.1.6. Minute Property Returns the minute portion of this datetime Syntax: Visual Basic
Public Property Minute As Integer
Syntax: C#
public int Minute {get; set;}
See Also MySqlDateTime Class , MySql.Data.Types Namespace 25.2.4.2.3.1.7. Month Property Returns the month portion of this datetime Syntax: Visual Basic
Public Property Month As Integer
Syntax: C#
public int Month {get; set;}
See Also MySqlDateTime Class , MySql.Data.Types Namespace 25.2.4.2.3.1.8. Second Property Returns the second portion of this datetime Syntax: Visual Basic
Public Property Second As Integer
Syntax: C#
public int Second {get; set;}
See Also MySqlDateTime Class , MySql.Data.Types Namespace 25.2.4.2.3.1.9. Year Property Returns the year portion of this datetime Syntax: Visual Basic
Public Property Year As Integer
Syntax: C#
1314
See Also MySqlDateTime Class , MySql.Data.Types Namespace 25.2.4.2.3.1.10. MySqlDateTime.GetDateTime Method Returns this value as a DateTime Syntax: Visual Basic
Public Function GetDateTime() As Date
Syntax: C#
public DateTime GetDateTime();
See Also MySqlDateTime Class , MySql.Data.Types Namespace 25.2.4.2.3.1.11. MySqlDateTime.ToString Method Returns a MySQL specific string representation of this value Syntax: Visual Basic
Overrides Public Function ToString() As String
Syntax: C#
public override string ToString();
1315
In this example, the MySqlConnection object is configured to connect to a MySQL server at 127.0.0.1, with a username of root and a password of 12345. The default database for all statements will be the test database. The following options are typically used (a full list of options is available in the API documentation for Seccin 25.2.3.3.15, ConnectionString): Server: The name or network address of the instance of MySQL to which to connect. The default is localhost. Aliases include host, Data Source, DataSource, Address, Addr and Network Address. Uid: The MySQL user account to use when connecting. Aliases include User Id, Username and User name. Pwd: The password for the MySQL account being used. Alias Password can also be used. Database: The default database that all statements are applied to. Default is mysql. Alias Initial Catalog can also be used. Port: The port MySQL is using to listen for connections. Default is 3306. Specify -1 for this value to use a named-pipe connection.
C# Example
MySql.Data.MySqlClient.MySqlConnection conn; string myConnectionString; myConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;"; try { conn = new MySql.Data.MySqlClient.MySqlConnection(); conn.ConnectionString = myConnectionString; conn.Open(); } catch (MySql.Data.MySqlClient.MySqlException ex) { MessageBox.Show(ex.Message);
1316
You can also pass the connection string to the constructor of the MySqlConnection class: Visual Basic Example
Dim myConnectionString as String myConnectionString = "server=127.0.0.1;" _ & "uid=root;" _ & "pwd=12345;" _ & "database=test;" Try Dim conn As New MySql.Data.MySqlClient.MySqlConnection(myConnectionString) conn.Open() Catch ex As MySql.Data.MySqlClient.MySqlException MessageBox.Show(ex.Message) End Try
C# Example
MySql.Data.MySqlClient.MySqlConnection conn; string myConnectionString; myConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;"; try { conn = new MySql.Data.MySqlClient.MySqlConnection(myConnectionString); conn.Open(); } catch (MySql.Data.MySqlClient.MySqlException ex) { MessageBox.Show(ex.Message); }
Once the connection is open it can be used by the other Connector/NET classes to communicate with the MySQL server.
1317
& "pwd=12345;" _ & "database=test;" Try Dim conn As New MySql.Data.MySqlClient.MySqlConnection(myConnectionString) conn.Open() Catch ex As MySql.Data.MySqlClient.MySqlException Select Case ex.Number Case 0 MessageBox.Show("Cannot connect to server. Contact administrator") Case 1045 MessageBox.Show("Invalid username/password, please try again") End Select End Try
C# Example
MySql.Data.MySqlClient.MySqlConnection conn; string myConnectionString; myConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;"; try { conn = new MySql.Data.MySqlClient.MySqlConnection(myConnectionString); conn.Open(); } catch (MySql.Data.MySqlClient.MySqlException ex) { switch (ex.Number) { case 0: MessageBox.Show("Cannot connect to server. Contact administrator"); case 1045: MessageBox.Show("Invalid username/password, please try again"); } }
Important: Note that if you are using multilanguage databases you must specify the character set in the connection string. If you do not specify the character set, the connection defaults to the latin1 charset. You can specify the character set as part of the connection string, for example:
MySqlConnection myConnection = new MySqlConnection("server=127.0.0.1;uid=root;" + "pwd=12345;database=test;Charset=latin1;");
1318
After entering your statement, call the .Prepare method of the MySqlCommand object. After the statement is prepared, add parameters for each of the dynamic elements in the query. After you enter your query and enter parameters, execute the statement using the .ExecuteNonQuery(), .ExecuteScalar(), or .ExecuteReader methods. For subsequent executions, you need only modify the values of the parameters and call the execute method again, there is no need to set the .CommandText property or redefine the parameters. Visual Basic Example
Dim conn As New MySqlConnection Dim cmd As New MySqlCommand conn.ConnectionString = strConnection Try conn.Open() cmd.Connection = conn cmd.CommandText = "INSERT INTO myTable VALUES(NULL, ?number, ?text)" cmd.Prepare() cmd.Parameters.Add("?number", 1) cmd.Parameters.Add("?text", "One") For i = 1 To 1000 cmd.Parameters["?number"].Value = i cmd.Parameters["?text"].Value = "A string value"
cmd.ExecuteNonQuery() Next Catch ex As MySqlException MessageBox.Show("Error " & ex.Number & " has occurred: " & ex.Message, "Error", MessageBoxButtons.O End Try
C# Example
MySql.Data.MySqlClient.MySqlConnection conn; MySql.Data.MySqlClient.MySqlCommand cmd; conn = new MySql.Data.MySqlClient.MySqlConnection(); cmd = new MySql.Data.MySqlClient.MySqlCommand(); conn.ConnectionString = strConnection; try { conn.Open(); cmd.Connection = conn; cmd.CommandText = "INSERT INTO myTable VALUES(NULL, ?number, ?text)"; cmd.Prepare(); cmd.Parameters.Add("?number", 1); cmd.Parameters.Add("?text", "One"); for (int i=1; i <= 1000; i++) { cmd.Parameters["?number"].Value = i; cmd.Parameters["?text"].Value = "A string value"; cmd.ExecuteNonQuery(); } } catch (MySql.Data.MySqlClient.MySqlException ex) { MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
1319
1320
Catch ex As MySqlException MessageBox.Show("Error " & ex.Number & " has occurred: " & ex.Message, "Error", MessageBoxButtons.O End Try
C# Example
MySql.Data.MySqlClient.MySqlConnection conn; MySql.Data.MySqlClient.MySqlCommand cmd; conn = new MySql.Data.MySqlClient.MySqlConnection(); cmd = new MySql.Data.MySqlClient.MySqlCommand(); conn.ConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;"; try { conn.Open(); cmd.Connection = conn; cmd.CommandText = "CREATE PROCEDURE add_emp(" + "IN fname VARCHAR(20), IN lname VARCHAR(20), IN bday DATETIME, OUT empno INT) " + "BEGIN INSERT INTO emp(first_name, last_name, birthdate) " + "VALUES(fname, lname, DATE(bday)); SET empno = LAST_INSERT_ID(); END"; cmd.ExecuteNonQuery(); } catch (MySql.Data.MySqlClient.MySqlException ex) { MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
It should be noted that, unlike the command-line and GUI clients, you are not required to specify a special delimiter when creating stored procedures in Connector/NET.
1321
cmd.Parameters.Add("?fname", 'Tom') cmd.Parameters["?fname"].Direction = ParameterDirection.Input cmd.Parameters.Add("?bday", #12/13/1977 2:17:36 PM#) cmd.Parameters["?bday"].Direction = ParameterDirection.Input cmd.Parameters.Add("?empno", MySqlDbType.Int32) cmd.Parameters["?empno"].Direction = ParameterDirection.Output cmd.ExecuteNonQuery()
MessageBox.Show(cmd.Parameters["?empno"].Value) Catch ex As MySqlException MessageBox.Show("Error " & ex.Number & " has occurred: " & ex.Message, "Error", MessageBoxButtons.OK, M End Try
C# Example
MySql.Data.MySqlClient.MySqlConnection conn; MySql.Data.MySqlClient.MySqlCommand cmd; conn = new MySql.Data.MySqlClient.MySqlConnection(); cmd = new MySql.Data.MySqlClient.MySqlCommand(); conn.ConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;"; try { conn.Open(); cmd.Connection = conn; cmd.CommandText = "add_emp"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("?lname", "Jones"); cmd.Parameters["?lname"].Direction = ParameterDirection.Input; cmd.Parameters.Add("?fname", "Tom"); cmd.Parameters["?fname"].Direction = ParameterDirection.Input; cmd.Parameters.Add("?bday", DateTime.Parse("12/13/1977 2:17:36 PM")); cmd.Parameters["?bday"].Direction = ParameterDirection.Input; cmd.Parameters.Add("?empno", MySqlDbType.Int32); cmd.Parameters["?empno"].Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); MessageBox.Show(cmd.Parameters["?empno"].Value); } catch (MySql.Data.MySqlClient.MySqlException ex) { MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
Once the stored procedure is called, the values of output parameters can be retrieved by using the .Value property of the MySqlConnector.Parameters collection.
1322
Simple code examples will be presented within this section, and a full sample application can be found in the Samples directory of the Connector/NET installation.
After creating a table, you may need to modify the max_allowed_packet system variable. This variable determines how large of a packet (i.e. a single row) can be sent to the MySQL server. By default, the server will only accept a maximum size of 1 meg from our client application. If you do not intend to exceed 1 meg, this should be fine. If you do intend to exceed 1 meg in your file transfers, this number has to be increased. The max_allowed_packet option can be modified using MySQL Administrator's Startup Variables screen. Adjust the Maximum allowed option in the Memory section of the Networking tab to an appropriate setting. After adjusting the value, click the Apply Changes button and restart the server using the Service Control screen of MySQL Administrator. You can also adjust this value directly in the my.cnf file (add a line that reads max_allowed_packet=xxM), or use the SET max_allowed_packet=xxM; syntax from within MySQL. Try to be conservative when setting max_allowed_packet, as transfers of BLOB data can take some time to complete. Try to set a value that will be adequate for your intended use and increase the value if necessary.
1323
fs.Read(rawData, 0, FileSize) fs.Close() conn.Open() SQL = "INSERT INTO file VALUES(NULL, ?FileName, ?FileSize, ?File)" cmd.Connection = conn cmd.CommandText = SQL cmd.Parameters.Add("?FileName", strFileName) cmd.Parameters.Add("?FileSize", FileSize) cmd.Parameters.Add("?File", rawData) cmd.ExecuteNonQuery() MessageBox.Show("File Inserted into database successfully!", _ "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk) conn.Close() Catch ex As Exception MessageBox.Show("There was an error: " & ex.Message, "Error", _ MessageBoxButtons.OK, MessageBoxIcon.Error) End Try
C# Example
MySql.Data.MySqlClient.MySqlConnection conn; MySql.Data.MySqlClient.MySqlCommand cmd; conn = new MySql.Data.MySqlClient.MySqlConnection(); cmd = new MySql.Data.MySqlClient.MySqlCommand(); string SQL; UInt32 FileSize; byte[] rawData; FileStream fs; conn.ConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;"; try { fs = new FileStream(@"c:\image.png", FileMode.Open, FileAccess.Read); FileSize = fs.Length; rawData = new byte[FileSize]; fs.Read(rawData, 0, FileSize); fs.Close(); conn.Open(); SQL = "INSERT INTO file VALUES(NULL, ?FileName, ?FileSize, ?File)"; cmd.Connection = conn; cmd.CommandText = SQL; cmd.Parameters.Add("?FileName", strFileName); cmd.Parameters.Add("?FileSize", FileSize); cmd.Parameters.Add("?File", rawData); cmd.ExecuteNonQuery(); MessageBox.Show("File Inserted into database successfully!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); conn.Close(); } catch (MySql.Data.MySqlClient.MySqlException ex) { MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
1324
The Read method of the FileStream object is used to load the file into a byte array which is sized according to the Length property of the FileStream object. After assigning the byte array as a parameter of the MySqlCommand object, the ExecuteNonQuery method is called and the BLOB is inserted into the file table.
conn.ConnectionString = "server=127.0.0.1;" _ & "uid=root;" _ & "pwd=12345;" _ & "database=test" SQL = "SELECT file_name, file_size, file FROM file" Try conn.Open() cmd.Connection = conn cmd.CommandText = SQL myData = cmd.ExecuteReader If Not myData.HasRows Then Throw New Exception("There are no BLOBs to save") myData.Read() FileSize = myData.GetUInt32(myData.GetOrdinal("file_size")) rawData = New Byte(FileSize) {} myData.GetBytes(myData.GetOrdinal("file"), 0, rawData, 0, FileSize) fs = New FileStream("C:\newfile.png", FileMode.OpenOrCreate, FileAccess.Write) fs.Write(rawData, 0, FileSize) fs.Close()
myData.Close() conn.Close() Catch ex As Exception MessageBox.Show("There was an error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon. End Try
C# Example
MySql.Data.MySqlClient.MySqlConnection conn; MySql.Data.MySqlClient.MySqlCommand cmd; MySql.Data.MySqlClient.MySqlDataReader myData; conn = new MySql.Data.MySqlClient.MySqlConnection();
1325
cmd = new MySql.Data.MySqlClient.MySqlCommand(); string SQL; UInt32 FileSize; byte[] rawData; FileStream fs; conn.ConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;"; SQL = "SELECT file_name, file_size, file FROM file"; try { conn.Open(); cmd.Connection = conn; cmd.CommandText = SQL; myData = cmd.ExecuteReader(); if (! myData.HasRows) throw new Exception("There are no BLOBs to save"); myData.Read(); FileSize = myData.GetUInt32(myData.GetOrdinal("file_size")); rawData = new byte[FileSize]; myData.GetBytes(myData.GetOrdinal("file"), 0, rawData, 0, FileSize); fs = new FileStream(@"C:\newfile.png", FileMode.OpenOrCreate, FileAccess.Write); fs.Write(rawData, 0, FileSize); fs.Close(); MessageBox.Show("File successfully written to disk!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); myData.Close(); conn.Close(); } catch (MySql.Data.MySqlClient.MySqlException ex) { MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
After connecting, the contents of the file table are loaded into a MySqlDataReader object. The GetBytes method of the MySqlDataReader is used to load the BLOB into a byte array, which is then written to disk using a FileStream object. The GetOrdinal method of the MySqlDataReader can be used to determine the integer index of a named column. Use of the GetOrdinal method prevents errors if the column order of the SELECT query is changed.
1326
The first option is to use Connector/ODBC as an ADO data source when designing your report. You will be able to browse your database and choose tables and fields using drag and drop to build your report. The disadvantage of this approach is that additional work must be performed within your application to produce a dataset that matches the one expected by your report. The second option is to create a dataset in VB.NET and save it as XML. This XML file can then be used to design a report. This works quite well when displaying the report in your application, but is less versatile at design time because you must choose all relevant columns when creating the dataset. If you forget a column you must re-create the dataset before the column can be added to the report. The following code can be used to create a dataset from a query and write it to disk: Visual Basic Example
Dim Dim Dim Dim myData As New DataSet conn As New MySqlConnection cmd As New MySqlCommand myAdapter As New MySqlDataAdapter
conn.ConnectionString = "server=127.0.0.1;" _ & "uid=root;" _ & "pwd=12345;" _ & "database=world" Try conn.Open() cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " _ & "country.name, country.population, country.continent " _ & "FROM country, city ORDER BY country.continent, country.name" cmd.Connection = conn myAdapter.SelectCommand = cmd myAdapter.Fill(myData)
myData.WriteXml("C:\dataset.xml", XmlWriteMode.WriteSchema) Catch ex As Exception MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Err End Try
C# Example
DataSet myData = new DataSet(); MySql.Data.MySqlClient.MySqlConnection conn; MySql.Data.MySqlClient.MySqlCommand cmd; MySql.Data.MySqlClient.MySqlDataAdapter myAdapter; conn = new MySql.Data.MySqlClient.MySqlConnection(); cmd = new MySql.Data.MySqlClient.MySqlCommand(); myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter(); conn.ConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;"; try { cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " + "country.name, country.population, country.continent " + "FROM country, city ORDER BY country.continent, country.name"; cmd.Connection = conn; myAdapter.SelectCommand = cmd; myAdapter.Fill(myData); myData.WriteXml(@"C:\dataset.xml", XmlWriteMode.WriteSchema); } catch (MySql.Data.MySqlClient.MySqlException ex) { MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error);
1327
The resulting XML file can be used as an ADO.NET XML datasource when designing your report. If you choose to design your reports using Connector/ODBC, it can be downloaded from dev.mysql.com.
conn.ConnectionString = _ "server=127.0.0.1;" _ & "uid=root;" _ & "pwd=12345;" _ & "database=test" Try conn.Open() cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " _
1328
& "country.name, country.population, country.continent " _ & "FROM country, city ORDER BY country.continent, country.name" cmd.Connection = conn myAdapter.SelectCommand = cmd myAdapter.Fill(myData)
myReport.Load(".\world_report.rpt") myReport.SetDataSource(myData) myViewer.ReportSource = myReport Catch ex As Exception MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Err End Try
C# Example
using CrystalDecisions.CrystalReports.Engine; using System.Data; using MySql.Data.MySqlClient; ReportDocument myReport = new ReportDocument(); DataSet myData = new DataSet(); MySql.Data.MySqlClient.MySqlConnection conn; MySql.Data.MySqlClient.MySqlCommand cmd; MySql.Data.MySqlClient.MySqlDataAdapter myAdapter; conn = new MySql.Data.MySqlClient.MySqlConnection(); cmd = new MySql.Data.MySqlClient.MySqlCommand(); myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter(); conn.ConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;"; try { cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " + "country.name, country.population, country.continent " + "FROM country, city ORDER BY country.continent, country.name"; cmd.Connection = conn; myAdapter.SelectCommand = cmd; myAdapter.Fill(myData); myReport.Load(@".\world_report.rpt"); myReport.SetDataSource(myData); myViewer.ReportSource = myReport; } catch (MySql.Data.MySqlClient.MySqlException ex) { MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error); }
A new dataset it generated using the same query used to generate the previously saved dataset. Once the dataset is filled, a ReportDocument is used to load the report file and bind it to the dataset. The ReportDocument is the passed as the ReportSource of the crViewer. This same approach is taken when a report is created from a single table using Connector/ODBC. The dataset replaces the table used in the report and the report is displayed properly. When a report is created from multiple tables using Connector/ODBC, a dataset with multiple tables must be created in our application. This allows each table in the report data source to be replaced with a report in the dataset. We populate a dataset with multiple tables by providing multiple SELECT statements in our MySqlCommand object. These SELECT statements are based on the SQL query shown in Crystal Reports in the Database menu's Show SQL Query option. Assume the following query:
1329
FROM `world`.`country` `country` LEFT OUTER JOIN `world`.`city` `city` ON `country`.`Code`=`city`.`CountryC ORDER BY `country`.`Continent`, `country`.`Name`, `city`.`Name`
This query is converted to two SELECT queries and displayed with the following code: Visual Basic Example
Imports CrystalDecisions.CrystalReports.Engine Imports System.Data Imports MySql.Data.MySqlClient Dim Dim Dim Dim Dim myReport As New ReportDocument myData As New DataSet conn As New MySqlConnection cmd As New MySqlCommand myAdapter As New MySqlDataAdapter
conn.ConnectionString = "server=127.0.0.1;" _ & "uid=root;" _ & "pwd=12345;" _ & "database=world" Try conn.Open() cmd.CommandText = "SELECT name, population, countrycode FROM city ORDER BY countrycode, name; " _ & "SELECT name, population, code, continent FROM country ORDER BY continent, name" cmd.Connection = conn myAdapter.SelectCommand = cmd myAdapter.Fill(myData) myReport.Load(".\world_report.rpt") myReport.Database.Tables(0).SetDataSource(myData.Tables(0)) myReport.Database.Tables(1).SetDataSource(myData.Tables(1)) myViewer.ReportSource = myReport Catch ex As Exception MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try
C# Example
using CrystalDecisions.CrystalReports.Engine; using System.Data; using MySql.Data.MySqlClient; ReportDocument myReport = new ReportDocument(); DataSet myData = new DataSet(); MySql.Data.MySqlClient.MySqlConnection conn; MySql.Data.MySqlClient.MySqlCommand cmd; MySql.Data.MySqlClient.MySqlDataAdapter myAdapter; conn = new MySql.Data.MySqlClient.MySqlConnection(); cmd = new MySql.Data.MySqlClient.MySqlCommand(); myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter(); conn.ConnectionString = "server=127.0.0.1;uid=root;" + "pwd=12345;database=test;"; try { cmd.CommandText = "SELECT name, population, countrycode FROM city ORDER " + "BY countrycode, name; SELECT name, population, code, continent FROM " + "country ORDER BY continent, name"; cmd.Connection = conn; myAdapter.SelectCommand = cmd; myAdapter.Fill(myData); myReport.Load(@".\world_report.rpt"); myReport.Database.Tables(0).SetDataSource(myData.Tables(0)); myReport.Database.Tables(1).SetDataSource(myData.Tables(1)); myViewer.ReportSource = myReport;
1330
} catch (MySql.Data.MySqlClient.MySqlException ex) { MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error); }
It is important to order the SELECT queries in alphabetical order, as this is the order the report will expect its source tables to be in. One SetDataSource statement is needed for each table in the report. This approach can cause performance problems because Crystal Reports must bind the tables together on the client-side, which will be slower than using a pre-saved dataset.
1331
Connector/NET Support
Please note that the use of the MySqlDateTime class can still be problematic. The following are some known issues: 1. Data binding for invalid dates can still cause errors (zero dates like 0000-00-00 do not seem to have this problem). 2. The ToString method return a date formatted in the standard MySQL format (for example, 2005-02-23 08:50:25). This differs from the ToString behavior of the .NET DateTime class. 3. The MySqlDateTime class supports NULL dates, while the .NET DateTime class does not. This can cause errors when trying to convert a MySQLDateTime to a DateTime if you do not check for NULL first. Because of the known issues, the best recommendation is still to use only valid dates in your application.
C# Example
if (! myReader.IsDBNull(myReader.GetOrdinal("mytime"))) myTime = myReader.GetDateTime(myReader.GetOrdinal("mytime")); else myTime = DateTime.MinValue;
NULL values will work in a dataset and can be bound to form controls without special handling.
1332
1333
The user used to connect to the MySQL server must have the following privileges to use the functionality provided by the MySQL Visual Studio Plugin: The SELECT privilege for the INFORMATION_SCHEMA database. The EXECUTE privilege for the SHOW CREATE TABLE statement. The SELECT privilege for the mysql.proc table (required for operations with stored procedures and functions). The SELECT privilege for the mysql.func table (required for operations with User Defined Functions (UDF)). The EXECUTE privilege for the SHOW ENGINE STATUS statement (required for retrieving extended error information). Appropriate privileges for performed operations (e.g. the SELECT privilege is required to browse data from a table etc.). The MySQL Visual Studio Plugin is delivered as a MSI package that can be used to install, uninstall or reinstall the Provider. If you are not using Windows XP or Windows Server 2003 you upgrade the Windows Installer system to the latest version (see http://support.microsoft.com/default.aspx? scid=kb;EN-US;292539 for details). The MSI-package is named MySQL.VisualStudio.msi. To install the MySQL Visual Studio Plugin, right click on the MSI file and select Install. The installation process is as follow: 1. The standard Welcome dialog is opened. Click Next to continue installation. 2. The License agreement (GNU GPL) window is opened. Accept the agreement and click Next to continue. 3. The destination folder choice dialog is opened. Here you can point out the folder where the MySQL Visual Studio Plugin will be installed. The default destination folder is %ProgramFilesDir% \MySQL\MySQL DDEX Data Provider, where %ProgramFilesDir% is the Program Files folder of the installation machine. After choosing the destination folder, click Next to continue. 4. The installer will ask to confirm that installation. Click Install to start installation process. 5. The installation will now take place. At the end of this step the Visual Studio command table is rebuilt (this process may take several minutes). 6. Once installation is complete, click Finish to end the installation process. To uninstall the MySQL Visual Studio Plugin, you can use either Add/Remove Programs component of the Control Panel or the same MSI-package. Choose the Remove option, and the Provider will be uninstalled automatically. To repair the Provider, right click the MSI-package and choose the Repair option. The MySQL Visual Studio Plugin will be repaired automatically. The installation package includes the following files: MySQL.VisualStudio.dll the MySQL DDEX Provider assembly. MySQL.Data.dll the assembly containing the MySQL Connector .NET which is used by the Provider. MySql.VisualStudio.dll.config the configuration file for the MySQL Visual Studio Plugin. This file contains default values for the provider GUI layout. Nota Do not remove this file before the first use of the Provider.
1334
Register.reg the file with registry entries that can be used to register the MySQL DDEX Provider in the case of the manual installation. Install.js the script used to register the Connector .NET as an ADO.NET data provider in the machine.config file. Release notes.doc the document with release notes. To install the Provider manually, copy all files of the installation package in a desired folder, then set the full path to the Provider assembly as a value of the CodeBase entry. For example:
Then import information from the Register.reg file to the registry by clicking of the file. At the confirmation dialog choose Yes. Next you must run the command devenv.exe /setup within a Command Prompt to rebuild the Visual Studio command table.
1335
5. Enter the connection settings: the server host name (for example, localhost if the MySQL server is installed on the local machine), the user name, the password, and the default database schema. Note that you must specify the default schema name to open the connection.
6. You can also set the port to connect with the MySQL server by pressing the Advanced button. To test a connection with the MySQL server, ser the server host name, the user name, and the password, and press the Test Connection button. If the test fails, check the connection values that you have supplied are correct and that the corresponding user and privileges have been configured on the MySQL server. 7. After you set all settings and test the connection, press OK. The newly created connection is displayed in Server Explorer. Now you can work with the MySQL server through standard Server Explorer interface. After a connection is successfully established, all the connection settings are saved. When you next open Visual Studio, the connection to the MySQL server will appear within Server Explorer so that you can re-establish a connection to the MySQL server. To modify and delete a connection, use the Server Explorer context menu for the corresponding node. You can modify any of the settings just by overwriting the existing values with new ones. Note that a connection should be modified or deleted only if no active editor for it's objects is opened. Otherwise your data could be lost.
1336
Database objects (tables, views, stored routines, triggers, and user defined functions) are displayed in the Server Explorer tree. Here you can choose an object and edit its properties and definition. Properties of a selected database object are displayed in the Properties panel. Certain properties can be edited directly within this window. The editor panel provides direct access to the SQL statement and definition of specific objects. Fore example, the SQL statements within a stored procedure definition are shown and edited within this panel.
1337
The MySQL Visual Studio Plugin Table Editor is implemented in a similar fashion to the standard Query Browser Table Editor, but with minor differences.
1338
The Table Editor consists of the following parts: Columns Editor for column creation, modification and deletion. Indexes tab for table/column index management. Foreign Keys tab for configuration of foreign keys. Column Details tab used to set advanced column options. Properties window used to set table properties. To save changes you have made in the Table Editor, use either Save or Save All buttons of the Visual Studio main toolbar, or just press Ctrl+S. Before changes are saved, a confirmation dialog will be displayed to confirm that you want to update the corresponding object within the MySQL database.
1339
To change foreign key settings, select the foreign key and use the Foreign Keys Settings panel to edit the properties. When a foreign key is changed, the MySQL Visual Studio Plugin generates two queries: the first query drops the changed keys and the second one recreates the new values. The reason for such a behavior is to avoid the Bug #8377 and Bug #8919. Nota If changed values are for some reason inconsistent and cause the second query to fail, all affected foreign keys will be dropped. If this is the case, the MySQL Visual Studio Plugin will mark them as new in the Table Editor, and you will have to recreate them later. But if you close the Table Editor without saving, these foreign keys will be lost.
1340
Union Some of these properties can have arbitrary text values, others accept values from a predefined set. The properties Schema and Server are read only.
1341
1342
All other trigger properties are set in the Properties window. These properties are: Definer Event Manipulation Name Timing Some of these properties can have arbitrary text values, others accept values only from a predefined set. The properties Event Table, Schema and Server in the Properties window are read-only. To save changes you have made, use either Save or Save All buttons of the Visual Studio main toolbar, or just press Ctrl+S. A confirmation dialog will confirm whether you want the changes saved to the database.
1343
To save the cloned object, use either Save or Save All buttons of the Visual Studio main toolbar, or just press Ctrl+S. A confirmation dialog will confirm whether you want the changes saved to the database.
1344
Connector/J Installation
Connector/J 5.0 provides support for all the functionality offered by Connector/J 3.1 and includes distributed transaction (XA) support. The current recommended version for Connector/J is 5.0. This guide covers all three connector versions, with specific notes given where a setting applies to a specific option.
1345
Connector/J Installation
You will need to use the appropriate graphical or command-line utility to un-archive the distribution (for example, WinZip for the .zip archive, and tar for the .tar.gz archive). Because there are potentially long filenames in the distribution, we use the GNU tar archive format. You will need to use GNU tar (or an application that understands the GNU tar archive format) to unpack the .tar.gz variant of the distribution.
Within Windows 2000, Windows XP and Windows Server 2003, you must set the environment variable through the System control panel. If you want to use MySQL Connector/J with an application server such as Tomcat or JBoss, you will have to read your vendor's documentation for more information on how to configure third-party class libraries, as most application servers ignore the CLASSPATH environment variable. For configuration examples for some J2EE application servers, see Seccin 25.4.5.2, Using Connector/J with J2EE and Other Java Frameworks. However, the authoritative source for JDBC connection pool configuration information for your particular application server is the documentation for that application server. If you are developing servlets or JSPs, and your application server is J2EE-compliant, you can put the driver's .jar file in the WEB-INF/lib subdirectory of your webapp, as this is a standard location for third party class libraries in J2EE web applications. You can also use the MysqlDataSource or MysqlConnectionPoolDataSource classes in the com.mysql.jdbc.jdbc2.optional package, if your J2EE application server supports or requires them. Starting with Connector/J 5.0.0, the javax.sql.XADataSource interface is implemented via the com.mysql.jdbc.jdbc2.optional.MysqlXADataSource class, which supports XA distributed transactions when used in combination with MySQL server version 5.0. The various MysqlDataSource classes support the following parameters (through standard set mutators): user password serverName (see the previous section about fail-over hosts) databaseName port
1346
Connector/J Installation
Connector/J Installation
ResultSet.getString() Calling ResultSet.getString() on a BLOB column will now return the address of the byte[] array that represents it, instead of a String representation of the BLOB. BLOBs have no character set, so they can't be converted to java.lang.Strings without data loss or corruption. To store strings in MySQL with LOB behavior, use one of the TEXT types, which the driver will treat as a java.sql.Clob. Debug builds Starting with Connector/J 3.1.8 a debug build of the driver in a file named mysqlconnector-java-[version]-bin-g.jar is shipped alongside the normal binary jar file that is named mysql-connector-java-[version]-bin.jar. Starting with Connector/J 3.1.9, we don't ship the .class files unbundled, they are only available in the JAR archives that ship with the driver. You should not use the debug build of the driver unless instructed to do so when reporting a problem or bug to MySQL AB, as it is not designed to be run in production environments, and will have adverse performance impact when used. The debug binary also depends on the Aspect/J runtime library, which is located in the src/lib/aspectjrt.jar file that comes with the Connector/J distribution.
Connector/J Examples
To check out and compile a specific branch of MySQL Connector/J, follow these steps: 1. At the time of this writing, there are three active branches of Connector/J: branch_3_0, branch_3_1 and branch_5_0. Check out the latest code from the branch that you want with the following command (replacing [major] and [minor] with appropriate version numbers):
shell> svn co http://svn.mysql.com/svnpublic/connector-j/branches/branch_[major]_[minor]/connector-j
This creates a connector-j subdirectory in the current directory that contains the latest sources for the requested branch. 2. Change location to the connector-j directory to make it your current working directory:
shell> cd connector-j
3. Issue the following command to compile the driver and create a .jar file suitable for installation:
shell> ant dist
This creates a build directory in the current directory, where all build output will go. A directory is created in the build directory that includes the version number of the sources you are building from. This directory contains the sources, compiled .class files, and a .jar file suitable for deployment. For other possible targets, including ones that will create a fully packaged distribution, issue the following command:
shell> ant --projecthelp
4. A newly created .jar file containing the JDBC driver will be placed in the directory build/mysqlconnector-java-[version]. Install the newly created JDBC driver as you would a binary .jar file that you download from MySQL by following the instructions in Seccin 25.4.2.2, Installing the Driver and Configuring the CLASSPATH.
1349
25.4.4.1. Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J
The name of the class that implements java.sql.Driver in MySQL Connector/J is com.mysql.jdbc.Driver. The org.gjt.mm.mysql.Driver class name is also usable to remain backward-compatible with MM.MySQL. You should use this class name when registering the driver, or when otherwise configuring software to use MySQL Connector/J. The JDBC URL format for MySQL Connector/J is as follows, with items in square brackets ([, ]) being optional:
jdbc:mysql://[host][,failoverhost...][:port]/[database] [?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...
If the hostname is not specified, it defaults to 127.0.0.1. If the port is not specified, it defaults to 3306, the default port number for MySQL servers.
jdbc:mysql://[host:port],[host:port].../[database] [?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...
If the database is not specified, the connection will be made with no default database. In this case, you will need to either call the setCatalog() method on the Connection instance or fully-specify table names using the database name (i.e. SELECT dbname.tablename.colname FROM dbname.tablename...) in your SQL. Not specifying the database to use upon connection is generally only useful when building tools that work with multiple databases, such as GUI database managers. MySQL Connector/J has fail-over support. This allows the driver to fail-over to any number of slave hosts and still perform read-only queries. Fail-over only happens when the connection is in an autoCommit(true) state, because fail-over can not happen reliably when a transaction is in progress. Most application servers and connection pools set autoCommit to true at the end of every transaction/connection use. The fail-over functionality has the following behavior: If the URL property autoReconnect is false: Failover only happens at connection initialization, and failback occurs when the driver determines that the first host has become available again. If the URL property autoReconnect is true: Failover happens when the driver determines that the connection has failed (before every query), and falls back to the first host when it determines that the host has become available again (after queriesBeforeRetryMaster queries have been issued). In either case, whenever you are connected to a "failed-over" server, the connection will be set to readonly state, so queries that would modify data will have exceptions thrown (the query will never be processed by the MySQL server). Configuration properties define how Connector/J will make a connection to a MySQL server. Unless otherwise noted, properties can be set for a DataSource object or for a Connection object. Configuration Properties can be set in one of the following ways: Using the set*() methods on MySQL implementations of java.sql.DataSource (which is the preferred method when using implementations of java.sql.DataSource): com.mysql.jdbc.jdbc2.optional.MysqlDataSource com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
1350
As a key/value pair in the java.util.Properties instance passed to DriverManager.getConnection() or Driver.connect() As a JDBC URL parameter in the URL given to java.sql.DriverManager.getConnection(), java.sql.Driver.connect() or the MySQL implementations of the javax.sql.DataSource setURL() method. Note. If the mechanism you use to configure a JDBC URL is XML-based, you will need to use the XML character literal & to separate configuration parameters, as the ampersand is a reserved character for XML. The properties are listed in the following tables. Connection/Authentication. Property Name user password socketFactory Definition The user to connect as The password to use when connecting The name of the class that the driver should use for creating socket connections to the server. This class must implement the interface 'com.mysql.jdbc.SocketFactory' and have public no-args constructor. Timeout for socket connect (in milliseconds), with 0 being no timeout. Only works on JDK-1.4 or newer. Defaults to '0'. Timeout on network socket operations (0, the default means no timeout). Default Value Since Version all versions all versions
com.mysql.jdbc.StandardSoc 3.0.3
connectTimeout
3.0.1
socketTimeout
3.0.1 5.1.4
connectionLifecycleInterceptors A comma-delimited list of classes that implement "com.mysql.jdbc.ConnectionLifecycleInterceptor" that should notified of connection lifecycle events (creation, destruction, commit, rollback, setCatalog and setAutoCommit) and potentially alter the execution of these commands. ConnectionLifecycleInterceptors are "stackable", more than one interceptor may be specified via the configuration property as a comma-delimited list, with the interceptors executed in order from left to right. useConfigs Load the comma-delimited list of configuration properties before parsing the URL or applying user-specified properties. These configurations are explained in the 'Configurations' of the documentation. Set the CLIENT_INTERACTIVE flag, which tells MySQL to timeout connections based on INTERACTIVE_TIMEOUT instead of WAIT_TIMEOUT Hostname or IP address given to explicitly configure the interface that the driver will bind the client side of the TCP/IP connection to when connecting. false
3.1.5
interactiveClient
3.1.0
localSocketAddress
5.0.5
1351
propertiesTransform
An implementation of com.mysql.jdbc.ConnectionPropertiesTransform that the driver will use to modify URL properties passed to the driver before attempting a connection Use zlib compression when communicating with the server (true/false)? Defaults to 'false'. false
3.1.4
useCompression
3.0.17
Networking. Property Name tcpKeepAlive tcpNoDelay Definition If connecting using TCP/IP, should the driver set SO_KEEPALIVE? If connecting using TCP/IP, should the driver set SO_TCP_NODELAY (disabling the Nagle Algorithm)? If connecting using TCP/IP, should the driver set SO_RCV_BUF to the given value? The default value of '0', means use the platform default value for this property) If connecting using TCP/IP, shuold the driver set SO_SND_BUF to the given value? The default value of '0', means use the platform default value for this property) If connecting using TCP/IP, should the driver set traffic class or type-ofservice fields ?See the documentation for java.net.Socket.setTrafficClass() for more information. Default Value true true Since Version 5.0.7 5.0.7
tcpRcvBuf
5.0.7
tcpSndBuf
5.0.7
tcpTrafficClass
5.0.7
High Availability and Clustering. Property Name autoReconnect Definition Default Value Since Version 1.1
Should the driver try to re-establish stale and/ false or dead connections? If enabled the driver will throw an exception for a queries issued on a stale or dead connection, which belong to the current transaction, but will attempt reconnect before the next query issued on the connection in a new transaction. The use of this feature is not recommended, because it has side effects related to session state and data consistency when applications don't handle SQLExceptions properly, and is only designed to be used when you are unable to configure your application to handle SQLExceptions resulting from dead and stale connections properly. Alternatively, investigate setting the MySQL server variable "wait_timeout" to some high value rather than the default of 8 hours. Use a reconnection strategy appropriate for connection pools (defaults to 'false') false
autoReconnectForPools
3.1.3
1352
When failing over in autoReconnect mode, should true the connection be set to 'read-only'? Maximum number of reconnects to attempt if autoReconnect is true, default is '3'. If autoReconnect is set to true, should the driver attempt reconnections at the end of every transaction? 3 false
initialTimeout
If autoReconnect is enabled, the initial time to wait 2 between re-connect attempts (in seconds, defaults to '2'). When autoReconnect is enabled, and failoverReadonly is false, should we pick hosts to connect to on a round-robin basis? false
1.1
roundRobinLoadBalance
3.1.2
queriesBeforeRetryMaster
Number of queries to issue before falling 50 back to master when failed over (when using multi-host failover). Whichever condition is met first, 'queriesBeforeRetryMaster' or 'secondsBeforeRetryMaster' will cause an attempt to be made to reconnect to the master. Defaults to 50. How long should the driver wait, when failed over, 30 before attempting A globally unique name that identifies the resource that this datasource or connection is connected to, used for XAResource.isSameRM() when the driver can't determine this value based on hostnames used in the URL
3.0.2
secondsBeforeRetryMaster resourceId
3.0.2 5.0.1
Security. Property Name allowMultiQueries useSSL requireSSL allowLoadLocalInfile allowUrlInLocalInfile Definition Default Value Since Version 3.1.1 3.0.2 3.1.0 3.0.3 3.1.4 5.1.0 5.1.0
Allow the use of ';' to delimit multiple queries false during one statement (true/false), defaults to 'false' Use SSL when communicating with the server (true/false), defaults to 'false' false
Require SSL connection if useSSL=true? (defaults false to 'false'). Should the driver allow use of 'LOAD DATA LOCAL INFILE...' (defaults to 'true'). Should the driver allow URLs in 'LOAD DATA LOCAL INFILE' statements? true false
clientCertificateKeyStorePassword Password for the client certificates KeyStore clientCertificateKeyStoreType KeyStore type for client certificates (NULL or empty means use default, standard keystore types supported by the JVM are "JKS" and "PKCS12", your environment may have more available depending on what security products are installed and available to the JVM. clientCertificateKeyStoreUrl URL to the client certificate KeyStore (if not specified, use defaults)
5.1.0 5.1.0
1353
trustCertificateKeyStoreType KeyStore type for trusted root certificates (NULL or empty means use default, standard keystore types supported by the JVM are "JKS" and "PKCS12", your environment may have more available depending on what security products are installed and available to the JVM. trustCertificateKeyStoreUrl paranoid URL to the trusted root certificate KeyStore (if not specified, use defaults) Take measures to prevent exposure sensitive information in error messages and clear data structures holding sensitive data when possible? (defaults to 'false') false
5.1.0
5.1.0 3.0.1
Performance Extensions. Property Name callableStmtCacheSize metadataCacheSize Definition If 'cacheCallableStmts' is enabled, how many callable statements should be cached? Default Value 100 Since Version 3.1.2 3.1.1
The number of queries to cache 50 ResultSetMetadata for if cacheResultSetMetaData is set to 'true' (default 50) If prepared statement caching is enabled, how many prepared statements should be cached? If prepared statement caching is enabled, what's the largest SQL the driver will cache the parsing for? Should the driver always communicate with the database when Connection.setTransactionIsolation() is called? If set to false, the driver will only communicate with the database when the requested transaction isolation is different than the whichever is newer, the last value that was set via Connection.setTransactionIsolation(), or the value that was read from the server when the connection was established. Should the driver maintain various internal timers to enable idle time calculations as well as more verbose error messages when the connection to the server fails? Setting this property to false removes at least two calls to System.getCurrentTimeMillis() per query. If connected to MySQL > 5.0.2, and setFetchSize() > 0 on a statement, should that statement use cursor-based fetching to retrieve rows? Chunk to use when sending BLOB/CLOBs via ServerPreparedStatements Should the driver cache the parsing stage of CallableStatements Should the driver cache the parsing stage of PreparedStatements of client-side prepared statements, the "check" for suitability of server25 256
prepStmtCacheSize prepStmtCacheSqlLimit
3.0.10 3.0.10
alwaysSendSetIsolation
true
3.1.7
maintainTimeStats
true
3.1.9
useCursorFetch
false
5.0.0
1354
side prepared and server-side prepared statements themselves? cacheResultSetMetadata Should the driver cache ResultSetMetaData for Statements and PreparedStatements? (Req. JDK-1.4+, true/false, default 'false') Should the driver cache the results of 'SHOW VARIABLES' and 'SHOW COLLATION' on a perURL basis? The driver will call setFetchSize(n) with this value on all newly-created Statements false 3.1.1
cacheServerConfiguration
false
3.1.5
defaultFetchSize dontTrackOpenResources
3.1.9 3.1.7
The JDBC specification requires the driver to false automatically track and close resources, however if your application doesn't do a good job of explicitly calling close() on statements or result sets, this can cause memory leakage. Setting this property to true relaxes this constraint, and can be more memory efficient for some applications. Should the driver retrieve the default calendar when required, or cache it per connection/ session? If using MySQL-4.1 or newer, should the driver only issue 'set autocommit=n' queries when the server's state doesn't match the requested state by Connection.setAutoCommit(boolean)? When enabled, query timeouts set via Statement.setQueryTimeout() use a shared java.util.Timer instance for scheduling. Even if the timeout doesn't expire before the query is processed, there will be memory used by the TimerTask for the given timeout which won't be reclaimed until the time the timeout would have expired if it hadn't been cancelled by the driver. High-load environments might want to consider disabling this functionality. false
dynamicCalendars
3.1.5
elideSetAutoCommits
false
3.1.3
enableQueryTimeouts
true
5.0.6
holdResultsOpenOverStatementClose Should the driver close result sets on Statement.close() as required by the JDBC specification? largeRowSizeThreshold What size result set row should the JDBC driver consider "large", and thus use a more memoryefficient way of representing the row internally?
false
3.1.7
2048
5.1.1
loadBalanceStrategy
If using a load-balanced connection to random connect to SQL nodes in a MySQL Cluster/ NDB configuration (by using the URL prefix "jdbc:mysql:loadbalance://"), which load balancing algorithm should the driver use: (1) "random" - the driver will pick a random host for each request. This tends to work better than round-robin, as the randomness will somewhat account for spreading loads where requests vary in response time, while round-robin can sometimes lead to overloaded nodes if there are variations in response times across the workload. (2) "bestResponseTime" the driver will route the request to the host that
5.0.6
1355
had the best response time for the previous transaction. locatorFetchBufferSize If 'emulateLocators' is configured to 'true', what size buffer should be used when fetching BLOB data for getBinaryInputStream? 1048576 3.2.1
rewriteBatchedStatements
Should the driver use multiqueries (irregardless false of the setting of "allowMultiQueries") as well as rewriting of prepared statements for INSERT into multi-value inserts when executeBatch() is called? Notice that this has the potential for SQL injection if using plain java.sql.Statements and your code doesn't sanitize input correctly. Notice that for prepared statements, serverside prepared statements can not currently take advantage of this rewrite option, and that if you don't specify stream lengths when using PreparedStatement.set*Stream(), the driver won't be able to determine the optimum number of parameters per batch and you might receive an error from the driver that the resultant packet is too large. Statement.getGeneratedKeys() for these rewritten statements only works when the entire batch includes INSERT statements. Use newer result set row unpacking code that true skips a copy from network buffers to a MySQL packet instance and instead reads directly into the result set row data buffers. Should the driver use a per-connection cache of true character set information queried from the server when necessary, or use a built-in static mapping that is more efficient, but isn't aware of custom character sets or character sets implemented after the release of the JDBC driver? Use internal String->Date/Time/Timestamp conversion routines to avoid excessive object creation? true
3.1.13
useDirectRowUnpack
5.1.1
useDynamicCharsetInfo
5.0.6
useFastDateParsing
5.0.5
useFastIntParsing useJvmCharsetConverters
Use internal String->Integer conversion routines to true avoid excessive object creation? Always use the character encoding routines built into the JVM, rather than using lookup tables for single-byte character sets? Should the driver refer to the internal values of autocommit and transaction isolation that are set by Connection.setAutoCommit() and Connection.setTransactionIsolation() and transaction state as maintained by the protocol, rather than querying the database or blindly sending commands to the database for commit() or rollback() method calls? false
3.1.4 5.0.1
useLocalSessionState
false
3.1.7
useReadAheadInput
Use newer, optimized non-blocking, buffered input true stream when reading from the server?
3.1.5
Debugging/Profiling.
1356
Definition
Default Value
Since Version
The name of a class that implements com.mysql.jdbc.log.Standard 3.1.1 "com.mysql.jdbc.log.Log" that will be used to log messages to. (default is "com.mysql.jdbc.log.StandardLogger", which logs to STDERR) Should the driver gather performance metrics, and report them via the configured logger every 'reportMetricsIntervalMillis' milliseconds? false 3.1.2
gatherPerfMetrics
profileSQL profileSql
Trace queries and their execution/fetch times to false the configured logger (true/false) defaults to 'false' Deprecated, use 'profileSQL' instead. Trace queries and their execution/fetch times on STDERR (true/false) defaults to 'false' If 'gatherPerfMetrics' is enabled, how often should 30000 they be logged (in ms)? Controls the maximum length/size of a query that will get logged when profiling or tracing The maximum number of packets to retain when 'enablePacketDebug' is true If 'logSlowQueries' is enabled, how long should a query (in ms) before it is logged as 'slow'? If 'useNanosForElapsedTime' is set to true, and this property is set to a non-zero value, the driver will use this threshold (in nanosecond units) to determine if a query was slow. Should the driver issue 'usage' warnings advising proper and efficient usage of JDBC and MySQL Connector/J to the log (true/false, defaults to 'false')? 2048 20 2000 0
3.1.0 2.0.14
useUsageAdvisor
false
3.1.1
autoGenerateTestcaseScript Should the driver dump the SQL it is executing, including server-side prepared statements to STDERR? autoSlowLog Instead of using slowQueryThreshold* to determine if a query is slow enough to be logged, maintain statistics that allow the driver to determine queries that are outside the 99th percentile?
false
3.1.9
true
5.1.4
clientInfoProvider
The name of a class that implements the com.mysql.jdbc.JDBC4Comm 5.1.0 com.mysql.jdbc.JDBC4ClientInfoProvider interface in order to support JDBC-4.0's Connection.get/ setClientInfo() methods false 3.1.13
dumpMetadataOnColumnNotFound Should the driver dump the field-level metadata of a result set into the exception message when ResultSet.findColumn() fails? dumpQueriesOnException Should the driver dump the contents of the query sent to the server in the message for SQLExceptions?
false
3.1.3
enablePacketDebug
3.1.3
1357
dumped when exceptions are thrown in key areas in the driver's code explainSlowQueries If 'logSlowQueries' is enabled, should the driver automatically issue an 'EXPLAIN' on the server and send the results to the configured log at a WARN level? false 3.1.2
includeInnodbStatusInDeadlockExceptions Include the output of "SHOW ENGINE INNODB STATUS" in exception messages when deadlock exceptions are detected? logSlowQueries logXaCommands Should queries that take longer than 'slowQueryThresholdMillis' be logged? Should the driver log XA commands sent by MysqlXaConnection to the server, at the DEBUG level of logging?
false
5.0.7
false false
3.1.2 5.0.5
resultSetSizeThreshold
If the usage advisor is enabled, how many rows 100 should a result set contain before the driver warns that it is suspiciously large? Should trace-level network protocol be logged? false For profiling/debugging functionality that measures false elapsed time, should the driver try to use nanoseconds resolution if available (JDK >= 1.5)?
5.0.5
traceProtocol useNanosForElapsedTime
3.1.2 5.0.7
Miscellaneous. Property Name useUnicode Definition Default Value Since Version 1.1g
Should the driver use Unicode character true encodings when handling strings? Should only be used when the driver can't determine the character set mapping, or you are trying to 'force' the driver to use a character set that MySQL either doesn't natively support (such as UTF-8), true/ false, defaults to 'true' If 'useUnicode' is set to true, what character encoding should the driver use when dealing with strings? (defaults is to 'autodetect') Character set to tell the server to return results as. If set, tells the server to use this collation via 'set collation_connection'
characterEncoding
1.1g
characterSetResults connectionCollation
useBlobToStoreUTF8OutsideBMP Tells the driver to treat [MEDIUM/LONG]BLOB false columns as [LONG]VARCHAR columns holding text encoded in UTF-8 that has characters outside the BMP (4-byte encodings), which MySQL server can't handle natively. utf8OutsideBmpExcludedColumnNamePattern When "useBlobToStoreUTF8OutsideBMP" is set to "true", column names matching the given regex will still be treated as BLOBs unless they match the regex specified for "utf8OutsideBmpIncludedColumnNamePattern". The regex must follow the patterns used for the java.util.regex package. utf8OutsideBmpIncludedColumnNamePattern Used to specify exclusion rules to "utf8OutsideBmpExcludedColumnNamePattern".
5.1.3
5.1.3
1358
The regex must follow the patterns used for the java.util.regex package. sessionVariables A comma-separated list of name/value pairs to be sent as SET SESSION ... to the server when the driver connects. Should the driver allow NaN or +/- INF values in PreparedStatement.setDouble()? Should the driver automatically call .close() on streams/readers passed as arguments via set*() methods? Should the driver automatically detect and deserialize objects stored in BLOB fields? Should the driver always treat BLOBs as Strings - specifically to work around dubious metadata returned by the server for GROUP BY clauses? false false 3.1.8
allowNanAndInf autoClosePStmtStreams
3.1.5 3.1.12
autoDeserialize blobsAreStrings
false false
3.1.5 5.0.8
capitalizeTypeNames
Capitalize type names in DatabaseMetaData? false (usually only useful when using WebObjects, true/ false, defaults to 'false') The character encoding to use for sending and retrieving TEXT, MEDIUMTEXT and LONGTEXT values instead of the configured connection characterEncoding This will cause a 'streaming' ResultSet to be automatically closed, and any outstanding data still streaming from the server to be discarded if another query is executed before all the data has been read from the server. false
2.0.7
clobCharacterEncoding
5.0.0
clobberStreamingResults
3.0.9
continueBatchOnError
Should the driver continue processing batch true commands if one statement fails. The JDBC spec allows either way (defaults to 'true'). Creates the database given in the URL if it doesn't false yet exist. Assumes the configured user has permissions to create databases. Should the driver allow conversions from empty string fields to numeric values of '0'? true
3.0.3
createDatabaseIfNotExist
3.1.9
emptyStringsConvertToZero emulateLocators
3.1.8 3.1.0
Should the driver emulate java.sql.Blobs with false locators? With this feature enabled, the driver will delay loading the actual Blob data until the one of the retrieval methods (getInputStream(), getBytes(), and so forth) on the blob data stream has been accessed. For this to work, you must use a column alias with the value of the column to the actual name of the Blob. The feature also has the following restrictions: The SELECT that created the result set must reference only one table, the table must have a primary key; the SELECT must alias the original blob column name, specified as a string, to an alternate name; the SELECT must cover all columns that make up the primary key. Should the driver detect prepared statements that true are not supported by the server, and replace them with client-side emulated versions?
emulateUnsupportedPstmts
3.1.7
1359
functionsNeverReturnBlobs
Should the driver always treat data from functions false returning BLOBs as Strings - specifically to work around dubious metadata returned by the server for GROUP BY clauses? false
5.0.8
generateSimpleParameterMetadata Should the driver generate simplified parameter metadata for PreparedStatements when no metadata is available either because the server couldn't support preparing the statement, or server-side prepared statements are disabled? ignoreNonTxTables jdbcCompliantTruncation Ignore non-transactional table warning for rollback? (defaults to 'false'). Should the driver throw java.sql.DataTruncation exceptions when data is truncated as is required by the JDBC specification when connected to a server that supports warnings (MySQL 4.1.0 and newer)? This property has no effect if the server sql-mode includes STRICT_TRANS_TABLES. The maximum number of rows to return (0, the default means return all rows).
5.0.5
false true
3.0.9 3.1.2
maxRows
-1
netTimeoutForStreamingResults What value should the driver automatically set 600 the server setting 'net_write_timeout' to when the streaming result sets feature is in use? (value has unit of seconds, the value '0' means the driver will not try and adjust this value) noAccessToProcedureBodies When determining procedure parameter types for CallableStatements, and the connected user can't access procedure bodies through "SHOW CREATE PROCEDURE" or select on mysql.proc should the driver instead create basic metadata (all parameters reported as IN VARCHARs, but allowing registerOutParameter() to be called on them anyway) instead of throwing an exception? noDatetimeStringSync false
5.0.3
noTimezoneConversionForTimeType Don't convert TIME values using the server timezone if 'useTimezone'='true' nullCatalogMeansCurrent
When DatabaseMetadataMethods ask for a true 'catalog' parameter, does the value null mean use the current catalog? (this is not JDBC-compliant, but follows legacy behavior from earlier versions of the driver) Should DatabaseMetaData methods that accept true *pattern parameters treat null the same as '%' (this is not JDBC-compliant, however older versions of the driver accepted this departure from the specification)
nullNamePatternMatchesAll
3.1.8
overrideSupportsIntegrityEnhancementFacility Should the driver return "true" for false DatabaseMetaData.supportsIntegrityEnhancementFacility() even if the database doesn't support it to workaround applications that require this method to return "true" to signal support of foreign keys, even though the SQL specification states that this
3.1.12
1360
facility contains much more than just foreign key support (one such application being OpenOffice)? padCharsWithSpace If a result set column has the CHAR type and the value does not fill the amount of characters specified in the DDL for the column, should the driver pad the remaining characters with space (for ANSI compliance)? Follow the JDBC spec to the letter. false 5.0.6
pedantic
false false
3.0.0 5.0.1
pinGlobalTxToPhysicalConnection When using XAConnections, should the driver ensure that operations on a given XID are always routed to the same physical connection? This allows the XAConnection to support "XA START ... JOIN" after "XA END" has been called
populateInsertRowWithDefaultValues When using ResultSets that are false CONCUR_UPDATABLE, should the driver prepopulate the "insert" row with default values from the DDL for the table used in the query so those values are immediately available for ResultSet accessors? This functionality requires a call to the database for metadata each time a result set of this type is created. If disabled (the default), the default values will be populated by the an internal call to refreshRow() which pulls back default values and/or values changed by triggers. processEscapeCodesForPrepStmts Should the driver process escape codes in queries true that are prepared? relaxAutoCommit If the version of MySQL the driver connects to does not support transactions, still allow calls to commit(), rollback() and setAutoCommit() (true/ false, defaults to 'false')? false
5.0.5
3.1.12 2.0.13
retainStatementAfterResultSetClose Should the driver retain the Statement reference false in a ResultSet after ResultSet.close() has been called. This is not JDBC-compliant after JDBC-4.0. rollbackOnPooledClose runningCTS13 serverTimezone Should the driver issue a rollback() when the logical connection in a pool is closed? Enables workarounds for bugs in Sun's JDBC compliance testsuite version 1.3 Override detection/mapping of timezone. Used when timezone from server doesn't map to Java timezone A comma-delimited list of classes that implement "com.mysql.jdbc.StatementInterceptor" that should be placed "in between" query execution to influence the results. StatementInterceptors are "chainable", the results returned by the "current" interceptor will be passed on to the next in in the chain, from left-to-right order, as specified in this property. Used only in older versions of compliance test false Should the driver do strict checking (all primary true keys selected) of updatable result sets (true, false, defaults to 'true')? true false
3.1.11
statementInterceptors
5.1.1
strictFloatingPoint strictUpdates
3.0.0 3.0.4
1361
tinyInt1isBit
Should the driver treat the datatype TINYINT(1) as true the BIT type (because the server silently converts BIT -> TINYINT(1) when creating tables)? If the driver converts TINYINT(1) to a different type, should it use BOOLEAN instead of BIT for future compatibility with MySQL-5.0, as MySQL-5.0 has a BIT type? Should the driver treat java.util.Date as a TIMESTAMP for the purposes of PreparedStatement.setObject()? false
3.0.16
transformedBitIsBoolean
3.1.9
treatUtilDateAsTimestamp
true
5.0.5
ultraDevHack
Create PreparedStatements for prepareCall() false when required, because UltraDev is broken and issues a prepareCall() for _all_ statements? (true/ false, defaults to 'false') Convert between session timezone and GMT false before creating Date and Timestamp instances (value of "false" is legacy behavior, "true" leads to more JDBC-compliant behavior. Add '@hostname' to users in DatabaseMetaData.getColumn/TablePrivileges() (true/false), defaults to 'true'. When connected to MySQL-5.0.7 or newer, should the driver use the INFORMATION_SCHEMA to derive information used by DatabaseMetaData? true
2.0.3
useGmtMillisForDatetimes
3.1.12
useHostsInPrivileges
3.0.2
useInformationSchema
false
5.0.0
useJDBCCompliantTimezoneShift Should the driver use JDBC-compliant rules when converting TIME/TIMESTAMP/DATETIME values' timezone information for those JDBC arguments which take a java.util.Calendar argument? (Notice that this option is exclusive of the "useTimezone=true" configuration option.) useOldAliasMetadataBehavior Should the driver use the legacy behavior for "AS" clauses on columns and tables, and only return aliases (if any) for ResultSetMetaData.getColumnName() or ResultSetMetaData.getTableName() rather than the original column/table name? useOldUTF8Behavior Use the UTF-8 behavior the driver did when communicating with 4.0 and older servers
false
5.0.0
false
5.0.4
false true
3.1.6 3.0.15
useOnlyServerErrorMessages Don't prepend 'standard' SQLState error messages to error messages returned by the server. useSSPSCompatibleTimezoneShift If migrating from an environment that was using server-side prepared statements, and the configuration property "useJDBCCompliantTimeZoneShift" set to "true", use compatible behavior when not using server-side prepared statements when sending TIMESTAMP values to the MySQL server. useServerPrepStmts
false
5.0.5
3.1.0
1362
useSqlStateCodes
Use SQL Standard state codes instead of 'legacy' true X/Open/SQL state codes (true/false), default is 'true' true
3.1.3
useStreamLengthsInPrepStmtsHonor stream length parameter in PreparedStatement/ResultSet.setXXXStream() method calls (true/false, defaults to 'true')? useTimezone useUnbufferedInput yearIsDateType zeroDateTimeBehavior
3.0.2
Convert time/date types between client and server false timezones (true/false, defaults to 'false')? Don't use BufferedInputStream for reading data from the server Should the JDBC driver treat the MySQL type "YEAR" as a java.sql.Date, or as a SHORT? What should happen when the driver encounters DATETIME values that are composed entirely of zeroes (used by MySQL to represent invalid dates)? Valid values are "exception", "round" and "convertToNull". true true
exception 3.1.4
Connector/J also supports access to MySQL via named pipes on Windows NT/2000/XP using the NamedPipeSocketFactory as a plugin-socket factory via the socketFactory property. If you don't use a namedPipePath property, the default of '\\.\pipe\MySQL' will be used. If you use the NamedPipeSocketFactory, the hostname and port number values in the JDBC url will be ignored. You can enable this feature using:
socketFactory=com.mysql.jdbc.NamedPipeSocketFactory
Named pipes only work when connecting to a MySQL server on the same physical machine as the one the JDBC driver is being used on. In simple performance tests, it appears that named pipe access is between 30%-50% faster than the standard TCP/IP access. You can create your own socket factories by following the example code in com.mysql.jdbc.NamedPipeSocketFactory, or com.mysql.jdbc.StandardSocketFactory.
For this to work, you must also follow follow these rules: The SELECT must also reference only one table, the table must have a primary key.
1363
The SELECT must cover all columns that make up the primary key. The Blob implementation does not allow in-place modification (they are copies, as reported by the DatabaseMetaData.locatorsUpdateCopies() method). Because of this, you should use the corresponding PreparedStatement.setBlob() or ResultSet.updateBlob() (in the case of updatable result sets) methods to save changes back to the database. CallableStatement Starting with Connector/J 3.1.1, stored procedures are supported when connecting to MySQL version 5.0 or newer via the CallableStatement interface. Currently, the getParameterMetaData() method of CallableStatement is not supported. Clob The Clob implementation does not allow in-place modification (they are copies, as reported by the DatabaseMetaData.locatorsUpdateCopies() method). Because of this, you should use the PreparedStatement.setClob() method to save changes back to the database. The JDBC API does not have a ResultSet.updateClob() method. Connection Unlike older versions of MM.MySQL the isClosed() method does not ping the server to determine if it is alive. In accordance with the JDBC specification, it only returns true if closed() has been called on the connection. If you need to determine if the connection is still valid, you should issue a simple query, such as SELECT 1. The driver will throw an exception if the connection is no longer valid. DatabaseMetaData Foreign Key information (getImportedKeys()/getExportedKeys() and getCrossReference()) is only available from InnoDB tables. However, the driver uses SHOW CREATE TABLE to retrieve this information, so when other storage engines support foreign keys, the driver will transparently support them as well. PreparedStatement PreparedStatements are implemented by the driver, as MySQL does not have a prepared statement feature. Because of this, the driver does not implement getParameterMetaData() or getMetaData() as it would require the driver to have a complete SQL parser in the client. Starting with version 3.1.0 MySQL Connector/J, server-side prepared statements and binaryencoded result sets are used when the server supports them. Take care when using a server-side prepared statement with large parameters that are set via setBinaryStream(), setAsciiStream(), setUnicodeStream(), setBlob(), or setClob(). If you want to re-execute the statement with any large parameter changed to a nonlarge parameter, it is necessary to call clearParameters() and set all parameters again. The reason for this is as follows: During both server-side prepared statements and client-side emulation, large data is exchanged only when PreparedStatement.execute() is called. Once that has been done, the stream used to read the data on the client side is closed (as per the JDBC spec), and can't be read from again. If a parameter changes from large to non-large, the driver must reset the server-side state of the prepared statement to allow the parameter that is being changed to take the place of the prior large value. This removes all of the large data that has already been sent to the server,
1364
thus requiring the data to be re-sent, via the setBinaryStream(), setAsciiStream(), setUnicodeStream(), setBlob() or setClob() methods. Consequently, if you want to change the type of a parameter to a non-large one, you must call clearParameters() and set all parameters of the prepared statement again before it can be reexecuted. ResultSet By default, ResultSets are completely retrieved and stored in memory. In most cases this is the most efficient way to operate, and due to the design of the MySQL network protocol is easier to implement. If you are working with ResultSets that have a large number of rows or large values, and can not allocate heap space in your JVM for the memory required, you can tell the driver to stream the results back one row at a time. To enable this functionality, you need to create a Statement instance in the following manner:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(Integer.MIN_VALUE);
The combination of a forward-only, read-only result set, with a fetch size of Integer.MIN_VALUE serves as a signal to the driver to stream result sets row-by-row. After this any result sets created with the statement will be retrieved row-by-row. There are some caveats with this approach. You will have to read all of the rows in the result set (or close it) before you can issue any other queries on the connection, or an exception will be thrown. The earliest the locks these statements hold can be released (whether they be MyISAM table-level locks or row-level locks in some other storage engine such as InnoDB) is when the statement completes. If the statement is within scope of a transaction, then locks are released when the transaction completes (which implies that the statement needs to complete first). As with most other databases, statements are not complete until all the results pending on the statement are read or the active result set for the statement is closed. Therefore, if using streaming results, you should process them as quickly as possible if you want to maintain concurrent access to the tables referenced by the statement producing the result set. ResultSetMetaData The isAutoIncrement() method only works when using MySQL servers 4.0 and newer. Statement When using versions of the JDBC driver earlier than 3.2.1, and connected to server versions earlier than 5.0.3, the setFetchSize() method has no effect, other than to toggle result set streaming as described above. Connector/J 5.0.0 and later include support for both Statement.cancel() and Statement.setQueryTimeout(). Both require MySQL 5.0.0 or newer server, and require a separate connection to issue the KILL QUERY statement. In the case of setQueryTimeout(), the implementation creates an additional thread to handle the timeout functionality. Nota Failures to cancel the statement for setQueryTimeout() may manifest themselves as RuntimeException rather than failing silently, as there is currently no way to unblock the thread that is executing the query being cancelled due to timeout expiration and have it throw the exception instead. 1365
MySQL does not support SQL cursors, and the JDBC driver doesn't emulate them, so "setCursorName()" has no effect.
Note: round-off, overflow or loss of precision may occur if you choose a Java numeric data type that has less precision or capacity than the MySQL data type you are converting to/from. The ResultSet.getObject() method uses the type conversions between MySQL and Java types, following the JDBC specification where appropriate. The value returned by ResultSetMetaData.GetColumnClassName() is also shown below. For more information on the java.sql.Types classes see Java 2 Platform Types. MySQL Types to Java Types for ResultSet.getObject(). MySQL Type Name BIT(1) (new in MySQL-5.0) BIT( > 1) (new in MySQL-5.0) TINYINT Return value of Returned as Java Class GetColumnClassName BIT BIT TINYINT java.lang.Boolean byte[] java.lang.Boolean if the configuration property tinyInt1isBit is set to true (the default) and the storage size is 1, or java.lang.Integer if not. See TINYINT, above as these are aliases for TINYINT(1), currently. java.lang.Integer (regardless if UNSIGNED or not) java.lang.Integer, if UNSIGNED java.lang.Long
1366
INT,INTEGER[(M)] [UNSIGNED] BIGINT[(M)] [UNSIGNED] FLOAT[(M,D)] DOUBLE[(M,B)] DECIMAL[(M[,D])] DATE DATETIME TIMESTAMP[(M)] TIME YEAR[(2|4)]
INTEGER [UNSIGNED] java.lang.Integer, if UNSIGNED java.lang.Long BIGINT [UNSIGNED] FLOAT DOUBLE DECIMAL DATE DATETIME TIMESTAMP TIME YEAR java.lang.Long, if UNSIGNED java.math.BigInteger java.lang.Float java.lang.Double java.math.BigDecimal java.sql.Date java.sql.Timestamp java.sql.Timestamp java.sql.Time If yearIsDateType configuration property is set to false, then the returned object type is java.sql.Short. If set to true (the default) then an object of type java.sql.Date (with the date set to January 1st, at midnight). java.lang.String (unless the character set for the column is BINARY, then byte[] is returned. java.lang.String (unless the character set for the column is BINARY, then byte[] is returned. byte[] byte[] byte[] java.lang.String byte[] java.lang.String byte[] java.lang.String byte[] java.lang.String java.lang.String java.lang.String
CHAR(M)
CHAR
VARCHAR(M) [BINARY] VARCHAR BINARY(M) VARBINARY(M) TINYBLOB TINYTEXT BLOB TEXT MEDIUMBLOB MEDIUMTEXT LONGBLOB LONGTEXT BINARY VARBINARY TINYBLOB VARCHAR BLOB VARCHAR MEDIUMBLOB VARCHAR LONGBLOB VARCHAR
1367
The character encoding between client and server is automatically detected upon connection. The encoding used by the driver is specified on the server via the character_set system variable for server versions older than 4.1.0 and character_set_server for server versions 4.1.0 and newer. For more information, see Seccin 10.3.1, Conjunto de caracteres y colacin del servidor. To override the automatically-detected encoding on the client side, use the characterEncoding property in the URL used to connect to the server. When specifying character encodings on the client side, Java-style names should be used. The following table lists Java-style names for MySQL character sets: MySQL to Java Encoding Name Translations. MySQL Character Set Name ascii big5 gbk sjis cp932 gb2312 ujis euckr latin1 latin2 greek hebrew cp866 tis620 cp1250 cp1251 cp1257 macroman macce utf8 ucs2 Java-Style Character Encoding Name US-ASCII Big5 GBK SJIS (or Cp932 or MS932 for MySQL Server < 4.1.11) Cp932 or MS932 (MySQL Server > 4.1.11) EUC_CN EUC_JP EUC_KR ISO8859_1 ISO8859_2 ISO8859_7 ISO8859_8 Cp866 TIS620 Cp1250 Cp1251 Cp1257 MacRoman MacCentralEurope UTF-8 UnicodeBig
Warning. Do not issue the query 'set names' with Connector/J, as the driver will not detect that the character set has changed, and will continue to use the character set detected during the initial connection setup. To allow multiple character sets to be sent from the client, the UTF-8 encoding should be used, either by configuring utf8 as the default server character set, or by configuring the JDBC driver to use UTF-8 through the characterEncoding property.
1368
For SSL Support to work, you must have the following: A JDK that includes JSSE (Java Secure Sockets Extension), like JDK-1.4.1 or newer. SSL does not currently work with a JDK that you can add JSSE to, like JDK-1.2.x or JDK-1.3.x due to the following JSSE bug: http://developer.java.sun.com/developer/bugParade/bugs/4273544.html A MySQL server that supports SSL and has been compiled and configured to do so, which is MySQL-4.0.4 or later, see Seccin 5.7.7, Usar conexiones seguras, for more information. A client certificate (covered later in this section) You will first need to import the MySQL server CA Certificate into a Java truststore. A sample MySQL server CA Certificate is located in the SSL subdirectory of the MySQL source distribution. This is what SSL will use to determine if you are communicating with a secure MySQL server. To use Java's keytool to create a truststore in the current directory , and import the server's CA certificate (cacert.pem), you can do the following (assuming that keytool is in your path. The keytool should be located in the bin subdirectory of your JDK or JRE):
shell> keytool -import -alias mysqlServerCACert \ -file cacert.pem -keystore truststore
You will then need to generate a client certificate, so that the MySQL server knows that it is talking to a secure client:
shell> keytool -genkey -keyalg rsa \ -alias mysqlClientCertificate -keystore keystore
Keytool will prompt you for the following information, and create a keystore named keystore in the current directory. You should respond with information that is appropriate for your situation:
Enter keystore password: ********* What is your first and last name? [Unknown]: Matthews What is the name of your organizational unit? [Unknown]: Software Development What is the name of your organization? [Unknown]: MySQL AB What is the name of your City or Locality? [Unknown]: Flossmoor What is the name of your State or Province? [Unknown]: IL What is the two-letter country code for this unit? [Unknown]: US Is <CN=Matthews, OU=Software Development, O=MySQL AB, L=Flossmoor, ST=IL, C=US> correct? [no]: y
1369
Finally, to get JSSE to use the keystore and truststore that you have generated, you need to set the following system properties when you start your JVM, replacing path_to_keystore_file with the full path to the keystore file you created, path_to_truststore_file with the path to the truststore file you created, and using the appropriate password values for each property.
-Djavax.net.ssl.keyStore=path_to_keystore_file -Djavax.net.ssl.keyStorePassword=********* -Djavax.net.ssl.trustStore=path_to_truststore_file -Djavax.net.ssl.trustStorePassword=*********
You will also need to set useSSL to true in your connection parameters for MySQL Connector/ J, either by adding useSSL=true to your URL, or by setting the property useSSL to true in the java.util.Properties instance you pass to DriverManager.getConnection(). You can test that SSL is working by turning on JSSE debugging (as detailed below), and look for the following key events:
... *** ClientHello, v3.1 RandomCookie: GMT: 1018531834 bytes = { 199, 148, 180, 215, 74, 12, 54, 244, 0, 168, 55, 103, 215, 64, 16, 138, 225, 190, 132, 153, 2, 217, 219, 239, 202, 19, 121, 78 } Session ID: {} Cipher Suites: { 0, 5, 0, 4, 0, 9, 0, 10, 0, 18, 0, 19, 0, 3, 0, 17 } Compression Methods: { 0 } *** [write] MD5 and SHA1 hashes: len = 59 0000: 01 00 00 37 03 01 3D B6 90 FA C7 94 B4 D7 4A 0C ...7..=.......J. 0010: 36 F4 00 A8 37 67 D7 40 10 8A E1 BE 84 99 02 D9 6...7g.@........ 0020: DB EF CA 13 79 4E 00 00 10 00 05 00 04 00 09 00 ....yN.......... 0030: 0A 00 12 00 13 00 03 00 11 01 00 ........... main, WRITE: SSL v3.1 Handshake, length = 59 main, READ: SSL v3.1 Handshake, length = 74 *** ServerHello, v3.1 RandomCookie: GMT: 1018577560 bytes = { 116, 50, 4, 103, 25, 100, 58, 202, 79, 185, 178, 100, 215, 66, 254, 21, 83, 187, 190, 42, 170, 3, 132, 110, 82, 148, 160, 92 } Session ID: {163, 227, 84, 53, 81, 127, 252, 254, 178, 179, 68, 63, 182, 158, 30, 11, 150, 79, 170, 76, 255, 92, 15, 226, 24, 17, 177, 219, 158, 177, 187, 143} Cipher Suite: { 0, 5 } Compression Method: 0 *** %% Created: [Session-1, SSL_RSA_WITH_RC4_128_SHA] ** SSL_RSA_WITH_RC4_128_SHA [read] MD5 and SHA1 hashes: len = 74 0000: 02 00 00 46 03 01 3D B6 43 98 74 32 04 67 19 64 ...F..=.C.t2.g.d 0010: 3A CA 4F B9 B2 64 D7 42 FE 15 53 BB BE 2A AA 03 :.O..d.B..S..*.. 0020: 84 6E 52 94 A0 5C 20 A3 E3 54 35 51 7F FC FE B2 .nR..\ ..T5Q.... 0030: B3 44 3F B6 9E 1E 0B 96 4F AA 4C FF 5C 0F E2 18 .D?.....O.L.\... 0040: 11 B1 DB 9E B1 BB 8F 00 05 00 .......... main, READ: SSL v3.1 Handshake, length = 1712 ...
JSSE provides debugging (to STDOUT) when you set the following system property: Djavax.net.debug=all This will tell you what keystores and truststores are being used, as well as what is going on during the SSL handshake and certificate exchange. It will be helpful when trying to determine what is not working when trying to get an SSL connection to happen.
1370
An application signals that it wants a transaction to be read-only by calling Connection.setReadOnly(true), this replication-aware connection will use one of the slave connections, which are load-balanced per-vm using a round-robin scheme (a given connection is sticky to a slave unless that slave is removed from service). If you have a write transaction, or if you have a read that is time-sensitive (remember, replication in MySQL is asynchronous), set the connection to be not read-only, by calling Connection.setReadOnly(false) and the driver will ensure that further calls are sent to the master MySQL server. The driver takes care of propagating the current state of autocommit, isolation level, and catalog between all of the connections that it uses to accomplish this load balancing functionality. To enable this functionality, use the " com.mysql.jdbc.ReplicationDriver " class when configuring your application server's connection pool or when creating an instance of a JDBC driver for your standalone application. Because it accepts the same URL format as the standard MySQL JDBC driver, ReplicationDriver does not currently work with java.sql.DriverManager -based connection creation unless it is the only MySQL JDBC driver registered with the DriverManager . Here is a short, simple example of how ReplicationDriver might be used in a standalone application.
import java.sql.Connection; import java.sql.ResultSet; import java.util.Properties; import com.mysql.jdbc.ReplicationDriver; public class ReplicationDriverDemo { public static void main(String[] args) throws Exception { ReplicationDriver driver = new ReplicationDriver(); Properties props = new Properties(); // We want this for failover on the slaves props.put("autoReconnect", "true"); // We want to load balance between the slaves props.put("roundRobinLoadBalance", "true"); props.put("user", "foo"); props.put("password", "bar"); // // // // // //
Looks like a normal MySQL JDBC url, with a comma-separated list of hosts, the first being the 'master', the rest being any number of slaves that the driver will load balance against
Connection conn = driver.connect("jdbc:mysql://master,slave1,slave2,slave3/test", props); // // Perform read/write work on the master // by setting the read-only flag to "false" // conn.setReadOnly(false); conn.setAutoCommit(false); conn.createStatement().executeUpdate("UPDATE some_table ...."); conn.commit(); // // Now, do a query from a slave, the driver automatically picks one // from the list // conn.setReadOnly(true); ResultSet rs =
1371
After the driver has been registered with the DriverManager, you can obtain a Connection instance that is connected to a particular database by calling DriverManager.getConnection(): Ejemplo 25.1. Obtaining a connection from the DriverManager This example shows how you can obtain a Connection instance from the DriverManager. There are a few different signatures for the getConnection() method. You should see the API documentation that comes with your JDK for more specific information on how to use them.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; ... try { Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" + "user=monty&password=greatsqldb");
1372
// Do something with the Connection ... } catch (SQLException ex) { // handle any errors System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); }
Once a Connection is established, it can be used to create Statement and PreparedStatement objects, as well as retrieve metadata about the database. This is explained in the following sections.
1373
} if (stmt != null) { try { stmt.close(); } catch (SQLException sqlEx) { // ignore } stmt = null; } }
To use the demoSp procedure with Connector/J, follow these steps: 1. Prepare the callable statement by using Connection.prepareCall() . Notice that you have to use JDBC escape syntax, and that the parentheses surrounding the parameter placeholders are not optional: Ejemplo 25.4. Using Connection.prepareCall()
import java.sql.CallableStatement; ... // // Prepare a call to the stored procedure 'demoSp' // with two parameters // // Notice the use of JDBC-escape syntax ({call ...}) // CallableStatement cStmt = conn.prepareCall("{call demoSp(?, ?)}");
1374
cStmt.setString(1, "abcdefg");
Note. Connection.prepareCall() is an expensive method, due to the metadata retrieval that the driver performs to support output parameters. For performance reasons, you should try to minimize unnecessary calls to Connection.prepareCall() by reusing CallableStatement instances in your code. 2. Register the output parameters (if any exist) To retrieve the values of output parameters (parameters specified as OUT or INOUT when you created the stored procedure), JDBC requires that they be specified before statement execution using the various registerOutputParameter() methods in the CallableStatement interface: Ejemplo 25.5. Registering output parameters
import java.sql.Types; ... // // Connector/J supports both named and indexed // output parameters. You can register output // parameters using either method, as well // as retrieve output parameters using either // method, regardless of what method was // used to register them. // // The following examples show how to use // the various methods of registering // output parameters (you should of course // use only one registration per parameter). // // // Registers the second parameter as output, and // uses the type 'INTEGER' for values returned from // getObject() // cStmt.registerOutParameter(2, Types.INTEGER); // // Registers the named parameter 'inOutParam', and // uses the type 'INTEGER' for values returned from // getObject() // cStmt.registerOutParameter("inOutParam", Types.INTEGER); ...
3. Set the input parameters (if any exist) Input and in/out parameters are set as for PreparedStatement objects. However, CallableStatement also supports setting parameters by name: Ejemplo 25.6. Setting CallableStatement input parameters
... // // Set a parameter by index // cStmt.setString(1, "abcdefg"); // // Alternatively, set a parameter using // the parameter name //
1375
cStmt.setString("inputParameter", "abcdefg"); // // Set the 'in/out' parameter using an index // cStmt.setInt(2, 1); // // Alternatively, set the 'in/out' parameter // by name // cStmt.setInt("inOutParam", 1); ...
4. Execute the CallableStatement, and retrieve any result sets or output parameters. Although CallableStatement supports calling any of the Statement execute methods (executeUpdate(), executeQuery() or execute()), the most flexible method to call is execute(), as you do not need to know ahead of time if the stored procedure returns result sets: Ejemplo 25.7. Retrieving results and output parameter values
... boolean hadResults = cStmt.execute(); // // Process all returned result sets // while (hadResults) { ResultSet rs = cStmt.getResultSet(); // process result set ... hadResults = rs.getMoreResults(); } // // Retrieve output parameters // // Connector/J supports both index-based and // name-based retrieval // int outputValue = cStmt.getInt(2); // index-based outputValue = cStmt.getInt("inOutParam"); // name-based ...
LAST_INSERT_ID() query. The final example shows how updatable result sets can retrieve the AUTO_INCREMENT value when using the insertRow() method. Ejemplo 25.8. Retrieving AUTO_INCREMENT column values using Statement.getGeneratedKeys()
Statement stmt = null; ResultSet rs = null; try { // // // // //
Create a Statement instance that we can use for 'normal' result sets assuming you have a Connection 'conn' to a MySQL database already available
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_UPDATABLE); // // Issue the DDL queries for the table for this example // stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial"); stmt.executeUpdate( "CREATE TABLE autoIncTutorial (" + "priKey INT NOT NULL AUTO_INCREMENT, " + "dataField VARCHAR(64), PRIMARY KEY (priKey))"); // // Insert one row that will generate an AUTO INCREMENT // key in the 'priKey' field // stmt.executeUpdate( "INSERT INTO autoIncTutorial (dataField) " + "values ('Can I Get the Auto Increment Field?')", Statement.RETURN_GENERATED_KEYS); // // Example of using Statement.getGeneratedKeys() // to retrieve the value of an auto-increment // value // int autoIncKeyFromApi = -1; rs = stmt.getGeneratedKeys(); if (rs.next()) { autoIncKeyFromApi = rs.getInt(1); } else { // throw an exception from here } rs.close(); rs = null; System.out.println("Key returned from getGeneratedKeys():" + autoIncKeyFromApi); } finally { if (rs != null) { try { rs.close(); } catch (SQLException ex) { // ignore } }
1377
1378
Create a Statement instance that we can use for 'normal' result sets as well as an 'updatable' one, assuming you have a Connection 'conn' to a MySQL database already available
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_UPDATABLE); // // Issue the DDL queries for the table for this example // stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial"); stmt.executeUpdate( "CREATE TABLE autoIncTutorial (" + "priKey INT NOT NULL AUTO_INCREMENT, " + "dataField VARCHAR(64), PRIMARY KEY (priKey))"); // // Example of retrieving an AUTO INCREMENT key // from an updatable result set // rs = stmt.executeQuery("SELECT priKey, dataField " + "FROM autoIncTutorial"); rs.moveToInsertRow(); rs.updateString("dataField", "AUTO INCREMENT here?"); rs.insertRow(); // // the driver adds rows at the end // rs.last(); // // We should now be on the row we just inserted // int autoIncKeyFromRS = rs.getInt("priKey"); rs.close(); rs = null; System.out.println("Key returned for inserted row: " + autoIncKeyFromRS); } finally { if (rs != null) {
1379
try { rs.close(); } catch (SQLException ex) { // ignore } } if (stmt != null) { try { stmt.close(); } catch (SQLException ex) { // ignore } } }
When you run the preceding example code, you should get the following output: Key returned from getGeneratedKeys(): 1 Key returned from SELECT LAST_INSERT_ID(): 1 Key returned for inserted row: 2 You should be aware, that at times, it can be tricky to use the SELECT LAST_INSERT_ID() query, as that function's value is scoped to a connection. So, if some other query happens on the same connection, the value will be overwritten. On the other hand, the getGeneratedKeys() method is scoped by the Statement instance, so it can be used even if other queries happen on the same connection, but not on the same Statement instance.
1380
When using connection pooling, each individual thread can act as though it has created its own JDBC connection, allowing you to use straight-forward JDBC programming techniques. Controlled resource usage If you don't use connection pooling, and instead create a new connection every time a thread needs one, your application's resource usage can be quite wasteful and lead to unpredictable behavior under load. Remember that each connection to MySQL has overhead (memory, CPU, context switches, and so forth) on both the client and server side. Every connection limits how many resources there are available to your application as well as the MySQL server. Many of these resources will be used whether or not the connection is actually doing any useful work! Connection pools can be tuned to maximize performance, while keeping resource utilization below the point where your application will start to fail rather than just run slower. Luckily, Sun has standardized the concept of connection pooling in JDBC through the JDBC-2.0 Optional interfaces, and all major application servers have implementations of these APIs that work fine with MySQL Connector/J. Generally, you configure a connection pool in your application server configuration files, and access it via the Java Naming and Directory Interface (JNDI). The following code shows how you might use a connection pool from an application deployed in a J2EE application server: Ejemplo 25.11. Using a connection pool with a J2EE application server
import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import javax.naming.InitialContext; import javax.sql.DataSource;
public class MyServletJspOrEjb { public void doSomething() throws Exception { /* * Create a JNDI Initial context to be able to * lookup the DataSource * * In production-level code, this should be cached as * an instance or static variable, as it can * be quite expensive to create a JNDI context. * * Note: This code only works when you are using servlets * or EJBs in a J2EE application server. If you are * using connection pooling in standalone Java code, you * will have to create/configure datasources using whatever * mechanisms your particular connection pooling library * provides. */ InitialContext ctx = new InitialContext(); /* * Lookup the DataSource, which will be backed by a pool * that the application server provides. DataSource instances * are also a good candidate for caching as an instance * variable, as JNDI lookups can be expensive as well. */ DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/MySQLDB"); /* * The following code is what would actually be in your
1381
* Servlet, JSP or EJB 'service' method...where you need * to work with a JDBC connection. */ Connection conn = null; Statement stmt = null; try { conn = ds.getConnection(); /* * Now, use normal JDBC programming to work with * MySQL, making sure to close each resource when you're * finished with it, which allows the connection pool * resources to be recovered as quickly as possible */ stmt = conn.createStatement(); stmt.execute("SOME SQL QUERY"); stmt.close(); stmt = null; conn.close(); conn = null; } finally { /* * close any jdbc instances here that weren't * explicitly closed during normal code path, so * that we don't 'leak' resources... */ if (stmt != null) { try { stmt.close(); } catch (sqlexception sqlex) { // ignore -- as we can't do anything about it here } stmt = null; } if (conn != null) { try { conn.close(); } catch (sqlexception sqlex) { // ignore -- as we can't do anything about it here } conn = null; } } } }
As shown in the example above, after obtaining the JNDI InitialContext, and looking up the DataSource, the rest of the code should look familiar to anyone who has done JDBC programming in the past. The most important thing to remember when using connection pooling is to make sure that no matter what happens in your code (exceptions, flow-of-control, and so forth), connections, and anything created by them (such as statements or result sets) are closed, so that they may be re-used, otherwise they will be stranded, which in the best case means that the MySQL server resources they represent (such as buffers, locks, or sockets) may be tied up for some time, or worst case, may be tied up forever. What's the Best Size for my Connection Pool? As with all other configuration rules-of-thumb, the answer is: it depends. Although the optimal size depends on anticipated load and average database transaction time, the optimum connection pool size
1382
is smaller than you might expect. If you take Sun's Java Petstore blueprint application for example, a connection pool of 15-20 connections can serve a relatively moderate load (600 concurrent users) using MySQL and Tomcat with response times that are acceptable. To correctly size a connection pool for your application, you should create load test scripts with tools such as Apache JMeter or The Grinder, and load test your application. An easy way to determine a starting point is to configure your connection pool's maximum number of connections to be unbounded, run a load test, and measure the largest amount of concurrently used connections. You can then work backward from there to determine what values of minimum and maximum pooled connections give the best performance for your particular application.
1383
<parameter> <name>validationQuery</name> <value>SELECT 1</value> </parameter> <!-- The most conservative approach is to test connections before they're given to your application. For most applications this is okay, the query used above is very small and takes no real server resources to process, other than the time used to traverse the network. If you have a high-load application you'll need to rely on something else. --> <parameter> <name>testOnBorrow</name> <value>true</value> </parameter> <!-- Otherwise, or in addition to testOnBorrow, you can test while connections are sitting idle --> <parameter> <name>testWhileIdle</name> <value>true</value> </parameter> <!-- You have to set this value, otherwise even though you've asked connections to be tested while idle, the idle evicter thread will never run --> <parameter> <name>timeBetweenEvictionRunsMillis</name> <value>10000</value> </parameter> <!-- Don't allow connections to hang out idle too long, never longer than what wait_timeout is set to on the server...A few minutes or even fraction of a minute is sometimes okay here, it depends on your application and how much spikey load it will see --> <parameter> <name>minEvictableIdleTimeMillis</name> <value>60000</value> </parameter> <!-- Username and password used when connecting to MySQL --> <parameter> <name>username</name> <value>someuser</value> </parameter> <parameter> <name>password</name> <value>somepass</value> </parameter> <!-- Class name for the Connector/J driver --> <parameter> <name>driverClassName</name> <value>com.mysql.jdbc.Driver</value> </parameter> <!-- The JDBC connection url for connecting to MySQL, notice that if you want to pass any other MySQL-specific parameters you should pass them here in the URL, setting them using the parameter tags above will have no effect, you will also need to use & to separate parameter values as the ampersand is a reserved character in XML -->
1384
In general, you should follow the installation instructions that come with your version of Tomcat, as the way you configure datasources in Tomcat changes from time-to-time, and unfortunately if you use the wrong syntax in your XML file, you will most likely end up with an exception similar to the following:
Error: java.sql.SQLException: Cannot load JDBC driver class 'null ' SQL state: null
1385
25.4.5.3.1: [1386] When I try to connect to the database with MySQL Connector/J, I get the following exception:
SQLException: Server configuration denies access to data source SQLState: 08001 VendorError: 0
What's going on? I can connect just fine with the MySQL command-line client. 25.4.5.3.2: [1386] My application throws an SQLException 'No Suitable Driver'. Why is this happening? 25.4.5.3.3: [1387] I'm trying to use MySQL Connector/J in an applet or application and I get an exception similar to:
SQLException: Cannot connect to MySQL server on host:3306. Is there a MySQL server running on the machine/port you are trying to connect to? (java.security.AccessControlException) SQLState: 08S01 VendorError: 0
25.4.5.3.4: [1387] I have a servlet/application that works fine for a day, and then stops working overnight 25.4.5.3.5: [1389] I'm trying to use JDBC-2.0 updatable result sets, and I get an exception saying my result set is not updatable. 25.4.5.3.6: [1389] I cannot connect to the MySQL server using Connector/J, and I'm sure the connection paramters are correct. Questions and Answers 25.4.5.3.1: When I try to connect to the database with MySQL Connector/J, I get the following exception:
SQLException: Server configuration denies access to data source SQLState: 08001 VendorError: 0
What's going on? I can connect just fine with the MySQL command-line client. MySQL Connector/J must use TCP/IP sockets to connect to MySQL, as Java does not support Unix Domain Sockets. Therefore, when MySQL Connector/J connects to MySQL, the security manager in MySQL server will use its grant tables to determine whether the connection should be allowed. You must add the necessary security credentials to the MySQL server for this to happen, using the GRANT statement to your MySQL Server. See Seccin 13.5.1.3, Sintaxis de GRANT y REVOKE, for more information. Note. Testing your connectivity with the mysql command-line client will not work unless you add the --host flag, and use something other than localhost for the host. The mysql command-line client will use Unix domain sockets if you use the special hostname localhost. If you are testing connectivity to localhost, use 127.0.0.1 as the hostname instead. Warning. Changing privileges and permissions improperly in MySQL can potentially cause your server installation to not have optimal security properties. 25.4.5.3.2: My application throws an SQLException 'No Suitable Driver'. Why is this happening? There are three possible causes for this error: The Connector/J driver is not in your CLASSPATH, see Seccin 25.4.2, Connector/J Installation. The format of your connection URL is incorrect, or you are referencing the wrong JDBC driver.
1386
When using DriverManager, the jdbc.drivers system property has not been populated with the location of the Connector/J driver. 25.4.5.3.3: I'm trying to use MySQL Connector/J in an applet or application and I get an exception similar to:
SQLException: Cannot connect to MySQL server on host:3306. Is there a MySQL server running on the machine/port you are trying to connect to? (java.security.AccessControlException) SQLState: 08S01 VendorError: 0
Either you're running an Applet, your MySQL server has been installed with the "--skip-networking" option set, or your MySQL server has a firewall sitting in front of it. Applets can only make network connections back to the machine that runs the web server that served the .class files for the applet. This means that MySQL must run on the same machine (or you must have some sort of port re-direction) for this to work. This also means that you will not be able to test applets from your local file system, you must always deploy them to a web server. MySQL Connector/J can only communicate with MySQL using TCP/IP, as Java does not support Unix domain sockets. TCP/IP communication with MySQL might be affected if MySQL was started with the "--skip-networking" flag, or if it is firewalled. If MySQL has been started with the "--skip-networking" option set (the Debian Linux package of MySQL server does this for example), you need to comment it out in the file /etc/mysql/my.cnf or / etc/my.cnf. Of course your my.cnf file might also exist in the data directory of your MySQL server, or anywhere else (depending on how MySQL was compiled for your system). Binaries created by MySQL AB always look in /etc/my.cnf and [datadir]/my.cnf. If your MySQL server has been firewalled, you will need to have the firewall configured to allow TCP/IP connections from the host where your Java code is running to the MySQL server on the port that MySQL is listening to (by default, 3306). 25.4.5.3.4: I have a servlet/application that works fine for a day, and then stops working overnight MySQL closes connections after 8 hours of inactivity. You either need to use a connection pool that handles stale connections or use the "autoReconnect" parameter (see Seccin 25.4.4.1, Driver/ Datasource Class Names, URL Syntax and Configuration Properties for Connector/J). Also, you should be catching SQLExceptions in your application and dealing with them, rather than propagating them all the way until your application exits, this is just good programming practice. MySQL Connector/J will set the SQLState (see java.sql.SQLException.getSQLState() in your APIDOCS) to "08S01" when it encounters network-connectivity issues during the processing of a query. Your application code should then attempt to re-connect to MySQL at this point. The following (simplistic) example shows what code that can handle these exceptions might look like: Ejemplo 25.12. Example of transaction with retry logic
public void doBusinessOp() throws SQLException { Connection conn = null; Statement stmt = null; ResultSet rs = null; // // How many times do you want to retry the transaction // (or at least _getting_ a connection)? // int retryCount = 5; boolean transactionCompleted = false; do { try {
1387
conn = getConnection(); // assume getting this from a // javax.sql.DataSource, or the // java.sql.DriverManager conn.setAutoCommit(false); // // Okay, at this point, the 'retry-ability' of the // transaction really depends on your application logic, // whether or not you're using autocommit (in this case // not), and whether you're using transacational storage // engines // // For this example, we'll assume that it's _not_ safe // to retry the entire transaction, so we set retry // count to 0 at this point // // If you were using exclusively transaction-safe tables, // or your application could recover from a connection going // bad in the middle of an operation, then you would not // touch 'retryCount' here, and just let the loop repeat // until retryCount == 0. // retryCount = 0; stmt = conn.createStatement(); String query = "SELECT foo FROM bar ORDER BY baz"; rs = stmt.executeQuery(query); while (rs.next()) { } rs.close(); rs = null; stmt.close(); stmt = null; conn.commit(); conn.close(); conn = null; transactionCompleted = true; } catch (SQLException sqlEx) { // // // // // // //
The two SQL states that are 'retry-able' are 08S01 for a communications error, and 40001 for deadlock. Only retry if the error was due to a stale connection, communications problem or deadlock
String sqlState = sqlEx.getSQLState(); if ("08S01".equals(sqlState) || "40001".equals(sqlState)) { retryCount--; } else { retryCount = 0; } } finally { if (rs != null) { try { rs.close(); } catch (SQLException sqlEx) { // You'd probably want to log this . . . } } if (stmt != null) {
1388
try { stmt.close(); } catch (SQLException sqlEx) { // You'd probably want to log this as well . . . } } if (conn != null) { try { // // If we got here, and conn is not null, the // transaction should be rolled back, as not // all work has been done try { conn.rollback(); } finally { conn.close(); } } catch (SQLException sqlEx) { // // If we got an exception here, something // pretty serious is going on, so we better // pass it up the stack, rather than just // logging it. . . throw sqlEx; } } } } while (!transactionCompleted && (retryCount > 0)); }
Note. Use of the autoReconnect option is not recommended because there is no safe method of reconnecting to the MySQL server without risking some corruption of the connection state or database state information. Instead, you should use a connection pool which will enable your application to connect to the MySQL server using an available connection from the pool. The autoReconnect facility is deprecated, and may be removed in a future release. 25.4.5.3.5: I'm trying to use JDBC-2.0 updatable result sets, and I get an exception saying my result set is not updatable. Because MySQL does not have row identifiers, MySQL Connector/J can only update result sets that have come from queries on tables that have at least one primary key, the query must select every primary key and the query can only span one table (that is, no joins). This is outlined in the JDBC specification. Note that this issue only occurs when using updatable result sets, and is caused because Connector/ J is unable to guarantee that it can identify the correct rows within the result set to be updated without having a unique reference to each row. There is no requirement to have a unique field on a table if you are using UPDATE or DELETE statements on a table where you can individually specify the criteria to be matched using a WHERE clause. 25.4.5.3.6: I cannot connect to the MySQL server using Connector/J, and I'm sure the connection paramters are correct. Make sure that the skip-networking option has not been enabled on your server. Connector/J must be able to communicate with your server over TCP/IP, named sockets are not supported. Also ensure that you are not filtering connections through a Firewall or other network security system. For more informaiton, see Seccin A.2.2, Can't connect to [local] MySQL server.
1389
Connector/J Support
1390
MySQL Connector/MXJ
In the setUp() method, create code that creates your tables, and populates them with any data needed to demonstrate the bug. In the runTest() method, create code that demonstrates the bug using the tables and data you created in the setUp method. In the tearDown() method, drop any tables you created in the setUp() method. In any of the above three methods, you should use one of the variants of the getConnection() method to create a JDBC connection to MySQL: getConnection() - Provides a connection to the JDBC URL specified in getUrl(). If a connection already exists, that connection is returned, otherwise a new connection is created. getNewConnection() - Use this if you need to get a new connection for your bug report (i.e. there's more than one connection involved). getConnection(String url) - Returns a connection using the given URL. getConnection(String url, Properties props) - Returns a connection using the given URL and properties. If you need to use a JDBC URL that is different from 'jdbc:mysql:///test', override the method getUrl() as well. Use the assertTrue(boolean expression) and assertTrue(String failureMessage, boolean expression) methods to create conditions that must be met in your testcase demonstrating the behavior you are expecting (vs. the behavior you are observing, which is why you are most likely filing a bug report). Finally, create a main() method that creates a new instance of your testcase, and calls the run method:
public static void main(String[] args) throws Exception { new MyBugReport().run(); }
Once you have finished your testcase, and have verified that it demonstrates the bug you are reporting, upload it with your bug report to http://bugs.mysql.com/.
1391
Introduction to Connector/MXJ
Included are instructions for use with a JDBC driver and deploying as a JMX MBean to JBoss. You can download sources and binaries from: http://dev.mysql.com/downloads/connector/mxj/ This a beta release and feedback is welcome and encouraged. Please send questions or comments to the MySQL and Java mailing list.
It is important to note that Connector/MXJ is not an embedded version of MySQL, or a version of MySQL written as part of a Java class. Connector/MXJ works through the use of an embedded, compiled binary of mysqld as would normally be used when deploying a standard MySQL installation. It is the Connector/MXJ wrapper, support classes and tools, that enable Connector/MXJ to appear as a MySQL instance. When Connector/MXJ is initialized, the corresponding mysqld binary for the current platform is extracted, along with a pre-configured data directed. Both are contained within the Connector/MXJ JAR file. The mysqld instance is then started, with any additional options as specified during the initialization, and the MySQL database becomes accessible.
1392
Connector/MXJ Installation
Because Connector/MXJ works in combination with Connector/J, you can access and integrate with the MySQL instance through a JDBC connection. When you have finished with the server, the instance is terminated, and, by default, any data created during the session is retained within the temporary directory created when the instance was started. Connector/MXJ and the embedded mysqld instance can be deployed in a number of environments where relying on an existing database, or installing a MySQL instance would be impossible, including CD-ROM embedded database applications and temporary database requirements within a Java-based application environment.
1393
Connector/MXJ Installation
2. Extract the files from the package. This will create a directory connector-mxj. Copy and optionally rename this directory to your desired location. 3. For best results, you should update your global CLASSPATH variable with the location of the required jar files. Within Unix/Linux you can do this globally by editing the global shell profile, or on a user by user basis by editing their individual shell profile. On Windows 2000, Windows NT and Windows XP, you can edit the global CLASSPATH by editing the Environment Variables configured through the System control panel. For Connector/MXJ 5.0.4 and later you need the following JAR files in your CLASSPATH 1. connector-mxj.jar contains the main Connector/MXJ classes. 2. connector-mxj-db-files.jar contains the embedded mysqld and database files. 3. aspectjrt.jar the AspectJ runtime library, located in lib/aspectjrt.jar in the Connector/MXJ package. 4. connector-j.jar Connector/J, see Seccin 25.4, MySQL Connector/J. For Connector/MXJ 5.0.3 and earlier, you need the following JAR files: 1. connector-mxj.jar 2. aspectjrt.jar the AspectJ runtime library, located in lib/aspectjrt.jar in the Connector/MXJ package. 3. connector-j.jar Connector/J, see Seccin 25.4, MySQL Connector/J.
1394
Connector/MXJ Installation
-----------------------[MysqldResource] stopping mysqld (process: 1210) 060726 15:40:44 [Note] /var/tmp/test-mxj/bin/mysqld: Normal shutdown 060726 15:40:45 InnoDB: Starting shutdown... 060726 15:40:48 InnoDB: Shutdown completed; log sequence number 0 43655 060726 15:40:48 [Note] /var/tmp/test-mxj/bin/mysqld: Shutdown complete [MysqldResource] clearing options [MysqldResource] shutdown complete
The above output shows an instance of MySQL starting, the necessary files being created (log files, InnoDB data files) and the MySQL database entering the running state. The instance is then shutdown by Connector/MXJ before the example terminates.
You may wish to create a separate users and database table spaces for each application, rather than using "root and test". We highly suggest having a routine backup procedure for backing up the database files in the datadir.
1395
Connector/MXJ Installation
1396
Connector/MXJ Configuration
4. if you have junit, execute the unit tests. From the command line, type:
java junit.textui.TestRunner com.mysql.management.AllTestsSuite
Note that the tests are a bit slow near the end, so please be patient.
import com.mysql.management.driverlaunched.ServerLauncherSocketFactory; public class ConnectorMXJUrlTestExample { public static String DRIVER = "com.mysql.jdbc.Driver"; public static String JAVA_IO_TMPDIR = "java.io.tmpdir"; public static void main(String[] args) throws Exception { File ourAppDir = new File(System.getProperty(JAVA_IO_TMPDIR)); File databaseDir = new File(ourAppDir, "test-mxj"); int port = 3336; String url = "jdbc:mysql:mxj://localhost:" + port + "/test" + "?" + "server.basedir=" + databaseDir; System.out.println(url); String userName = "root"; String password = ""; Class.forName(DRIVER); Connection conn = null; try { conn = DriverManager.getConnection(url, userName, password); printQueryResults(conn, "SELECT VERSION()"); } finally { try { if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); }
1397
Connector/MXJ Configuration
ServerLauncherSocketFactory.shutdown(databaseDir, null); } } public static void printQueryResults(Connection conn, String SQLquery) throws Exception { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(SQLquery); int columns = rs.getMetaData().getColumnCount(); System.out.println("------------------------"); System.out.println(); while (rs.next()) { for (int i = 1; i <= columns; i++) { System.out.println(rs.getString(i)); } System.out.println(); } rs.close(); stmt.close(); System.out.println("------------------------"); System.out.flush(); Thread.sleep(100); // wait for System.out to finish flush } }
To run the above program, be sure to have connector-mxj.jar and Connector/J in the CLASSPATH. Then type:
java ConnectorMXJTestExample
import com.mysql.management.MysqldResource; public class ConnectorMXJObjectTestExample { public static String DRIVER = "com.mysql.jdbc.Driver"; public static String JAVA_IO_TMPDIR = "java.io.tmpdir"; public static void main(String[] args) throws Exception { File ourAppDir = new File(System.getProperty(JAVA_IO_TMPDIR)); File databaseDir = new File(ourAppDir, "mysql-mxj"); int port = 3336;
1398
Connector/MXJ Configuration
MysqldResource mysqldResource = startDatabase(databaseDir, port); String userName = "root"; String password = ""; Class.forName(DRIVER); Connection conn = null; try { String url = "jdbc:mysql://localhost:" + port + "/test"; conn = DriverManager.getConnection(url, userName, password); printQueryResults(conn, "SELECT VERSION()"); } finally { try { if (conn != null) { conn.close(); } } catch (Exception e) { e.printStackTrace(); } try { mysqldResource.shutdown(); } catch (Exception e) { e.printStackTrace(); } } } public static MysqldResource startDatabase(File databaseDir, int port) { MysqldResource mysqldResource = new MysqldResource(databaseDir); Map database_options = new HashMap(); database_options.put("port", Integer.toString(port)); mysqldResource.start("test-mysqld-thread", database_options); if (!mysqldResource.isRunning()) { throw new RuntimeException("MySQL did not start."); } System.out.println("MySQL is running."); return mysqldResource; } public static void printQueryResults(Connection conn, String SQLquery) throws Exception { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(SQLquery); int columns = rs.getMetaData().getColumnCount(); System.out.println("------------------------"); System.out.println(); while (rs.next()) { for (int i = 1; i <= columns; i++) { System.out.println(rs.getString(i)); } System.out.println(); } rs.close(); stmt.close(); System.out.println("------------------------"); System.out.flush(); Thread.sleep(100); // wait for System.out to finish flush } }
1399
Connector/MXJ Reference
String url = "jdbc:mysql://" + hostColonPort + "/" + "?" + "cacheServerConfiguration=true" + "&" + "useLocalSessionState=true" + "&" + "server.basedir=/opt/myapp/db" + "&" + "server.datadir=/mnt/bigdisk/myapp/data";
1400
Shuts down the MySQL instance managed by the MysqldResource object. Map getServerOptions(); Returns a map of all the options and their current (or default, if not running) options available for the MySQL database. boolean isRunning(); Returns true if the MySQL database is running. boolean isReadyForConnections(); Returns true once the database reports that is ready for connections. void setKillDelay(int millis); The default Kill Delay is 30 seconds. This represents the amount of time to wait between the initial request to shutdown and issuing a force kill if the database has not shutdown by itself. void addCompletionListenser(Runnable listener); Allows for applications to be notified when the server process completes. Each ''listener'' will be fired off in its own thread. String getVersion(); Returns the version of MySQL. void setVersion(int MajorVersion, int minorVersion, int patchLevel); The standard distribution comes with only one version of MySQL packaged. However, it is possible to package multiple versions, and specify which version to use.
If you are using Connector/MXJ v5.0.4 or later, you should unpack the connector-mxj-dbfiles.jar:
shell> mkdir custom-mxj shell> cd custom-mxj
1401
The MySQL version directory, 5-0-22 or 5-0-27 in the above examples, contains all of the files used to create an instance of MySQL when Connector/MXJ is executed. All of the files in this directory are required for each version of MySQL that you want to embed. Note as well the format of the version number, which uses hyphens instead of periods to separate the version number components. Within the version specific directory are the platform specific directories, and archives of the data and share directory required by MySQL for the various platforms. For example, here is the listing for the default Connector/MXJ package:
shell>> ls Linux-i386/ META-INF/ Mac_OS_X-ppc/ SunOS-sparc/ Win-x86/ com/ data_dir.jar share_dir.jar win_share_dir.jar
Platform specific directories are listed by their OS and platform - for example the mysqld for Mac OS X PowerPC is located within the Mac_OS_X-ppc directory. You can delete directories from this location that you do not require, and add new directories for additional platforms that you want to support. To add a platform specific mysqld, create a new directory with the corresponding name for your operating system/platform. For example, you could add a directory for Mac OS X/Intel using the directory Mac_OS_X-i386. On Unix systems, you can determine the platform using uname:
shell> uname -p i386
Now you need to download or compile mysqld for the MySQL version and platform you want to include in your custom connector-mxj.jar package into the new directory. Create a file called version.txt in the OS/platform directory you have just created that contains the version string/path of the mysqld binary. For example:
mysql-5.0.22-osx10.3-i386/bin/mysqld
You can now recreate the connector-mxj.jar file with the added mysqld:
shell> cd custom-mxj shell> jar -cf ../connector-mxj.jar *
For Connector/MXJ v5.0.4 and later, you should repackage to the connector-mxj-db-files.jar:
shell> cd custom-mxj shell> jar -cf ../connector-mxj-db-files.jar *
You should test this package using the steps outlined in Seccin 25.5.2.3, Connector/MXJ Quick Start Guide. Nota Because the connector-mxj-db-files.jar file is separate from the main Connector/MXJ classes you can distribute different connector-mxj-dbfiles.jar files to different hotsts or for different projects without having to create a completely new main connector-mxj.jar file for each one.
1402
5. For Connector/MXJ 5.0.3 or earlier, copy the data_dir.jar file into the extracted connectormxj.jar directory, and then create an archive for connector-mxj.jar. For Connector/MXJ 5.0.4 or later, copy the data_dir.jar file into the extracted connectormxj-db-files.jar directory, and then create an archive for connector-mxj-db-files.jar. Note that if you are create databases using the InnoDB engine, you must include the ibdata.* and ib_logfile* files within the data_dir.jar archive.
1403
4. from a browser:
http://localhost:9092/
5. under MysqldAgent,
select "name=mysqld"
6. Observe the MBean View 7. scroll to the bottom of the screen press the startMysqld button 8. click Back to MBean View 9. scroll to the bottom of the screen press stopMysqld button 10. kill the java process running the Test Agent (jmx server)
3. Deploy (copy) the connector-mxj.jar to $JBOSS_HOME/server/default/lib. 4. Deploy (copy) mysql-connector-java-3.1.4-beta-bin.jar to $JBOSS_HOME/server/ default/lib. 5. Create a mxjtest.war directory in $JBOSS_HOME/server/default/deploy. 6. Deploy (copy) index.jsp to $JBOSS_HOME/server/default/deploy/mxjtest.war. 7. Create a mysqld-service.xml file in $JBOSS_HOME/server/default/deploy.
<?xml version="1.0" encoding="UTF-8"?>
1404
Connector/MXJ Support
<server> <mbean code="com.mysql.management.jmx.jboss.JBossMysqldDynamicMBean" name="mysql:type=service,name=mysqld"> <attribute name="datadir">/tmp/xxx_data_xxx</attribute> <attribute name="autostart">true</attribute> </mbean> </server>
8. Start jboss: on unix: $JBOSS_HOME/bin/run.sh on windows: %JBOSS_HOME%\bin\run.bat Be ready: JBoss sends a lot of output to the screen. 9. When JBoss seems to have stopped sending output to the screen, open a web browser to: http://localhost:8080/jmx-console 10. Scroll down to the bottom of the page in the mysql section, select the bulleted mysqld link. 11. Observe the JMX MBean View page. MySQL should already be running. 12. (If "autostart=true" was set, you may skip this step.) Scroll to the bottom of the screen. You may press the Invoke button to stop (or start) MySQL observe Operation completed successfully without a return value. Click Back to MBean View 13. To confirm MySQL is running, open a web browser to http://localhost:8080/mxjtest/ and you should see that
SELECT 1
14. Guided by the $JBOSS_HOME/server/default/deploy/mxjtest.war/index.jsp you will be able to use MySQL in your Web Application. There is a test database and a root user (no password) ready to experiment with. Try creating a table, inserting some rows, and doing some selects. 15. Shut down MySQL. MySQL will be stopped automatically when JBoss is stopped, or: from the browser, scroll down to the bottom of the MBean View press the stop service Invoke button to halt the service. Observe Operation completed successfully without a return value. Using ps or task manager see that MySQL is no longer running As of 1.0.6-beta version is the ability to have the MBean start the MySQL database upon start up. Also, we've taken advantage of the JBoss life-cycle extension methods so that the database will gracefully shut down when JBoss is shutdown.
1405
Connector/PHP
For information about subscribing to MySQL mailing lists or to browse list archives, visit http:// lists.mysql.com/. See Seccin 1.6.1.1, Las listas de correo de MySQL. Community support from experienced users is also available through the MyODBC Forum. You may also find help from other users in the other MySQL Forums, located at http://forums.mysql.com. See Seccin 1.6.3, Soporte por parte de la comunidad en los foros de MySQL.
25.6. Connector/PHP
La distribucin y documentacin de PHP estn disponibles en el sitio Web de PHP. MySQL proporciona las extensiones mysql y mysqli para el sistema Windows en http://dev.mysql.com/ downloads/connector/php/ para MySQL versin 4.1.16 y superiores, MySQL 5.0.18, y MySQL 5.1. Puede encontrar informacin sobre por qu es preferible usar las extensiones proporcionadas por MySQL en este msmo sitio. Para el resto de las plataformas, deber usar las extensiones mysql o mysqli incluidas con los fuentes de PHP. Ver Seccin 24.3, API PHP de MySQL.
1406
1407
Mensaje: Error eliminando la base de datos (No puedo borrar directorio '%s', error %d) Error: 1011 SQLSTATE: HY000 (ER_CANT_DELETE_FILE) Mensaje: Error en el borrado de '%s' (Error: %d) Error: 1012 SQLSTATE: HY000 (ER_CANT_FIND_SYSTEM_REC) Mensaje: No puedo leer el registro en la tabla del sistema Error: 1013 SQLSTATE: HY000 (ER_CANT_GET_STAT) Mensaje: No puedo obtener el estado de '%s' (Error: %d) Error: 1014 SQLSTATE: HY000 (ER_CANT_GET_WD) Mensaje: No puedo acceder al directorio (Error: %d) Error: 1015 SQLSTATE: HY000 (ER_CANT_LOCK) Mensaje: No puedo bloquear archivo: (Error: %d) Error: 1016 SQLSTATE: HY000 (ER_CANT_OPEN_FILE) Mensaje: No puedo abrir archivo: '%s' (Error: %d) Error: 1017 SQLSTATE: HY000 (ER_FILE_NOT_FOUND) Mensaje: No puedo encontrar archivo: '%s' (Error: %d) Error: 1018 SQLSTATE: HY000 (ER_CANT_READ_DIR) Mensaje: No puedo leer el directorio de '%s' (Error: %d) Error: 1019 SQLSTATE: HY000 (ER_CANT_SET_WD) Mensaje: No puedo cambiar al directorio de '%s' (Error: %d) Error: 1020 SQLSTATE: HY000 (ER_CHECKREAD) Mensaje: El registro ha cambiado desde la ultima lectura de la tabla '%s' Error: 1021 SQLSTATE: HY000 (ER_DISK_FULL) Mensaje: Disco lleno (%s). Esperando para que se libere algo de espacio... Error: 1022 SQLSTATE: 23000 (ER_DUP_KEY) Mensaje: No puedo escribir, clave duplicada en la tabla '%s' Error: 1023 SQLSTATE: HY000 (ER_ERROR_ON_CLOSE) Mensaje: Error en el cierre de '%s' (Error: %d) Error: 1024 SQLSTATE: HY000 (ER_ERROR_ON_READ) Mensaje: Error leyendo el fichero '%s' (Error: %d) Error: 1025 SQLSTATE: HY000 (ER_ERROR_ON_RENAME) Mensaje: Error en el renombrado de '%s' a '%s' (Error: %d) Error: 1026 SQLSTATE: HY000 (ER_ERROR_ON_WRITE)
1408
Mensaje: Error escribiendo el archivo '%s' (Error: %d) Error: 1027 SQLSTATE: HY000 (ER_FILE_USED) Mensaje: '%s' esta bloqueado contra cambios Error: 1028 SQLSTATE: HY000 (ER_FILSORT_ABORT) Mensaje: Ordeancion cancelada Error: 1029 SQLSTATE: HY000 (ER_FORM_NOT_FOUND) Mensaje: La vista '%s' no existe para '%s' Error: 1030 SQLSTATE: HY000 (ER_GET_ERRNO) Mensaje: Error %d desde el manejador de la tabla Error: 1031 SQLSTATE: HY000 (ER_ILLEGAL_HA) Mensaje: El manejador de la tabla de '%s' no tiene esta opcion Error: 1032 SQLSTATE: HY000 (ER_KEY_NOT_FOUND) Mensaje: No puedo encontrar el registro en '%s' Error: 1033 SQLSTATE: HY000 (ER_NOT_FORM_FILE) Mensaje: Informacion erronea en el archivo: '%s' Error: 1034 SQLSTATE: HY000 (ER_NOT_KEYFILE) Mensaje: Clave de archivo erronea para la tabla: '%s'; intente repararlo Error: 1035 SQLSTATE: HY000 (ER_OLD_KEYFILE) Mensaje: Clave de archivo antigua para la tabla '%s'; reparelo! Error: 1036 SQLSTATE: HY000 (ER_OPEN_AS_READONLY) Mensaje: '%s' es de solo lectura Error: 1037 SQLSTATE: HY001 (ER_OUTOFMEMORY) Mensaje: Memoria insuficiente. Reinicie el demonio e intentelo otra vez (necesita %d bytes) Error: 1038 SQLSTATE: HY001 (ER_OUT_OF_SORTMEMORY) Mensaje: Memoria de ordenacion insuficiente. Incremente el tamano del buffer de ordenacion Error: 1039 SQLSTATE: HY000 (ER_UNEXPECTED_EOF) Mensaje: Inesperado fin de ficheroU mientras leiamos el archivo '%s' (Error: %d) Error: 1040 SQLSTATE: 08004 (ER_CON_COUNT_ERROR) Mensaje: Demasiadas conexiones Error: 1041 SQLSTATE: HY000 (ER_OUT_OF_RESOURCES) Mensaje: Memoria/espacio de tranpaso insuficiente Error: 1042 SQLSTATE: 08S01 (ER_BAD_HOST_ERROR)
1409
Mensaje: No puedo obtener el nombre de maquina de tu direccion Error: 1043 SQLSTATE: 08S01 (ER_HANDSHAKE_ERROR) Mensaje: Protocolo erroneo Error: 1044 SQLSTATE: 42000 (ER_DBACCESS_DENIED_ERROR) Mensaje: Acceso negado para usuario: '%s'@'%s' para la base de datos '%s' Error: 1045 SQLSTATE: 28000 (ER_ACCESS_DENIED_ERROR) Mensaje: Acceso negado para usuario: '%s'@'%s' (Usando clave: %s) Error: 1046 SQLSTATE: 3D000 (ER_NO_DB_ERROR) Mensaje: Base de datos no seleccionada Error: 1047 SQLSTATE: 08S01 (ER_UNKNOWN_COM_ERROR) Mensaje: Comando desconocido Error: 1048 SQLSTATE: 23000 (ER_BAD_NULL_ERROR) Mensaje: La columna '%s' no puede ser nula Error: 1049 SQLSTATE: 42000 (ER_BAD_DB_ERROR) Mensaje: Base de datos desconocida '%s' Error: 1050 SQLSTATE: 42S01 (ER_TABLE_EXISTS_ERROR) Mensaje: La tabla '%s' ya existe Error: 1051 SQLSTATE: 42S02 (ER_BAD_TABLE_ERROR) Mensaje: Tabla '%s' desconocida Error: 1052 SQLSTATE: 23000 (ER_NON_UNIQ_ERROR) Mensaje: La columna: '%s' en %s es ambigua Error: 1053 SQLSTATE: 08S01 (ER_SERVER_SHUTDOWN) Mensaje: Desconexion de servidor en proceso Error: 1054 SQLSTATE: 42S22 (ER_BAD_FIELD_ERROR) Mensaje: La columna '%s' en %s es desconocida Error: 1055 SQLSTATE: 42000 (ER_WRONG_FIELD_WITH_GROUP) Mensaje: Usado '%s' el cual no esta group by Error: 1056 SQLSTATE: 42000 (ER_WRONG_GROUP_FIELD) Mensaje: No puedo agrupar por '%s' Error: 1057 SQLSTATE: 42000 (ER_WRONG_SUM_SELECT) Mensaje: El estamento tiene funciones de suma y columnas en el mismo estamento Error: 1058 SQLSTATE: 21S01 (ER_WRONG_VALUE_COUNT) Mensaje: La columna con count no tiene valores para contar
1410
Error: 1059 SQLSTATE: 42000 (ER_TOO_LONG_IDENT) Mensaje: El nombre del identificador '%s' es demasiado grande Error: 1060 SQLSTATE: 42S21 (ER_DUP_FIELDNAME) Mensaje: Nombre de columna duplicado '%s' Error: 1061 SQLSTATE: 42000 (ER_DUP_KEYNAME) Mensaje: Nombre de clave duplicado '%s' Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY) Mensaje: Entrada duplicada '%s' para la clave %d Error: 1063 SQLSTATE: 42000 (ER_WRONG_FIELD_SPEC) Mensaje: Especificador de columna erroneo para la columna '%s' Error: 1064 SQLSTATE: 42000 (ER_PARSE_ERROR) Mensaje: %s cerca '%s' en la linea %d Error: 1065 SQLSTATE: 42000 (ER_EMPTY_QUERY) Mensaje: La query estaba vacia Error: 1066 SQLSTATE: 42000 (ER_NONUNIQ_TABLE) Mensaje: Tabla/alias: '%s' es no unica Error: 1067 SQLSTATE: 42000 (ER_INVALID_DEFAULT) Mensaje: Valor por defecto invalido para '%s' Error: 1068 SQLSTATE: 42000 (ER_MULTIPLE_PRI_KEY) Mensaje: Multiples claves primarias definidas Error: 1069 SQLSTATE: 42000 (ER_TOO_MANY_KEYS) Mensaje: Demasiadas claves primarias declaradas. Un maximo de %d claves son permitidas Error: 1070 SQLSTATE: 42000 (ER_TOO_MANY_KEY_PARTS) Mensaje: Demasiadas partes de clave declaradas. Un maximo de %d partes son permitidas Error: 1071 SQLSTATE: 42000 (ER_TOO_LONG_KEY) Mensaje: Declaracion de clave demasiado larga. La maxima longitud de clave es %d Error: 1072 SQLSTATE: 42000 (ER_KEY_COLUMN_DOES_NOT_EXITS) Mensaje: La columna clave '%s' no existe en la tabla Error: 1073 SQLSTATE: 42000 (ER_BLOB_USED_AS_KEY) Mensaje: La columna Blob '%s' no puede ser usada en una declaracion de clave Error: 1074 SQLSTATE: 42000 (ER_TOO_BIG_FIELDLENGTH) Mensaje: Longitud de columna demasiado grande para la columna '%s' (maximo = %lu).Usar BLOB en su lugar
1411
Error: 1075 SQLSTATE: 42000 (ER_WRONG_AUTO_KEY) Mensaje: Puede ser solamente un campo automatico y este debe ser definido como una clave Error: 1076 SQLSTATE: HY000 (ER_READY) Mensaje: %s: preparado para conexiones Version: '%s' socket: '%s' port: %d Error: 1077 SQLSTATE: HY000 (ER_NORMAL_SHUTDOWN) Mensaje: %s: Apagado normal Error: 1078 SQLSTATE: HY000 (ER_GOT_SIGNAL) Mensaje: %s: Recibiendo signal %d. Abortando! Error: 1079 SQLSTATE: HY000 (ER_SHUTDOWN_COMPLETE) Mensaje: %s: Apagado completado Error: 1080 SQLSTATE: 08S01 (ER_FORCING_CLOSE) Mensaje: %s: Forzando a cerrar el thread %ld usuario: '%s' Error: 1081 SQLSTATE: 08S01 (ER_IPSOCK_ERROR) Mensaje: No puedo crear IP socket Error: 1082 SQLSTATE: 42S12 (ER_NO_SUCH_INDEX) Mensaje: La tabla '%s' no tiene indice como el usado en CREATE INDEX. Crea de nuevo la tabla Error: 1083 SQLSTATE: 42000 (ER_WRONG_FIELD_TERMINATORS) Mensaje: Los separadores de argumentos del campo no son los especificados. Comprueba el manual Error: 1084 SQLSTATE: 42000 (ER_BLOBS_AND_NO_TERMINATED) Mensaje: No puedes usar longitudes de filas fijos con BLOBs. Por favor usa 'campos terminados por '. Error: 1085 SQLSTATE: HY000 (ER_TEXTFILE_NOT_READABLE) Mensaje: El archivo '%s' debe estar en el directorio de la base de datos o ser de lectura por todos Error: 1086 SQLSTATE: HY000 (ER_FILE_EXISTS_ERROR) Mensaje: El archivo '%s' ya existe Error: 1087 SQLSTATE: HY000 (ER_LOAD_INFO) Mensaje: Registros: %ld Borrados: %ld Saltados: %ld Peligros: %ld Error: 1088 SQLSTATE: HY000 (ER_ALTER_INFO) Mensaje: Registros: %ld Duplicados: %ld Error: 1089 SQLSTATE: HY000 (ER_WRONG_SUB_KEY) Mensaje: Parte de la clave es erronea. Una parte de la clave no es una cadena o la longitud usada es tan grande como la parte de la clave Error: 1090 SQLSTATE: 42000 (ER_CANT_REMOVE_ALL_FIELDS)
1412
Mensaje: No puede borrar todos los campos con ALTER TABLE. Usa DROP TABLE para hacerlo Error: 1091 SQLSTATE: 42000 (ER_CANT_DROP_FIELD_OR_KEY) Mensaje: No puedo ELIMINAR '%s'. compuebe que el campo/clave existe Error: 1092 SQLSTATE: HY000 (ER_INSERT_INFO) Mensaje: Registros: %ld Duplicados: %ld Peligros: %ld Error: 1093 SQLSTATE: HY000 (ER_UPDATE_TABLE_USED) Mensaje: You can't specify target table '%s' for update in FROM clause Error: 1094 SQLSTATE: HY000 (ER_NO_SUCH_THREAD) Mensaje: Identificador del thread: %lu desconocido Error: 1095 SQLSTATE: HY000 (ER_KILL_DENIED_ERROR) Mensaje: Tu no eres el propietario del thread%lu Error: 1096 SQLSTATE: HY000 (ER_NO_TABLES_USED) Mensaje: No ha tablas usadas Error: 1097 SQLSTATE: HY000 (ER_TOO_BIG_SET) Mensaje: Muchas strings para columna %s y SET Error: 1098 SQLSTATE: HY000 (ER_NO_UNIQUE_LOGFILE) Mensaje: No puede crear un unico archivo log %s.(1-999) Error: 1099 SQLSTATE: HY000 (ER_TABLE_NOT_LOCKED_FOR_WRITE) Mensaje: Tabla '%s' fue trabada con un READ lock y no puede ser actualizada Error: 1100 SQLSTATE: HY000 (ER_TABLE_NOT_LOCKED) Mensaje: Tabla '%s' no fue trabada con LOCK TABLES Error: 1101 SQLSTATE: 42000 (ER_BLOB_CANT_HAVE_DEFAULT) Mensaje: Campo Blob '%s' no puede tener valores patron Error: 1102 SQLSTATE: 42000 (ER_WRONG_DB_NAME) Mensaje: Nombre de base de datos ilegal '%s' Error: 1103 SQLSTATE: 42000 (ER_WRONG_TABLE_NAME) Mensaje: Nombre de tabla ilegal '%s' Error: 1104 SQLSTATE: 42000 (ER_TOO_BIG_SELECT) Mensaje: El SELECT puede examinar muchos registros y probablemente con mucho tiempo. Verifique tu WHERE y usa SET SQL_BIG_SELECTS=1 si el SELECT esta correcto Error: 1105 SQLSTATE: HY000 (ER_UNKNOWN_ERROR) Mensaje: Error desconocido Error: 1106 SQLSTATE: 42000 (ER_UNKNOWN_PROCEDURE)
1413
Mensaje: Procedimiento desconocido %s Error: 1107 SQLSTATE: 42000 (ER_WRONG_PARAMCOUNT_TO_PROCEDURE) Mensaje: Equivocado parametro count para procedimiento %s Error: 1108 SQLSTATE: HY000 (ER_WRONG_PARAMETERS_TO_PROCEDURE) Mensaje: Equivocados parametros para procedimiento %s Error: 1109 SQLSTATE: 42S02 (ER_UNKNOWN_TABLE) Mensaje: Tabla desconocida '%s' in %s Error: 1110 SQLSTATE: 42000 (ER_FIELD_SPECIFIED_TWICE) Mensaje: Campo '%s' especificado dos veces Error: 1111 SQLSTATE: HY000 (ER_INVALID_GROUP_FUNC_USE) Mensaje: Invalido uso de funcin en grupo Error: 1112 SQLSTATE: 42000 (ER_UNSUPPORTED_EXTENSION) Mensaje: Tabla '%s' usa una extensin que no existe en esta MySQL versin Error: 1113 SQLSTATE: 42000 (ER_TABLE_MUST_HAVE_COLUMNS) Mensaje: Una tabla debe tener al menos 1 columna Error: 1114 SQLSTATE: HY000 (ER_RECORD_FILE_FULL) Mensaje: La tabla '%s' est llena Error: 1115 SQLSTATE: 42000 (ER_UNKNOWN_CHARACTER_SET) Mensaje: Juego de caracteres desconocido: '%s' Error: 1116 SQLSTATE: HY000 (ER_TOO_MANY_TABLES) Mensaje: Muchas tablas. MySQL solamente puede usar %d tablas en un join Error: 1117 SQLSTATE: HY000 (ER_TOO_MANY_FIELDS) Mensaje: Muchos campos Error: 1118 SQLSTATE: 42000 (ER_TOO_BIG_ROWSIZE) Mensaje: Tamao de lnea muy grande. Mximo tamao de lnea, no contando blob, es %ld. Tu tienes que cambiar algunos campos para blob Error: 1119 SQLSTATE: HY000 (ER_STACK_OVERRUN) Mensaje: Sobrecarga de la pila de thread: Usada: %ld de una %ld pila. Use 'mysqld -O thread_stack=#' para especificar una mayor pila si necesario Error: 1120 SQLSTATE: 42000 (ER_WRONG_OUTER_JOIN) Mensaje: Dependencia cruzada encontrada en OUTER JOIN. Examine su condicin ON Error: 1121 SQLSTATE: 42000 (ER_NULL_COLUMN_IN_INDEX) Mensaje: Columna '%s' es usada con UNIQUE o INDEX pero no est definida como NOT NULL
1414
Error: 1122 SQLSTATE: HY000 (ER_CANT_FIND_UDF) Mensaje: No puedo cargar funcin '%s' Error: 1123 SQLSTATE: HY000 (ER_CANT_INITIALIZE_UDF) Mensaje: No puedo inicializar funcin '%s'; %s Error: 1124 SQLSTATE: HY000 (ER_UDF_NO_PATHS) Mensaje: No pasos permitidos para librarias conjugadas Error: 1125 SQLSTATE: HY000 (ER_UDF_EXISTS) Mensaje: Funcin '%s' ya existe Error: 1126 SQLSTATE: HY000 (ER_CANT_OPEN_LIBRARY) Mensaje: No puedo abrir libraria conjugada '%s' (errno: %d %s) Error: 1127 SQLSTATE: HY000 (ER_CANT_FIND_DL_ENTRY) Mensaje: No puedo encontrar funcin '%s' en libraria Error: 1128 SQLSTATE: HY000 (ER_FUNCTION_NOT_DEFINED) Mensaje: Funcin '%s' no est definida Error: 1129 SQLSTATE: HY000 (ER_HOST_IS_BLOCKED) Mensaje: Servidor '%s' est bloqueado por muchos errores de conexin. Desbloquear con 'mysqladmin flush-hosts' Error: 1130 SQLSTATE: HY000 (ER_HOST_NOT_PRIVILEGED) Mensaje: Servidor '%s' no est permitido para conectar con este servidor MySQL Error: 1131 SQLSTATE: 42000 (ER_PASSWORD_ANONYMOUS_USER) Mensaje: Tu ests usando MySQL como un usuario anonimo y usuarios anonimos no tienen permiso para cambiar las claves Error: 1132 SQLSTATE: 42000 (ER_PASSWORD_NOT_ALLOWED) Mensaje: Tu debes de tener permiso para actualizar tablas en la base de datos mysql para cambiar las claves para otros Error: 1133 SQLSTATE: 42000 (ER_PASSWORD_NO_MATCH) Mensaje: No puedo encontrar una lnea correponsdiente en la tabla user Error: 1134 SQLSTATE: HY000 (ER_UPDATE_INFO) Mensaje: Lneas correspondientes: %ld Cambiadas: %ld Avisos: %ld Error: 1135 SQLSTATE: HY000 (ER_CANT_CREATE_THREAD) Mensaje: No puedo crear un nuevo thread (errno %d). Si tu est con falta de memoria disponible, tu puedes consultar el Manual para posibles problemas con SO Error: 1136 SQLSTATE: 21S01 (ER_WRONG_VALUE_COUNT_ON_ROW) Mensaje: El nmero de columnas no corresponde al nmero en la lnea %ld
1415
Error: 1137 SQLSTATE: HY000 (ER_CANT_REOPEN_TABLE) Mensaje: No puedo reabrir tabla: '%s Error: 1138 SQLSTATE: 22004 (ER_INVALID_USE_OF_NULL) Mensaje: Invalido uso de valor NULL Error: 1139 SQLSTATE: 42000 (ER_REGEXP_ERROR) Mensaje: Obtenido error '%s' de regexp Error: 1140 SQLSTATE: 42000 (ER_MIX_OF_GROUP_FUNC_AND_FIELDS) Mensaje: Mezcla de columnas GROUP (MIN(),MAX(),COUNT()...) con no GROUP columnas es ilegal si no hat la clausula GROUP BY Error: 1141 SQLSTATE: 42000 (ER_NONEXISTING_GRANT) Mensaje: No existe permiso definido para usuario '%s' en el servidor '%s' Error: 1142 SQLSTATE: 42000 (ER_TABLEACCESS_DENIED_ERROR) Mensaje: %s comando negado para usuario: '%s'@'%s' para tabla '%s' Error: 1143 SQLSTATE: 42000 (ER_COLUMNACCESS_DENIED_ERROR) Mensaje: %s comando negado para usuario: '%s'@'%s' para columna '%s' en la tabla '%s' Error: 1144 SQLSTATE: 42000 (ER_ILLEGAL_GRANT_FOR_TABLE) Mensaje: Ilegal comando GRANT/REVOKE. Por favor consulte el manual para cuales permisos pueden ser usados. Error: 1145 SQLSTATE: 42000 (ER_GRANT_WRONG_HOST_OR_USER) Mensaje: El argumento para servidor o usuario para GRANT es demasiado grande Error: 1146 SQLSTATE: 42S02 (ER_NO_SUCH_TABLE) Mensaje: Tabla '%s.%s' no existe Error: 1147 SQLSTATE: 42000 (ER_NONEXISTING_TABLE_GRANT) Mensaje: No existe tal permiso definido para usuario '%s' en el servidor '%s' en la tabla '%s' Error: 1148 SQLSTATE: 42000 (ER_NOT_ALLOWED_COMMAND) Mensaje: El comando usado no es permitido con esta versin de MySQL Error: 1149 SQLSTATE: 42000 (ER_SYNTAX_ERROR) Mensaje: Algo est equivocado en su sintax Error: 1150 SQLSTATE: HY000 (ER_DELAYED_CANT_CHANGE_LOCK) Mensaje: Thread de insercin retarda no pudiendo bloquear para la tabla %s Error: 1151 SQLSTATE: HY000 (ER_TOO_MANY_DELAYED_THREADS) Mensaje: Muchos threads retardados en uso Error: 1152 SQLSTATE: 08S01 (ER_ABORTING_CONNECTION) Mensaje: Conexin abortada %ld para db: '%s' usuario: '%s' (%s)
1416
Error: 1153 SQLSTATE: 08S01 (ER_NET_PACKET_TOO_LARGE) Mensaje: Obtenido un paquete mayor que 'max_allowed_packet' Error: 1154 SQLSTATE: 08S01 (ER_NET_READ_ERROR_FROM_PIPE) Mensaje: Obtenido un error de lectura de la conexin pipe Error: 1155 SQLSTATE: 08S01 (ER_NET_FCNTL_ERROR) Mensaje: Obtenido un error de fcntl() Error: 1156 SQLSTATE: 08S01 (ER_NET_PACKETS_OUT_OF_ORDER) Mensaje: Obtenido paquetes desordenados Error: 1157 SQLSTATE: 08S01 (ER_NET_UNCOMPRESS_ERROR) Mensaje: No puedo descomprimir paquetes de comunicacin Error: 1158 SQLSTATE: 08S01 (ER_NET_READ_ERROR) Mensaje: Obtenido un error leyendo paquetes de comunicacin Error: 1159 SQLSTATE: 08S01 (ER_NET_READ_INTERRUPTED) Mensaje: Obtenido timeout leyendo paquetes de comunicacin Error: 1160 SQLSTATE: 08S01 (ER_NET_ERROR_ON_WRITE) Mensaje: Obtenido un error de escribiendo paquetes de comunicacin Error: 1161 SQLSTATE: 08S01 (ER_NET_WRITE_INTERRUPTED) Mensaje: Obtenido timeout escribiendo paquetes de comunicacin Error: 1162 SQLSTATE: 42000 (ER_TOO_LONG_STRING) Mensaje: La string resultante es mayor que max_allowed_packet Error: 1163 SQLSTATE: 42000 (ER_TABLE_CANT_HANDLE_BLOB) Mensaje: El tipo de tabla usada no permite soporte para columnas BLOB/TEXT Error: 1164 SQLSTATE: 42000 (ER_TABLE_CANT_HANDLE_AUTO_INCREMENT) Mensaje: El tipo de tabla usada no permite soporte para columnas AUTO_INCREMENT Error: 1165 SQLSTATE: HY000 (ER_DELAYED_INSERT_TABLE_LOCKED) Mensaje: INSERT DELAYED no puede ser usado con tablas '%s', porque esta bloqueada con LOCK TABLES Error: 1166 SQLSTATE: 42000 (ER_WRONG_COLUMN_NAME) Mensaje: Incorrecto nombre de columna '%s' Error: 1167 SQLSTATE: 42000 (ER_WRONG_KEY_COLUMN) Mensaje: El manipulador de tabla usado no puede indexar columna '%s' Error: 1168 SQLSTATE: HY000 (ER_WRONG_MRG_TABLE) Mensaje: Todas las tablas en la MERGE tabla no estan definidas identicamente
1417
Error: 1169 SQLSTATE: 23000 (ER_DUP_UNIQUE) Mensaje: No puedo escribir, debido al nico constraint, para tabla '%s' Error: 1170 SQLSTATE: 42000 (ER_BLOB_KEY_WITHOUT_LENGTH) Mensaje: Columna BLOB column '%s' usada en especificacin de clave sin tamao de la clave Error: 1171 SQLSTATE: 42000 (ER_PRIMARY_CANT_HAVE_NULL) Mensaje: Todas las partes de un PRIMARY KEY deben ser NOT NULL; Si necesitas NULL en una clave, use UNIQUE Error: 1172 SQLSTATE: 42000 (ER_TOO_MANY_ROWS) Mensaje: Resultado compuesto de mas que una lnea Error: 1173 SQLSTATE: 42000 (ER_REQUIRES_PRIMARY_KEY) Mensaje: Este tipo de tabla necesita de una primary key Error: 1174 SQLSTATE: HY000 (ER_NO_RAID_COMPILED) Mensaje: Esta versin de MySQL no es compilada con soporte RAID Error: 1175 SQLSTATE: HY000 (ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE) Mensaje: Tu ests usando modo de actualizacin segura y tentado actualizar una tabla sin un WHERE que usa una KEY columna Error: 1176 SQLSTATE: HY000 (ER_KEY_DOES_NOT_EXITS) Mensaje: Clave '%s' no existe en la tabla '%s' Error: 1177 SQLSTATE: 42000 (ER_CHECK_NO_SUCH_TABLE) Mensaje: No puedo abrir tabla Error: 1178 SQLSTATE: 42000 (ER_CHECK_NOT_IMPLEMENTED) Mensaje: El manipulador de la tabla no permite soporte para %s Error: 1179 SQLSTATE: 25000 (ER_CANT_DO_THIS_DURING_AN_TRANSACTION) Mensaje: No tienes el permiso para ejecutar este comando en una transicin Error: 1180 SQLSTATE: HY000 (ER_ERROR_DURING_COMMIT) Mensaje: Obtenido error %d durante COMMIT Error: 1181 SQLSTATE: HY000 (ER_ERROR_DURING_ROLLBACK) Mensaje: Obtenido error %d durante ROLLBACK Error: 1182 SQLSTATE: HY000 (ER_ERROR_DURING_FLUSH_LOGS) Mensaje: Obtenido error %d durante FLUSH_LOGS Error: 1183 SQLSTATE: HY000 (ER_ERROR_DURING_CHECKPOINT) Mensaje: Obtenido error %d durante CHECKPOINT Error: 1184 SQLSTATE: 08S01 (ER_NEW_ABORTING_CONNECTION) Mensaje: Abortada conexin %ld para db: '%s' usuario: '%s' servidor: '%s' (%s)
1418
Error: 1185 SQLSTATE: HY000 (ER_DUMP_NOT_IMPLEMENTED) Mensaje: El manipulador de tabla no soporta dump para tabla binaria Error: 1186 SQLSTATE: HY000 (ER_FLUSH_MASTER_BINLOG_CLOSED) Mensaje: Binlog closed, cannot RESET MASTER Error: 1187 SQLSTATE: HY000 (ER_INDEX_REBUILD) Mensaje: Falla reconstruyendo el indice de la tabla dumped '%s' Error: 1188 SQLSTATE: HY000 (ER_MASTER) Mensaje: Error del master: '%s' Error: 1189 SQLSTATE: 08S01 (ER_MASTER_NET_READ) Mensaje: Error de red leyendo del master Error: 1190 SQLSTATE: 08S01 (ER_MASTER_NET_WRITE) Mensaje: Error de red escribiendo para el master Error: 1191 SQLSTATE: HY000 (ER_FT_MATCHING_KEY_NOT_FOUND) Mensaje: No puedo encontrar ndice FULLTEXT correspondiendo a la lista de columnas Error: 1192 SQLSTATE: HY000 (ER_LOCK_OR_ACTIVE_TRANSACTION) Mensaje: No puedo ejecutar el comando dado porque tienes tablas bloqueadas o una transicin activa Error: 1193 SQLSTATE: HY000 (ER_UNKNOWN_SYSTEM_VARIABLE) Mensaje: Desconocida variable de sistema '%s' Error: 1194 SQLSTATE: HY000 (ER_CRASHED_ON_USAGE) Mensaje: Tabla '%s' est marcada como crashed y debe ser reparada Error: 1195 SQLSTATE: HY000 (ER_CRASHED_ON_REPAIR) Mensaje: Tabla '%s' est marcada como crashed y la ltima reparacin (automactica?) fall Error: 1196 SQLSTATE: HY000 (ER_WARNING_NOT_COMPLETE_ROLLBACK) Mensaje: Aviso: Algunas tablas no transancionales no pueden tener rolled back Error: 1197 SQLSTATE: HY000 (ER_TRANS_CACHE_FULL) Mensaje: Multipla transicin necesita mas que 'max_binlog_cache_size' bytes de almacenamiento. Aumente esta variable mysqld y tente de nuevo Error: 1198 SQLSTATE: HY000 (ER_SLAVE_MUST_STOP) Mensaje: Esta operacin no puede ser hecha con el esclavo funcionando, primero use STOP SLAVE Error: 1199 SQLSTATE: HY000 (ER_SLAVE_NOT_RUNNING) Mensaje: Esta operacin necesita el esclavo funcionando, configure esclavo y haga el START SLAVE
1419
Error: 1200 SQLSTATE: HY000 (ER_BAD_SLAVE) Mensaje: El servidor no est configurado como esclavo, edite el archivo config file o con CHANGE MASTER TO Error: 1201 SQLSTATE: HY000 (ER_MASTER_INFO) Mensaje: Could not initialize master info structure; more error messages can be found in the MySQL error log Error: 1202 SQLSTATE: HY000 (ER_SLAVE_THREAD) Mensaje: No puedo crear el thread esclavo, verifique recursos del sistema Error: 1203 SQLSTATE: 42000 (ER_TOO_MANY_USER_CONNECTIONS) Mensaje: Usario %s ya tiene mas que 'max_user_connections' conexiones activas Error: 1204 SQLSTATE: HY000 (ER_SET_CONSTANTS_ONLY) Mensaje: Tu solo debes usar expresiones constantes con SET Error: 1205 SQLSTATE: HY000 (ER_LOCK_WAIT_TIMEOUT) Mensaje: Tiempo de bloqueo de espera excedido Error: 1206 SQLSTATE: HY000 (ER_LOCK_TABLE_FULL) Mensaje: El nmero total de bloqueos excede el tamao de bloqueo de la tabla Error: 1207 SQLSTATE: 25000 (ER_READ_ONLY_TRANSACTION) Mensaje: Bloqueos de actualizacin no pueden ser adqueridos durante una transicin READ UNCOMMITTED Error: 1208 SQLSTATE: HY000 (ER_DROP_DB_WITH_READ_LOCK) Mensaje: DROP DATABASE no permitido mientras un thread est ejerciendo un bloqueo de lectura global Error: 1209 SQLSTATE: HY000 (ER_CREATE_DB_WITH_READ_LOCK) Mensaje: CREATE DATABASE no permitido mientras un thread est ejerciendo un bloqueo de lectura global Error: 1210 SQLSTATE: HY000 (ER_WRONG_ARGUMENTS) Mensaje: Argumentos errados para %s Error: 1211 SQLSTATE: 42000 (ER_NO_PERMISSION_TO_CREATE_USER) Mensaje: '%s`@`%s` no es permitido para crear nuevos usuarios Error: 1212 SQLSTATE: HY000 (ER_UNION_TABLES_IN_DIFFERENT_DIR) Mensaje: Incorrecta definicin de la tabla; Todas las tablas MERGE deben estar en el mismo banco de datos Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK) Mensaje: Encontrado deadlock cuando tentando obtener el bloqueo; Tente recomenzar la transicin Error: 1214 SQLSTATE: HY000 (ER_TABLE_CANT_HANDLE_FT)
1420
Mensaje: El tipo de tabla usada no soporta ndices FULLTEXT Error: 1215 SQLSTATE: HY000 (ER_CANNOT_ADD_FOREIGN) Mensaje: No puede adicionar clave extranjera constraint Error: 1216 SQLSTATE: 23000 (ER_NO_REFERENCED_ROW) Mensaje: No puede adicionar una lnea hijo: falla de clave extranjera constraint Error: 1217 SQLSTATE: 23000 (ER_ROW_IS_REFERENCED) Mensaje: No puede deletar una lnea padre: falla de clave extranjera constraint Error: 1218 SQLSTATE: 08S01 (ER_CONNECT_TO_MASTER) Mensaje: Error de coneccion a master: %s Error: 1219 SQLSTATE: HY000 (ER_QUERY_ON_MASTER) Mensaje: Error executando el query en master: %s Error: 1220 SQLSTATE: HY000 (ER_ERROR_WHEN_EXECUTING_COMMAND) Mensaje: Error de %s: %s Error: 1221 SQLSTATE: HY000 (ER_WRONG_USAGE) Mensaje: Equivocado uso de %s y %s Error: 1222 SQLSTATE: 21000 (ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT) Mensaje: El comando SELECT usado tiene diferente nmero de columnas Error: 1223 SQLSTATE: HY000 (ER_CANT_UPDATE_WITH_READLOCK) Mensaje: No puedo ejecutar el query porque usted tiene conflicto de traba de lectura Error: 1224 SQLSTATE: HY000 (ER_MIXING_NOT_ALLOWED) Mensaje: Mezla de transancional y no-transancional tablas est deshabilitada Error: 1225 SQLSTATE: HY000 (ER_DUP_ARGUMENT) Mensaje: Opcin '%s' usada dos veces en el comando Error: 1226 SQLSTATE: 42000 (ER_USER_LIMIT_REACHED) Mensaje: Usuario '%s' ha excedido el recurso '%s' (actual valor: %ld) Error: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR) Mensaje: Acceso negado. Usted necesita el privilegio %s para esta operacin Error: 1228 SQLSTATE: HY000 (ER_LOCAL_VARIABLE) Mensaje: Variable '%s' es una SESSION variable y no puede ser usada con SET GLOBAL Error: 1229 SQLSTATE: HY000 (ER_GLOBAL_VARIABLE) Mensaje: Variable '%s' es una GLOBAL variable y no puede ser configurada con SET GLOBAL Error: 1230 SQLSTATE: 42000 (ER_NO_DEFAULT)
1421
Mensaje: Variable '%s' no tiene un valor patrn Error: 1231 SQLSTATE: 42000 (ER_WRONG_VALUE_FOR_VAR) Mensaje: Variable '%s' no puede ser configurada para el valor de '%s' Error: 1232 SQLSTATE: 42000 (ER_WRONG_TYPE_FOR_VAR) Mensaje: Tipo de argumento equivocado para variable '%s' Error: 1233 SQLSTATE: HY000 (ER_VAR_CANT_BE_READ) Mensaje: Variable '%s' solamente puede ser configurada, no leda Error: 1234 SQLSTATE: 42000 (ER_CANT_USE_OPTION_HERE) Mensaje: Equivocado uso/colocacin de '%s' Error: 1235 SQLSTATE: 42000 (ER_NOT_SUPPORTED_YET) Mensaje: Esta versin de MySQL no soporta todavia '%s' Error: 1236 SQLSTATE: HY000 (ER_MASTER_FATAL_ERROR_READING_BINLOG) Mensaje: Recibi fatal error %d: '%s' del master cuando leyendo datos del binary log Error: 1237 SQLSTATE: HY000 (ER_SLAVE_IGNORED_TABLE) Mensaje: Slave SQL thread ignorado el query debido a las reglas de replicacin-*-tabla Error: 1238 SQLSTATE: HY000 (ER_INCORRECT_GLOBAL_LOCAL_VAR) Mensaje: Variable '%s' es una %s variable Error: 1239 SQLSTATE: 42000 (ER_WRONG_FK_DEF) Mensaje: Equivocada definicin de llave extranjera para '%s': %s Error: 1240 SQLSTATE: HY000 (ER_KEY_REF_DO_NOT_MATCH_TABLE_REF) Mensaje: Referencia de llave y referencia de tabla no coinciden Error: 1241 SQLSTATE: 21000 (ER_OPERAND_COLUMNS) Mensaje: Operando debe tener %d columna(s) Error: 1242 SQLSTATE: 21000 (ER_SUBQUERY_NO_1_ROW) Mensaje: Subconsulta retorna mas que 1 lnea Error: 1243 SQLSTATE: HY000 (ER_UNKNOWN_STMT_HANDLER) Mensaje: Desconocido preparado comando handler (%.*s) dado para %s Error: 1244 SQLSTATE: HY000 (ER_CORRUPT_HELP_DB) Mensaje: Base de datos Help est corrupto o no existe Error: 1245 SQLSTATE: HY000 (ER_CYCLIC_REFERENCE) Mensaje: Cclica referencia en subconsultas Error: 1246 SQLSTATE: HY000 (ER_AUTO_CONVERT)
1422
Mensaje: Convirtiendo columna '%s' de %s para %s Error: 1247 SQLSTATE: 42S22 (ER_ILLEGAL_REFERENCE) Mensaje: Referencia '%s' no soportada (%s) Error: 1248 SQLSTATE: 42000 (ER_DERIVED_MUST_HAVE_ALIAS) Mensaje: Cada tabla derivada debe tener su propio alias Error: 1249 SQLSTATE: 01000 (ER_SELECT_REDUCED) Mensaje: Select %u fu reducido durante optimizacin Error: 1250 SQLSTATE: 42000 (ER_TABLENAME_NOT_ALLOWED_HERE) Mensaje: Tabla '%s' de uno de los SELECT no puede ser usada en %s Error: 1251 SQLSTATE: 08004 (ER_NOT_SUPPORTED_AUTH_MODE) Mensaje: Cliente no soporta protocolo de autenticacin solicitado por el servidor; considere actualizar el cliente MySQL Error: 1252 SQLSTATE: 42000 (ER_SPATIAL_CANT_HAVE_NULL) Mensaje: Todas las partes de una SPATIAL index deben ser NOT NULL Error: 1253 SQLSTATE: 42000 (ER_COLLATION_CHARSET_MISMATCH) Mensaje: COLLATION '%s' no es vlido para CHARACTER SET '%s' Error: 1254 SQLSTATE: HY000 (ER_SLAVE_WAS_RUNNING) Mensaje: Slave ya est funcionando Error: 1255 SQLSTATE: HY000 (ER_SLAVE_WAS_NOT_RUNNING) Mensaje: Slave ya fu parado Error: 1256 SQLSTATE: HY000 (ER_TOO_BIG_FOR_UNCOMPRESS) Mensaje: Tamao demasiado grande para datos descomprimidos. El mximo tamao es %d. (probablemente, extensin de datos descomprimidos fu corrompida) Error: 1257 SQLSTATE: HY000 (ER_ZLIB_Z_MEM_ERROR) Mensaje: Z_MEM_ERROR: No suficiente memoria para zlib Error: 1258 SQLSTATE: HY000 (ER_ZLIB_Z_BUF_ERROR) Mensaje: Z_BUF_ERROR: No suficiente espacio en el bfer de salida para zlib (probablemente, extensin de datos descomprimidos fu corrompida) Error: 1259 SQLSTATE: HY000 (ER_ZLIB_Z_DATA_ERROR) Mensaje: ZLIB: Dato de entrada fu corrompido para zlib Error: 1260 SQLSTATE: HY000 (ER_CUT_VALUE_GROUP_CONCAT) Mensaje: %d lnea(s) fue(fueron) cortadas por group_concat() Error: 1261 SQLSTATE: 01000 (ER_WARN_TOO_FEW_RECORDS) Mensaje: Lnea %ld no contiene datos para todas las columnas
1423
Error: 1262 SQLSTATE: 01000 (ER_WARN_TOO_MANY_RECORDS) Mensaje: Lnea %ld fu truncada; La misma contine mas datos que las que existen en las columnas de entrada Error: 1263 SQLSTATE: 22004 (ER_WARN_NULL_TO_NOTNULL) Mensaje: Datos truncado, NULL suministrado para NOT NULL columna '%s' en la lnea %ld Error: 1264 SQLSTATE: 22003 (ER_WARN_DATA_OUT_OF_RANGE) Mensaje: Datos truncados, fuera de gama para columna '%s' en la lnea %ld Error: 1265 SQLSTATE: 01000 (WARN_DATA_TRUNCATED) Mensaje: Datos truncados para columna '%s' en la lnea %ld Error: 1266 SQLSTATE: HY000 (ER_WARN_USING_OTHER_HANDLER) Mensaje: Usando motor de almacenamiento %s para tabla '%s' Error: 1267 SQLSTATE: HY000 (ER_CANT_AGGREGATE_2COLLATIONS) Mensaje: Ilegal mezcla de collations (%s,%s) y (%s,%s) para operacin '%s' Error: 1268 SQLSTATE: HY000 (ER_DROP_USER) Mensaje: Cannot drop one or more of the requested users Error: 1269 SQLSTATE: HY000 (ER_REVOKE_GRANTS) Mensaje: No puede revocar todos los privilegios, derecho para uno o mas de los usuarios solicitados Error: 1270 SQLSTATE: HY000 (ER_CANT_AGGREGATE_3COLLATIONS) Mensaje: Ilegal mezcla de collations (%s,%s), (%s,%s), (%s,%s) para operacin '%s' Error: 1271 SQLSTATE: HY000 (ER_CANT_AGGREGATE_NCOLLATIONS) Mensaje: Ilegal mezcla de collations para operacin '%s' Error: 1272 SQLSTATE: HY000 (ER_VARIABLE_IS_NOT_STRUCT) Mensaje: Variable '%s' no es una variable componente (No puede ser usada como XXXX.variable_name) Error: 1273 SQLSTATE: HY000 (ER_UNKNOWN_COLLATION) Mensaje: Collation desconocida: '%s' Error: 1274 SQLSTATE: HY000 (ER_SLAVE_IGNORED_SSL_PARAMS) Mensaje: Parametros SSL en CHANGE MASTER son ignorados porque este slave MySQL fue compilado sin soporte SSL; pueden ser usados despues cuando el slave MySQL con SSL sea inicializado Error: 1275 SQLSTATE: HY000 (ER_SERVER_IS_IN_SECURE_AUTH_MODE) Mensaje: Servidor est rodando en modo --secure-auth, pero '%s'@'%s' tiene clave en el antiguo formato; por favor cambie la clave para el nuevo formato Error: 1276 SQLSTATE: HY000 (ER_WARN_FIELD_RESOLVED) Mensaje: Campo o referencia '%s%s%s%s%s' de SELECT #%d fue resolvido en SELECT #%d
1424
Error: 1277 SQLSTATE: HY000 (ER_BAD_SLAVE_UNTIL_COND) Mensaje: Parametro equivocado o combinacin de parametros para START SLAVE UNTIL Error: 1278 SQLSTATE: HY000 (ER_MISSING_SKIP_SLAVE) Mensaje: Es recomendado rodar con --skip-slave-start cuando haciendo replicacin step-by-step con START SLAVE UNTIL, a menos que usted no est seguro en caso de inesperada reinicializacin del mysqld slave Error: 1279 SQLSTATE: HY000 (ER_UNTIL_COND_IGNORED) Mensaje: SQL thread no es inicializado tal que opciones UNTIL son ignoradas Error: 1280 SQLSTATE: 42000 (ER_WRONG_NAME_FOR_INDEX) Mensaje: Nombre de ndice incorrecto '%s' Error: 1281 SQLSTATE: 42000 (ER_WRONG_NAME_FOR_CATALOG) Mensaje: Nombre de catalog incorrecto '%s' Error: 1282 SQLSTATE: HY000 (ER_WARN_QC_RESIZE) Mensaje: Query cache fallada para configurar tamao %lu, nuevo tamao de query cache es %lu Error: 1283 SQLSTATE: HY000 (ER_BAD_FT_COLUMN) Mensaje: Columna '%s' no puede ser parte de FULLTEXT index Error: 1284 SQLSTATE: HY000 (ER_UNKNOWN_KEY_CACHE) Mensaje: Desconocida key cache '%s' Error: 1285 SQLSTATE: HY000 (ER_WARN_HOSTNAME_WONT_WORK) Mensaje: MySQL esta inicializado en modo --skip-name-resolve. Usted necesita reinicializarlo sin esta opcin para este derecho funcionar Error: 1286 SQLSTATE: 42000 (ER_UNKNOWN_STORAGE_ENGINE) Mensaje: Desconocido motor de tabla '%s' Error: 1287 SQLSTATE: HY000 (ER_WARN_DEPRECATED_SYNTAX) Mensaje: '%s' est desaprobado, use '%s' en su lugar Error: 1288 SQLSTATE: HY000 (ER_NON_UPDATABLE_TABLE) Mensaje: La tabla destino %s del %s no es actualizable Error: 1289 SQLSTATE: HY000 (ER_FEATURE_DISABLED) Mensaje: El recurso '%s' fue deshabilitado; usted necesita construir MySQL con '%s' para tener eso funcionando Error: 1290 SQLSTATE: HY000 (ER_OPTION_PREVENTS_STATEMENT) Mensaje: El servidor MySQL est rodando con la opcin %s tal que no puede ejecutar este comando Error: 1291 SQLSTATE: HY000 (ER_DUPLICATED_VALUE_IN_TYPE) Mensaje: Columna '%s' tiene valor doblado '%s' en %s
1425
Error: 1292 SQLSTATE: 22007 (ER_TRUNCATED_WRONG_VALUE) Mensaje: Equivocado truncado %s valor: '%s' Error: 1293 SQLSTATE: HY000 (ER_TOO_MUCH_AUTO_TIMESTAMP_COLS) Mensaje: Incorrecta definicin de tabla; Solamente debe haber una columna TIMESTAMP con CURRENT_TIMESTAMP en DEFAULT o ON UPDATE clusula Error: 1294 SQLSTATE: HY000 (ER_INVALID_ON_UPDATE) Mensaje: Invlido ON UPDATE clusula para campo '%s' Error: 1295 SQLSTATE: HY000 (ER_UNSUPPORTED_PS) Mensaje: This command is not supported in the prepared statement protocol yet Error: 1296 SQLSTATE: HY000 (ER_GET_ERRMSG) Mensaje: Got error %d '%s' from %s Error: 1297 SQLSTATE: HY000 (ER_GET_TEMPORARY_ERRMSG) Mensaje: Got temporary error %d '%s' from %s Error: 1298 SQLSTATE: HY000 (ER_UNKNOWN_TIME_ZONE) Mensaje: Unknown or incorrect time zone: '%s' Error: 1299 SQLSTATE: HY000 (ER_WARN_INVALID_TIMESTAMP) Mensaje: Invalid TIMESTAMP value in column '%s' at row %ld Error: 1300 SQLSTATE: HY000 (ER_INVALID_CHARACTER_STRING) Mensaje: Invalid %s character string: '%s' Error: 1301 SQLSTATE: HY000 (ER_WARN_ALLOWED_PACKET_OVERFLOWED) Mensaje: Result of %s() was larger than max_allowed_packet (%ld) - truncated Error: 1302 SQLSTATE: HY000 (ER_CONFLICTING_DECLARATIONS) Mensaje: Conflicting declarations: '%s%s' and '%s%s' Error: 1303 SQLSTATE: 2F003 (ER_SP_NO_RECURSIVE_CREATE) Mensaje: Can't create a %s from within another stored routine Error: 1304 SQLSTATE: 42000 (ER_SP_ALREADY_EXISTS) Mensaje: %s %s already exists Error: 1305 SQLSTATE: 42000 (ER_SP_DOES_NOT_EXIST) Mensaje: %s %s does not exist Error: 1306 SQLSTATE: HY000 (ER_SP_DROP_FAILED) Mensaje: Failed to DROP %s %s Error: 1307 SQLSTATE: HY000 (ER_SP_STORE_FAILED) Mensaje: Failed to CREATE %s %s
1426
Error: 1308 SQLSTATE: 42000 (ER_SP_LILABEL_MISMATCH) Mensaje: %s with no matching label: %s Error: 1309 SQLSTATE: 42000 (ER_SP_LABEL_REDEFINE) Mensaje: Redefining label %s Error: 1310 SQLSTATE: 42000 (ER_SP_LABEL_MISMATCH) Mensaje: End-label %s without match Error: 1311 SQLSTATE: 01000 (ER_SP_UNINIT_VAR) Mensaje: Referring to uninitialized variable %s Error: 1312 SQLSTATE: 0A000 (ER_SP_BADSELECT) Mensaje: PROCEDURE %s can't return a result set in the given context Error: 1313 SQLSTATE: 42000 (ER_SP_BADRETURN) Mensaje: RETURN is only allowed in a FUNCTION Error: 1314 SQLSTATE: 0A000 (ER_SP_BADSTATEMENT) Mensaje: %s is not allowed in stored procedures Error: 1315 SQLSTATE: 42000 (ER_UPDATE_LOG_DEPRECATED_IGNORED) Mensaje: The update log is deprecated and replaced by the binary log; SET SQL_LOG_UPDATE has been ignored Error: 1316 SQLSTATE: 42000 (ER_UPDATE_LOG_DEPRECATED_TRANSLATED) Mensaje: The update log is deprecated and replaced by the binary log; SET SQL_LOG_UPDATE has been translated to SET SQL_LOG_BIN Error: 1317 SQLSTATE: 70100 (ER_QUERY_INTERRUPTED) Mensaje: Query execution was interrupted Error: 1318 SQLSTATE: 42000 (ER_SP_WRONG_NO_OF_ARGS) Mensaje: Incorrect number of arguments for %s %s; expected %u, got %u Error: 1319 SQLSTATE: 42000 (ER_SP_COND_MISMATCH) Mensaje: Undefined CONDITION: %s Error: 1320 SQLSTATE: 42000 (ER_SP_NORETURN) Mensaje: No RETURN found in FUNCTION %s Error: 1321 SQLSTATE: 2F005 (ER_SP_NORETURNEND) Mensaje: FUNCTION %s ended without RETURN Error: 1322 SQLSTATE: 42000 (ER_SP_BAD_CURSOR_QUERY) Mensaje: Cursor statement must be a SELECT Error: 1323 SQLSTATE: 42000 (ER_SP_BAD_CURSOR_SELECT) Mensaje: Cursor SELECT must not have INTO
1427
Error: 1324 SQLSTATE: 42000 (ER_SP_CURSOR_MISMATCH) Mensaje: Undefined CURSOR: %s Error: 1325 SQLSTATE: 24000 (ER_SP_CURSOR_ALREADY_OPEN) Mensaje: Cursor is already open Error: 1326 SQLSTATE: 24000 (ER_SP_CURSOR_NOT_OPEN) Mensaje: Cursor is not open Error: 1327 SQLSTATE: 42000 (ER_SP_UNDECLARED_VAR) Mensaje: Undeclared variable: %s Error: 1328 SQLSTATE: HY000 (ER_SP_WRONG_NO_OF_FETCH_ARGS) Mensaje: Incorrect number of FETCH variables Error: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA) Mensaje: No data - zero rows fetched, selected, or processed Error: 1330 SQLSTATE: 42000 (ER_SP_DUP_PARAM) Mensaje: Duplicate parameter: %s Error: 1331 SQLSTATE: 42000 (ER_SP_DUP_VAR) Mensaje: Duplicate variable: %s Error: 1332 SQLSTATE: 42000 (ER_SP_DUP_COND) Mensaje: Duplicate condition: %s Error: 1333 SQLSTATE: 42000 (ER_SP_DUP_CURS) Mensaje: Duplicate cursor: %s Error: 1334 SQLSTATE: HY000 (ER_SP_CANT_ALTER) Mensaje: Failed to ALTER %s %s Error: 1335 SQLSTATE: 0A000 (ER_SP_SUBSELECT_NYI) Mensaje: Subselect value not supported Error: 1336 SQLSTATE: 0A000 (ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG) Mensaje: %s is not allowed in stored function or trigger Error: 1337 SQLSTATE: 42000 (ER_SP_VARCOND_AFTER_CURSHNDLR) Mensaje: Variable or condition declaration after cursor or handler declaration Error: 1338 SQLSTATE: 42000 (ER_SP_CURSOR_AFTER_HANDLER) Mensaje: Cursor declaration after handler declaration Error: 1339 SQLSTATE: 20000 (ER_SP_CASE_NOT_FOUND) Mensaje: Case not found for CASE statement Error: 1340 SQLSTATE: HY000 (ER_FPARSER_TOO_BIG_FILE)
1428
Mensaje: Configuration file '%s' is too big Error: 1341 SQLSTATE: HY000 (ER_FPARSER_BAD_HEADER) Mensaje: Malformed file type header in file '%s' Error: 1342 SQLSTATE: HY000 (ER_FPARSER_EOF_IN_COMMENT) Mensaje: Unexpected end of file while parsing comment '%s' Error: 1343 SQLSTATE: HY000 (ER_FPARSER_ERROR_IN_PARAMETER) Mensaje: Error while parsing parameter '%s' (line: '%s') Error: 1344 SQLSTATE: HY000 (ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER) Mensaje: Unexpected end of file while skipping unknown parameter '%s' Error: 1345 SQLSTATE: HY000 (ER_VIEW_NO_EXPLAIN) Mensaje: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table Error: 1346 SQLSTATE: HY000 (ER_FRM_UNKNOWN_TYPE) Mensaje: File '%s' has unknown type '%s' in its header Error: 1347 SQLSTATE: HY000 (ER_WRONG_OBJECT) Mensaje: '%s.%s' is not %s Error: 1348 SQLSTATE: HY000 (ER_NONUPDATEABLE_COLUMN) Mensaje: Column '%s' is not updatable Error: 1349 SQLSTATE: HY000 (ER_VIEW_SELECT_DERIVED) Mensaje: View's SELECT contains a subquery in the FROM clause Error: 1350 SQLSTATE: HY000 (ER_VIEW_SELECT_CLAUSE) Mensaje: View's SELECT contains a '%s' clause Error: 1351 SQLSTATE: HY000 (ER_VIEW_SELECT_VARIABLE) Mensaje: View's SELECT contains a variable or parameter Error: 1352 SQLSTATE: HY000 (ER_VIEW_SELECT_TMPTABLE) Mensaje: View's SELECT refers to a temporary table '%s' Error: 1353 SQLSTATE: HY000 (ER_VIEW_WRONG_LIST) Mensaje: View's SELECT and view's field list have different column counts Error: 1354 SQLSTATE: HY000 (ER_WARN_VIEW_MERGE) Mensaje: View merge algorithm can't be used here for now (assumed undefined algorithm) Error: 1355 SQLSTATE: HY000 (ER_WARN_VIEW_WITHOUT_KEY) Mensaje: View being updated does not have complete key of underlying table in it Error: 1356 SQLSTATE: HY000 (ER_VIEW_INVALID)
1429
Mensaje: View '%s.%s' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them Error: 1357 SQLSTATE: HY000 (ER_SP_NO_DROP_SP) Mensaje: Can't drop or alter a %s from within another stored routine Error: 1358 SQLSTATE: HY000 (ER_SP_GOTO_IN_HNDLR) Mensaje: GOTO is not allowed in a stored procedure handler Error: 1359 SQLSTATE: HY000 (ER_TRG_ALREADY_EXISTS) Mensaje: Trigger already exists Error: 1360 SQLSTATE: HY000 (ER_TRG_DOES_NOT_EXIST) Mensaje: Trigger does not exist Error: 1361 SQLSTATE: HY000 (ER_TRG_ON_VIEW_OR_TEMP_TABLE) Mensaje: Trigger's '%s' is view or temporary table Error: 1362 SQLSTATE: HY000 (ER_TRG_CANT_CHANGE_ROW) Mensaje: Updating of %s row is not allowed in %strigger Error: 1363 SQLSTATE: HY000 (ER_TRG_NO_SUCH_ROW_IN_TRG) Mensaje: There is no %s row in %s trigger Error: 1364 SQLSTATE: HY000 (ER_NO_DEFAULT_FOR_FIELD) Mensaje: Field '%s' doesn't have a default value Error: 1365 SQLSTATE: 22012 (ER_DIVISION_BY_ZERO) Mensaje: Division by 0 Error: 1366 SQLSTATE: HY000 (ER_TRUNCATED_WRONG_VALUE_FOR_FIELD) Mensaje: Incorrect %s value: '%s' for column '%s' at row %ld Error: 1367 SQLSTATE: 22007 (ER_ILLEGAL_VALUE_FOR_TYPE) Mensaje: Illegal %s '%s' value found during parsing Error: 1368 SQLSTATE: HY000 (ER_VIEW_NONUPD_CHECK) Mensaje: CHECK OPTION on non-updatable view '%s.%s' Error: 1369 SQLSTATE: HY000 (ER_VIEW_CHECK_FAILED) Mensaje: CHECK OPTION failed '%s.%s' Error: 1370 SQLSTATE: 42000 (ER_PROCACCESS_DENIED_ERROR) Mensaje: %s command denied to user '%s'@'%s' for routine '%s' Error: 1371 SQLSTATE: HY000 (ER_RELAY_LOG_FAIL) Mensaje: Failed purging old relay logs: %s Error: 1372 SQLSTATE: HY000 (ER_PASSWD_LENGTH)
1430
Mensaje: Password hash should be a %d-digit hexadecimal number Error: 1373 SQLSTATE: HY000 (ER_UNKNOWN_TARGET_BINLOG) Mensaje: Target log not found in binlog index Error: 1374 SQLSTATE: HY000 (ER_IO_ERR_LOG_INDEX_READ) Mensaje: I/O error reading log index file Error: 1375 SQLSTATE: HY000 (ER_BINLOG_PURGE_PROHIBITED) Mensaje: Server configuration does not permit binlog purge Error: 1376 SQLSTATE: HY000 (ER_FSEEK_FAIL) Mensaje: Failed on fseek() Error: 1377 SQLSTATE: HY000 (ER_BINLOG_PURGE_FATAL_ERR) Mensaje: Fatal error during log purge Error: 1378 SQLSTATE: HY000 (ER_LOG_IN_USE) Mensaje: A purgeable log is in use, will not purge Error: 1379 SQLSTATE: HY000 (ER_LOG_PURGE_UNKNOWN_ERR) Mensaje: Unknown error during log purge Error: 1380 SQLSTATE: HY000 (ER_RELAY_LOG_INIT) Mensaje: Failed initializing relay log position: %s Error: 1381 SQLSTATE: HY000 (ER_NO_BINARY_LOGGING) Mensaje: You are not using binary logging Error: 1382 SQLSTATE: HY000 (ER_RESERVED_SYNTAX) Mensaje: The '%s' syntax is reserved for purposes internal to the MySQL server Error: 1383 SQLSTATE: HY000 (ER_WSAS_FAILED) Mensaje: WSAStartup Failed Error: 1384 SQLSTATE: HY000 (ER_DIFF_GROUPS_PROC) Mensaje: Can't handle procedures with different groups yet Error: 1385 SQLSTATE: HY000 (ER_NO_GROUP_FOR_PROC) Mensaje: Select must have a group with this procedure Error: 1386 SQLSTATE: HY000 (ER_ORDER_WITH_PROC) Mensaje: Can't use ORDER clause with this procedure Error: 1387 SQLSTATE: HY000 (ER_LOGGING_PROHIBIT_CHANGING_OF) Mensaje: Binary logging and replication forbid changing the global server %s Error: 1388 SQLSTATE: HY000 (ER_NO_FILE_MAPPING)
1431
Mensaje: Can't map file: %s, errno: %d Error: 1389 SQLSTATE: HY000 (ER_WRONG_MAGIC) Mensaje: Wrong magic in %s Error: 1390 SQLSTATE: HY000 (ER_PS_MANY_PARAM) Mensaje: Prepared statement contains too many placeholders Error: 1391 SQLSTATE: HY000 (ER_KEY_PART_0) Mensaje: Key part '%s' length cannot be 0 Error: 1392 SQLSTATE: HY000 (ER_VIEW_CHECKSUM) Mensaje: View text checksum failed Error: 1393 SQLSTATE: HY000 (ER_VIEW_MULTIUPDATE) Mensaje: Can not modify more than one base table through a join view '%s.%s' Error: 1394 SQLSTATE: HY000 (ER_VIEW_NO_INSERT_FIELD_LIST) Mensaje: Can not insert into join view '%s.%s' without fields list Error: 1395 SQLSTATE: HY000 (ER_VIEW_DELETE_MERGE_VIEW) Mensaje: Can not delete from join view '%s.%s' Error: 1396 SQLSTATE: HY000 (ER_CANNOT_USER) Mensaje: Operation %s failed for %s Error: 1397 SQLSTATE: XAE04 (ER_XAER_NOTA) Mensaje: XAER_NOTA: Unknown XID Error: 1398 SQLSTATE: XAE05 (ER_XAER_INVAL) Mensaje: XAER_INVAL: Invalid arguments (or unsupported command) Error: 1399 SQLSTATE: XAE07 (ER_XAER_RMFAIL) Mensaje: XAER_RMFAIL: The command cannot be executed when global transaction is in the %s state Error: 1400 SQLSTATE: XAE09 (ER_XAER_OUTSIDE) Mensaje: XAER_OUTSIDE: Some work is done outside global transaction Error: 1401 SQLSTATE: XAE03 (ER_XAER_RMERR) Mensaje: XAER_RMERR: Fatal error occurred in the transaction branch - check your data for consistency Error: 1402 SQLSTATE: XA100 (ER_XA_RBROLLBACK) Mensaje: XA_RBROLLBACK: Transaction branch was rolled back Error: 1403 SQLSTATE: 42000 (ER_NONEXISTING_PROC_GRANT) Mensaje: There is no such grant defined for user '%s' on host '%s' on routine '%s'
1432
Error: 1404 SQLSTATE: HY000 (ER_PROC_AUTO_GRANT_FAIL) Mensaje: Failed to grant EXECUTE and ALTER ROUTINE privileges Error: 1405 SQLSTATE: HY000 (ER_PROC_AUTO_REVOKE_FAIL) Mensaje: Failed to revoke all privileges to dropped routine Error: 1406 SQLSTATE: 22001 (ER_DATA_TOO_LONG) Mensaje: Data too long for column '%s' at row %ld Error: 1407 SQLSTATE: 42000 (ER_SP_BAD_SQLSTATE) Mensaje: Bad SQLSTATE: '%s' Error: 1408 SQLSTATE: HY000 (ER_STARTUP) Mensaje: %s: ready for connections. Version: '%s' socket: '%s' port: %d %s Error: 1409 SQLSTATE: HY000 (ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR) Mensaje: Can't load value from file with fixed size rows to variable Error: 1410 SQLSTATE: 42000 (ER_CANT_CREATE_USER_WITH_GRANT) Mensaje: You are not allowed to create a user with GRANT Error: 1411 SQLSTATE: HY000 (ER_WRONG_VALUE_FOR_TYPE) Mensaje: Incorrect %s value: '%s' for function %s Error: 1412 SQLSTATE: HY000 (ER_TABLE_DEF_CHANGED) Mensaje: Table definition has changed, please retry transaction Error: 1413 SQLSTATE: 42000 (ER_SP_DUP_HANDLER) Mensaje: Duplicate handler declared in the same block Error: 1414 SQLSTATE: 42000 (ER_SP_NOT_VAR_ARG) Mensaje: OUT or INOUT argument %d for routine %s is not a variable or NEW pseudo-variable in BEFORE trigger Error: 1415 SQLSTATE: 0A000 (ER_SP_NO_RETSET) Mensaje: Not allowed to return a result set from a %s Error: 1416 SQLSTATE: 22003 (ER_CANT_CREATE_GEOMETRY_OBJECT) Mensaje: Cannot get geometry object from data you send to the GEOMETRY field Error: 1417 SQLSTATE: HY000 (ER_FAILED_ROUTINE_BREAK_BINLOG) Mensaje: 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 Error: 1418 SQLSTATE: HY000 (ER_BINLOG_UNSAFE_ROUTINE) Mensaje: 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)
1433
Error: 1419 SQLSTATE: HY000 (ER_BINLOG_CREATE_ROUTINE_NEED_SUPER) Mensaje: 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) Error: 1420 SQLSTATE: HY000 (ER_EXEC_STMT_WITH_OPEN_CURSOR) Mensaje: You can't execute a prepared statement which has an open cursor associated with it. Reset the statement to re-execute it. Error: 1421 SQLSTATE: HY000 (ER_STMT_HAS_NO_OPEN_CURSOR) Mensaje: The statement (%lu) has no open cursor. Error: 1422 SQLSTATE: HY000 (ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG) Mensaje: Explicit or implicit commit is not allowed in stored function or trigger. Error: 1423 SQLSTATE: HY000 (ER_NO_DEFAULT_FOR_VIEW_FIELD) Mensaje: Field of view '%s.%s' underlying table doesn't have a default value Error: 1424 SQLSTATE: HY000 (ER_SP_NO_RECURSION) Mensaje: Recursive stored functions and triggers are not allowed. Error: 1425 SQLSTATE: 42000 (ER_TOO_BIG_SCALE) Mensaje: Too big scale %lu specified for column '%s'. Maximum is %d. Error: 1426 SQLSTATE: 42000 (ER_TOO_BIG_PRECISION) Mensaje: Too big precision %lu specified for column '%s'. Maximum is %lu. Error: 1427 SQLSTATE: 42000 (ER_M_BIGGER_THAN_D) Mensaje: For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '%s'). Error: 1428 SQLSTATE: HY000 (ER_WRONG_LOCK_OF_SYSTEM_TABLE) Mensaje: You can't combine write-locking of system '%s.%s' table with other tables Error: 1429 SQLSTATE: HY000 (ER_CONNECT_TO_FOREIGN_DATA_SOURCE) Mensaje: Unable to connect to foreign data source: %s Error: 1430 SQLSTATE: HY000 (ER_QUERY_ON_FOREIGN_DATA_SOURCE) Mensaje: There was a problem processing the query on the foreign data source. Data source error: %s Error: 1431 SQLSTATE: HY000 (ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST) Mensaje: The foreign data source you are trying to reference does not exist. Data source error: %s Error: 1432 SQLSTATE: HY000 (ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE) Mensaje: Can't create federated table. The data source connection string '%s' is not in the correct format Error: 1433 SQLSTATE: HY000 (ER_FOREIGN_DATA_STRING_INVALID) Mensaje: The data source connection string '%s' is not in the correct format
1434
Error: 1434 SQLSTATE: HY000 (ER_CANT_CREATE_FEDERATED_TABLE) Mensaje: Can't create federated table. Foreign data src error: %s Error: 1435 SQLSTATE: HY000 (ER_TRG_IN_WRONG_SCHEMA) Mensaje: Trigger in wrong schema Error: 1436 SQLSTATE: HY000 (ER_STACK_OVERRUN_NEED_MORE) Mensaje: 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. Error: 1437 SQLSTATE: 42000 (ER_TOO_LONG_BODY) Mensaje: Routine body for '%s' is too long Error: 1438 SQLSTATE: HY000 (ER_WARN_CANT_DROP_DEFAULT_KEYCACHE) Mensaje: Cannot drop default keycache Error: 1439 SQLSTATE: 42000 (ER_TOO_BIG_DISPLAYWIDTH) Mensaje: Display width out of range for column '%s' (max = %lu) Error: 1440 SQLSTATE: XAE08 (ER_XAER_DUPID) Mensaje: XAER_DUPID: The XID already exists Error: 1441 SQLSTATE: 22008 (ER_DATETIME_FUNCTION_OVERFLOW) Mensaje: Datetime function: %s field overflow Error: 1442 SQLSTATE: HY000 (ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG) Mensaje: Can't update table '%s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. Error: 1443 SQLSTATE: HY000 (ER_VIEW_PREVENT_UPDATE) Mensaje: The definition of table '%s' prevents operation %s on table '%s'. Error: 1444 SQLSTATE: HY000 (ER_PS_NO_RECURSION) Mensaje: 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 Error: 1445 SQLSTATE: HY000 (ER_SP_CANT_SET_AUTOCOMMIT) Mensaje: Not allowed to set autocommit from a stored function or trigger Error: 1446 SQLSTATE: HY000 (ER_MALFORMED_DEFINER) Mensaje: Definer is not fully qualified Error: 1447 SQLSTATE: HY000 (ER_VIEW_FRM_NO_USER) Mensaje: View '%s'.'%s' has no definer information (old table format). Current user is used as definer. Please recreate the view! Error: 1448 SQLSTATE: HY000 (ER_VIEW_OTHER_USER) Mensaje: You need the SUPER privilege for creation view with '%s'@'%s' definer
1435
Error: 1449 SQLSTATE: HY000 (ER_NO_SUCH_USER) Mensaje: There is no '%s'@'%s' registered Error: 1450 SQLSTATE: HY000 (ER_FORBID_SCHEMA_CHANGE) Mensaje: Changing schema from '%s' to '%s' is not allowed. Error: 1451 SQLSTATE: 23000 (ER_ROW_IS_REFERENCED_2) Mensaje: Cannot delete or update a parent row: a foreign key constraint fails (%s) Error: 1452 SQLSTATE: 23000 (ER_NO_REFERENCED_ROW_2) Mensaje: Cannot add or update a child row: a foreign key constraint fails (%s) Error: 1453 SQLSTATE: 42000 (ER_SP_BAD_VAR_SHADOW) Mensaje: Variable '%s' must be quoted with `...`, or renamed Error: 1454 SQLSTATE: HY000 (ER_TRG_NO_DEFINER) Mensaje: 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. Error: 1455 SQLSTATE: HY000 (ER_OLD_FILE_FORMAT) Mensaje: '%s' has an old format, you should re-create the '%s' object(s) Error: 1456 SQLSTATE: HY000 (ER_SP_RECURSION_LIMIT) Mensaje: Recursive limit %d (as set by the max_sp_recursion_depth variable) was exceeded for routine %s Error: 1457 SQLSTATE: HY000 (ER_SP_PROC_TABLE_CORRUPT) Mensaje: Failed to load routine %s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d) Error: 1458 SQLSTATE: 42000 (ER_SP_WRONG_NAME) Mensaje: Incorrect routine name '%s' Error: 1459 SQLSTATE: HY000 (ER_TABLE_NEEDS_UPGRADE) Mensaje: Table upgrade required. Please do "REPAIR TABLE `%s`" to fix it! Error: 1460 SQLSTATE: 42000 (ER_SP_NO_AGGREGATE) Mensaje: AGGREGATE is not supported for stored functions Error: 1461 SQLSTATE: 42000 (ER_MAX_PREPARED_STMT_COUNT_REACHED) Mensaje: Can't create more than max_prepared_stmt_count statements (current value: %lu) Error: 1462 SQLSTATE: HY000 (ER_VIEW_RECURSIVE) Mensaje: `%s`.`%s` contains view recursion Error: 1463 SQLSTATE: 42000 (ER_NON_GROUPING_FIELD_USED) Mensaje: non-grouping field '%s' is used in %s clause Error: 1464 SQLSTATE: HY000 (ER_TABLE_CANT_HANDLE_SPKEYS)
1436
Mensaje: The used table type doesn't support SPATIAL indexes Error: 1465 SQLSTATE: HY000 (ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA) Mensaje: Triggers can not be created on system tables Error: 1466 SQLSTATE: HY000 (ER_REMOVED_SPACES) Mensaje: Leading spaces are removed from name '%s' Error: 1467 SQLSTATE: HY000 (ER_AUTOINC_READ_FAILED) Mensaje: Failed to read auto-increment value from storage engine Error: 1468 SQLSTATE: HY000 (ER_USERNAME) Mensaje: user name Error: 1469 SQLSTATE: HY000 (ER_HOSTNAME) Mensaje: host name Error: 1470 SQLSTATE: HY000 (ER_WRONG_STRING_LENGTH) Mensaje: String '%s' is too long for %s (should be no longer than %d) Error: 1471 SQLSTATE: HY000 (ER_NON_INSERTABLE_TABLE) Mensaje: The target table %s of the %s is not insertable-into Error: 1472 SQLSTATE: HY000 (ER_ADMIN_WRONG_MRG_TABLE) Mensaje: Table '%s' is differently defined or of non-MyISAM type or doesn't exist Error: 1473 SQLSTATE: HY000 (ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT) Mensaje: Too high level of nesting for select Error: 1474 SQLSTATE: HY000 (ER_NAME_BECOMES_EMPTY) Mensaje: Name '%s' has become '' Error: 1475 SQLSTATE: HY000 (ER_AMBIGUOUS_FIELD_TERM) Mensaje: First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY Error: 1476 SQLSTATE: HY000 (ER_LOAD_DATA_INVALID_COLUMN) Mensaje: Invalid column reference (%s) in LOAD DATA Error: 1477 SQLSTATE: HY000 (ER_LOG_PURGE_NO_FILE) Mensaje: Being purged log %s was not found Error: 1478 SQLSTATE: XA106 (ER_XA_RBTIMEOUT) Mensaje: XA_RBTIMEOUT: Transaction branch was rolled back: took too long Error: 1479 SQLSTATE: XA102 (ER_XA_RBDEADLOCK) Mensaje: XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected Error: 1480 SQLSTATE: HY000 (ER_TOO_MANY_CONCURRENT_TRXS)
1437
Mensaje: Too many active concurrent transactions La informacin de error de cliente proviene de los siguientes ficheros: Los valores de Error y los smbolos en parntesis se corresponden a las definiciones en el fichero fuente MySQL include/errmsg.h . Los valores de Mensaje se corresponden con los mensajes de error que se listan en el fichero libmysql/errmsg.c . %d y %s representan nmeros y cadenas de caracteres, respectivamente, que se substituyen en los mensajes cuando se muestran. Como las actualizaciones son frecuentes, es posible que estos ficheros contengan informacin de error adicional que no est listada aqu. Error: 2000 (CR_UNKNOWN_ERROR) Mensaje: Unknown MySQL error Error: 2001 (CR_SOCKET_CREATE_ERROR) Mensaje: Can't create UNIX socket (%d) Error: 2002 (CR_CONNECTION_ERROR) Mensaje: Can't connect to local MySQL server through socket '%s' (%d) Error: 2003 (CR_CONN_HOST_ERROR) Mensaje: Can't connect to MySQL server on '%s' (%d) Error: 2004 (CR_IPSOCK_ERROR) Mensaje: Can't create TCP/IP socket (%d) Error: 2005 (CR_UNKNOWN_HOST) Mensaje: Unknown MySQL server host '%s' (%d) Error: 2006 (CR_SERVER_GONE_ERROR) Mensaje: MySQL server has gone away Error: 2007 (CR_VERSION_ERROR) Mensaje: Protocol mismatch; server version = %d, client version = %d Error: 2008 (CR_OUT_OF_MEMORY) Mensaje: MySQL client ran out of memory Error: 2009 (CR_WRONG_HOST_INFO) Mensaje: Wrong host info Error: 2010 (CR_LOCALHOST_CONNECTION) Mensaje: Localhost via UNIX socket Error: 2011 (CR_TCP_CONNECTION) Mensaje: %s via TCP/IP Error: 2012 (CR_SERVER_HANDSHAKE_ERR)
1438
Mensaje: Error in server handshake Error: 2013 (CR_SERVER_LOST) Mensaje: Lost connection to MySQL server during query Error: 2014 (CR_COMMANDS_OUT_OF_SYNC) Mensaje: Commands out of sync; you can't run this command now Error: 2015 (CR_NAMEDPIPE_CONNECTION) Mensaje: Named pipe: %s Error: 2016 (CR_NAMEDPIPEWAIT_ERROR) Mensaje: Can't wait for named pipe to host: %s pipe: %s (%lu) Error: 2017 (CR_NAMEDPIPEOPEN_ERROR) Mensaje: Can't open named pipe to host: %s pipe: %s (%lu) Error: 2018 (CR_NAMEDPIPESETSTATE_ERROR) Mensaje: Can't set state of named pipe to host: %s pipe: %s (%lu) Error: 2019 (CR_CANT_READ_CHARSET) Mensaje: Can't initialize character set %s (path: %s) Error: 2020 (CR_NET_PACKET_TOO_LARGE) Mensaje: Got packet bigger than 'max_allowed_packet' bytes Error: 2021 (CR_EMBEDDED_CONNECTION) Mensaje: Embedded server Error: 2022 (CR_PROBE_SLAVE_STATUS) Mensaje: Error on SHOW SLAVE STATUS: Error: 2023 (CR_PROBE_SLAVE_HOSTS) Mensaje: Error on SHOW SLAVE HOSTS: Error: 2024 (CR_PROBE_SLAVE_CONNECT) Mensaje: Error connecting to slave: Error: 2025 (CR_PROBE_MASTER_CONNECT) Mensaje: Error connecting to master: Error: 2026 (CR_SSL_CONNECTION_ERROR) Mensaje: SSL connection error Error: 2027 (CR_MALFORMED_PACKET) Mensaje: Malformed packet Error: 2028 (CR_WRONG_LICENSE)
1439
Mensaje: This client library is licensed only for use with MySQL servers having '%s' license Error: 2029 (CR_NULL_POINTER) Mensaje: Invalid use of null pointer Error: 2030 (CR_NO_PREPARE_STMT) Mensaje: Statement not prepared Error: 2031 (CR_PARAMS_NOT_BOUND) Mensaje: No data supplied for parameters in prepared statement Error: 2032 (CR_DATA_TRUNCATED) Mensaje: Data truncated Error: 2033 (CR_NO_PARAMETERS_EXISTS) Mensaje: No parameters exist in the statement Error: 2034 (CR_INVALID_PARAMETER_NO) Mensaje: Invalid parameter number Error: 2035 (CR_INVALID_BUFFER_USE) Mensaje: Can't send long data for non-string/non-binary data types (parameter: %d) Error: 2036 (CR_UNSUPPORTED_PARAM_TYPE) Mensaje: Using unsupported buffer type: %d (parameter: %d) Error: 2037 (CR_SHARED_MEMORY_CONNECTION) Mensaje: Shared memory: %s Error: 2038 (CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR) Mensaje: Can't open shared memory; client could not create request event (%lu) Error: 2039 (CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR) Mensaje: Can't open shared memory; no answer event received from server (%lu) Error: 2040 (CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR) Mensaje: Can't open shared memory; server could not allocate file mapping (%lu) Error: 2041 (CR_SHARED_MEMORY_CONNECT_MAP_ERROR) Mensaje: Can't open shared memory; server could not get pointer to file mapping (%lu) Error: 2042 (CR_SHARED_MEMORY_FILE_MAP_ERROR) Mensaje: Can't open shared memory; client could not allocate file mapping (%lu) Error: 2043 (CR_SHARED_MEMORY_MAP_ERROR) Mensaje: Can't open shared memory; client could not get pointer to file mapping (%lu) Error: 2044 (CR_SHARED_MEMORY_EVENT_ERROR)
1440
Mensaje: Can't open shared memory; client could not create %s event (%lu) Error: 2045 (CR_SHARED_MEMORY_CONNECT_ABANDONED_ERROR) Mensaje: Can't open shared memory; no answer from server (%lu) Error: 2046 (CR_SHARED_MEMORY_CONNECT_SET_ERROR) Mensaje: Can't open shared memory; cannot send request event to server (%lu) Error: 2047 (CR_CONN_UNKNOW_PROTOCOL) Mensaje: Wrong or unknown protocol Error: 2048 (CR_INVALID_CONN_HANDLE) Mensaje: Invalid connection handle Error: 2049 (CR_SECURE_AUTH) Mensaje: Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled) Error: 2050 (CR_FETCH_CANCELED) Mensaje: Row retrieval was canceled by mysql_stmt_close() call Error: 2051 (CR_NO_DATA) Mensaje: Attempt to read column without prior row fetch Error: 2052 (CR_NO_STMT_METADATA) Mensaje: Prepared statement contains no metadata Error: 2053 (CR_NO_RESULT_SET) Mensaje: Attempt to read a row while there is no result set associated with the statement Error: 2054 (CR_NOT_IMPLEMENTED) Mensaje: This feature is not implemented yet Error: 2055 (CR_SERVER_LOST_EXTENDED) Mensaje: Lost connection to MySQL server at '%s', system error: %d
1441
1442
1443
1444
quiere puede usar od -c para asegurarse que su editor de texto no ha desbaratado nada durante la edicin. Esperamos que nunca tenga que editar la salida de mysqltest -r ya que slo tiene que hacerlo al encontrar un bug. Para ser consistente con nuestra inicializacin, debe poner sus ficheros resultantes en el directorio mysql-test/r y llamarlos test_name.result. Si el test produce ms de un resultado, debe usar test_name.a.result, test_name.b.result, etc. Si un comando retorna un error, debe especificarlo con --error error-number en la lnea anterior al comando. El nmero de error puede ser una lista de nmeros de error posibles separados por ','. Si est escribiendo un caso de test de replicacin, debe poner en la primera lnea del fichero de test, source include/master-slave.inc;. Para cambiar entre maestro y esclavo, use connection master; y connection slave;. Si necesita hacer algo en una conexin alternativa, puede hacer connection master1; para el maestro, y connection slave1; para el esclavo. Si necesita hacer algo en un bucle, puede usar algo como esto:
let $1=1000; while ($1) { # do your queries here dec $1; }
Para dormir entre consultas, use el comando sleep. Soporta fracciones de segundo, as que puede usar sleep 1.3;, por ejemplo, para dormir 1.3 segundos. Para ejecutar el esclavo con opciones adicionales para sus casos de test, pngalos en el formato de lnea de comandos en mysql-test/t/test_name-slave.opt. Para el maestro, pngalas en mysql-test/t/test_name-master.opt. Si tiene una pregunta sobre la suite de test, o tiene un caso de test al que contribuir, enve un email a la lista de correo MySQL internals . Consulte Seccin 1.6.1.1, Las listas de correo de MySQL. Como esta lista no acepta adjuntos, debe subir por ftp todos los ficheros relevantes a: ftp:// ftp.mysql.com/pub/mysql/upload/
Si esto falla, debe configurar MySQL con --with-debug y ejecutar mysql-test-run con la opcin --debug . Si tambin falla enve el fichero de traza var/tmp/master.trace a ftp:// ftp.mysql.com/pub/mysql/upload/ para que podamos examinarlo. Por favor recuerde de incluir una descripcin completa de su sistema, la versin del binario mysqld y cmo lo compil. Tambin intente ejecutar mysql-test-run con la opcin --force para ver si hay algn otro test que falla. 1445
Si ha compilado MySQL usted mismo, chequee nuestro manual para ver cmo compilar MySQL en su plataforma, o preferiblemente, usar uno de los binarios que hemos compilado en http:// dev.mysql.com/downloads/. Todos nuestros binarios estndar deben pasar la suite de tests! Si obtiene un error como Result length mismatch o Result content mismatch significa que la salida del test no coincide exactamente con la salida esperada. Este puede ser un bug en MySQL o que su versin de mysqld produce resultados ligeramente distintos bajo algunas circunstancias. Los resultados de tests fallidos se ponen en un fichero con el mismo nombre base que el fichero de resultados con la extensin .reject . Si su caso de test falla, debe hacer un diff entre los dos ficheros. Si no puede ver en qu se distinguen, exemine ambos con od -c y compruebe los tamaos. Si un test falla completamente, debe chequear los ficheros de logs en el directorio mysql-test/ var/log para ayudas sobre qu ha fallado. Si ha compilado MySQL con depuracin puede intentar depurarlo ejecutando mysql-test-run con las opciones --gdb y/o --debug . Consulte Seccin D.1.2, Crear ficheros de traza. Si no ha compilado MySQL para depuracin debera hacerlo. Especifique la opcin --with-debug en configure. Consulte Seccin 2.8, Instalacin de MySQL usando una distribucin de cdigo fuente.
1446
Para cdigo fuente de ejemplo que ilustra cmo escribir UDFs, mire el fichero sql/udf_example.cc que se proporciona en las distribuciones fuentes de MySQL.
Una funciones definidas por el usuario (UDF) es un modo de extender MySQL con una nueva funcin que funciona como una funcin nativa de MySQL tal como ABS() o CONCAT(). function_name es el nombre que debe usarse en comandos SQL para invocar la funcin. La clusula RETURNS indica el tipo del valor de retorno de la funcin. shared_library_name es el nombre base de la fichero del objeto compartido que contiene el cdigo que implementa la funcin. El fichero debe localizarse en un directorio en el que busque el lincador dinmico del sistema. Para crear una funcin , debe tener el privilegio INSERT para la base de datos mysql . Para borrar una funcin, debe tener el privilegio DELETE para la base de datos mysql . Esto es as porque CREATE FUNCTION aade un registro a la tabla de sistema mysql.func que registra los nombres de funcin, tipo, y nombre de la biblioteca compartida, y DROP FUNCTION borra el registro de la funcin de dicha tabla. Si no tiene esta tabla, debe ejecutar el script mysql_fix_privilege_tables para crearla. Consulte Seccin 2.10.2, Aumentar la versin de las tablas de privilegios. Una funcin activa es una que se ha cargado con CREATE FUNCTION y no se ha eliminado con DROP FUNCTION. Todas las funciones activas se recargan cada vez que el servidor arranca, a no ser que arranque mysqld con la opcin --skip-grant-tables . En este caso, la inicializacin de UDF no se hace y no estn disponibles. Para instrucciones sobre escribir funciones definidas por el usuario consulte Seccin 27.2.3, Aadir una nueva funcin definida por el usuario. Para que funcione el mecanismo de UDF, las funciones deben escribirse en C o C++, su sistema operativo debe soportar carga dinmica y debe haber compilado mysqld dinmicamente (no estticamente). AGGREGATE es una nueva opcin para MySQL 3.23. Una funcin AGGREGATE funciona exactamente como una funcin agregada (resumen) de MySQL tal como SUM o COUNT(). Para que funcione AGGREGATE , su tabla mysql.func debe contener una columna type . Si su tabla mysql.func no tiene esta columna, debe ejecutar el script mysql_fix_privilege_tables para crearla.
1447
udf_example.cc que define 5 nuevas funciones. Consulte este fichero para ver cmo funcionan las convenciones de llamadas de UDF. Para poder usar UDFs, necesita lincar mysqld dinmicamente. No configure MySQL usando --with-mysqld-ldflags=-all-static. Si quiere usar una UDF que necesite acceder a smbolos desde mysqld (por ejemplo la funcin metaphone en sql/udf_example.cc que usa default_charset_info), debe lincar el programa con -rdynamic (consulte man dlopen). Si planea usar UDFs, la rula es configurar MySQL con --with-mysqld-ldflags=-rdynamic a no ser que tenga una muy buena razn para no hacerlo. Si usa una distribucin precompilada de MySQL, use MySQL-Max, que contiene un servidor lincado dinmicamente que soporta carga dinmica. Para cada funcin que quiera usar en comandos SQL, debe definir las funciones correspondientes en C (o C++). En la siguiente discusin, el nombre xxx se usa como nombre de funcin de ejemplo. Para distinguir entre el uso de SQL y C/C++ , XXX() (maysculas) indicata una llamada de funcin SQL, xxx() (minsculas) indica una llamada de funcin C/C++ . Las funciones C/C++ que escribe para implementar la interfaz para XXX() son: xxx() (requerido) La funcin principal. Es donde el resultado de la funcin se computa. La correspondencia entre los tipos de datos de la funcin SQL y el tipo de retorno de la funcin C/C++ se muestra aqu: SQL Type STRING INTEGER REAL xxx_init() (opcional) La funcin de inicializacin para xxx(). Puede usarse para: Chequea el nmero de argumentos para XXX(). Chequea que los argumentos son de un tipo requerido o, alternativamente, le dice a MySQL que coercione argumentos a los tipos que quiera cuando se llama a la funcin principal. Reserva cualquier memoria requerida por la funcin principal. Especifica la longitud mxima del resultado. Especifica (para funciones REAL ) el mximo nmero de decimales. Especifica si el resultado puede ser NULL. xxx_deinit() (opcional) La funcin de deinicializacin para xxx(). Debe liberar cualquier memoria reservada por la funcin de inicializacin. Cuando un comando SQL invoca XXX(), MySQL llama a la funcin de inicializacin xxx_init() para que realice cualquier inicializacin necesaria, tales como chequeo de argumentos o reserva de memoria. Si xxx_init() retorna un error, el comando SQL se aborta con un mensaje de error y no se llama ni a la funcin principal ni a la de deinicializacin. En caso contrario, se llama a la funcin principal xxx() una vez para cada registro. Tras procesar todos los registros, se llama a la funcin de deinicializacin xxx_deinit() para que pueda realizar cualquier limpieza requerida. Para funciones agregadas que funcionan como SUM(), debe proporcionar las siguientes funciones: C/C++ Type char * long long double
1448
xxx_reset() (necesaria antes de 4.1.1) Resetea el valor agregado actual e inserta el argumento como valor agregado inicial para un nuevo grupo. xxx_clear() (requerido a partir de 4.1.1) Resetea el valor agregado actual pero no inserta el argumento como valor agregado inicial para un nuevo grupo. xxx_add() (requerido) Aade el argumento al valor agregado actual. MySQL trata UDFs agregados como sigue: 1. Llama a xxx_init() para permitir a la funcin agregada reservar la memoria necesaria para ordenar resultados. 2. Ordena la table segn la expresin GROUP BY. 3. Llama a xxx_clear() para el primer registro en cada grupo. 4. Llama a xxx_add() para cada nuevo registro que permita al mismo grupo. 5. Llama a xxx() para obtener el resultado del agregado cuando el grupo cambia o cuando el ltimo registro se ha procesado. 6. Repite 3-5 hasta que se procesan todos los registros 7. Llama a xxx_deinit() para permitir al UDF liberar la memoria reservada. Todas las funciones deben ser flujos seguros. Esto incluye no slo la funcin principal,tambin las funciones de inicializacin o deinicializacin, y las funciones adicionales requeridas por las funciones agregadas. Una consecuencia de esta restriccin es que no se le permite reservar ninguna variable global o esttica que cambien! Si necesita memoria, debe reservarla en xxx_init() y liberarla en xxx_deinit().
1449
El parmetro initid se pasa a las tres funciones. Apunta a la estructura UDF_INIT que se usa para comunicar informacin entre funciones. Los mienbros de la estructura UDF_INIT se muestran a continuacin. La funcin de inicializacin debe rellenar cualquier miembro que quiera cambiar. (Para usar el valor por defecto de un miembro no lo cambie.) my_bool maybe_null xxx_init() debe asignar a maybe_null 1 si xxx() puede retornar NULL. El valor por defecto es 1 si alguno de los argumentos se declaran maybe_null. unsigned int decimals El nmero de decimales. El valor por defecto es el nmero mximo de decimales en los argumentos pasados a la funcin principal. (Por ejemplo, si a la funcin se pasa 1.34, 1.345, y 1.3, el valor por defecto es 3, ya que 1.345 tiene 3 decimales. unsigned int max_length Longitud mxima del resultado. El valor por defecto max_length difiere en funcin del tipo de resultado de la funcin. Para funciones de cadenas de caracteres, el valor por defecto es el argumento ms largo. Para funciones enteras, el valor por defecto es de 21 dgitos. Para funciones reales, el valor por defecto es 13 mas el nmero de decimales indicados por initid->decimals. (Para funciones numricas, la longitud incluye cualquier signo o carcter de punto decimal.) Si quiere retornar un valor blob, puede asignar a max_length de 65KB a 16MB. Esta memoria no se reserva, pero el valor se usa para decidir qu tipo de columna usar si hay una necesidad de almacenar los datos temporalmente. char *ptr Puntero que la funcin puede usar para su propio propsito. Por ejemplo, las funciones pueden usar initid->ptr para comunicar memoria reservada entre ellos. xxx_init() debe reservar la memoria y asignarla al puntero:
initid->ptr = allocated_memory;
xxx_reset() se necesita slo antes de MySQL 4.1.1. NO se necesita usar desde MySQL 4.1.1, cuando la interfaz UDF cambi para usar xxx_clear() en su lugar. Sin embargo, puede definir xxx_reset() y xxx_clear() si quiere que su UDF funcione antes y despus del cambio
1450
de interfaz. (Si no incluye ambas funciones, la funcin xxx_reset() en muchos casos puede implementarse internamente llamando xxx_clear() para resetear todas las variables, y luego llamar xxx_add() para aadir el argumento UDF_ARGS como primer valor del grupo.) xxx_clear() Esta funcin se llama cuando MySQL necesita resetear los resultados resumen. Se llama al principio para cada nuevo grupo pero slo puede llamarse para resetear los valores para una consulta donde no hubieran registros que coincidan con la bsqueda. Declare xxx_clear() como sigue:
char *xxx_clear(UDF_INIT *initid, char *is_null, char *error);
is_null se asigna para que apunte a CHAR(0) antes de llamar a xxx_clear(). Si algo falla, puede almacenar un valor en la variable a la que apunta el argumento error. error apunta a una variable de un byte, no a un bfer de cadenas de caracteres. xxx_clear() se requiere slo a partir de MySQL 4.1.1. Antes de MySQL 4.1.1, use xxx_reset() en su lugar. xxx_add() Esta funcin se llama para todos los registros que pertenezcan al mismo grupo, excepto para el primer registor. Debe ussarlo para aadir el valor en el argumento UDF_ARGS a su variable de resumen interna.
char *xxx_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
La funcin xxx() para un UDF agregado debe declararse de la misma forma que UDF no agregados. Consulte Seccin 27.2.3.1, Secuencias de llamada UDF para funciones simples. Para un UDF agregado, MySQL llama a la funcin xxx() una vez que todos los registros en el grupo han sido procesados. Normalmente no debe acceder el argumento UDF_ARGS aqu sino devolver un valor basado en sus variables de resumen internas. El tratamiento de valores retornados en xxx() debe hacerse del mismo modo que para UDF no agregados. Consulte Seccin 27.2.3.4, Valores de retorno y tratamiento de errores. Las funciones xxx_reset() y xxx_add() tratan sus argumentos UDF_ARGS del mismo modo que las funciones para UDFs no agregados. Consulte Seccin 27.2.3.3, Proceso de argumentos. Los argumentos punteros de is_null y error son los mismos para todas las llamadas a xxx_reset(), xxx_clear(), xxx_add() y xxx(). Puede usar esto para recordar que obtuvo un error o si la funcin xxx() debera retornar NULL. No debe almacenar una cadena de caracteres en *error! error apunta a una variable de un byte, no a un bfer de cadenas de caracteres. *is_null se resetea para cada grupo (antes de llamar xxx_clear()). *error nunca se resetea. Si *is_null o *error se asignan cuando xxx() retorna, MySQL retorna NULL como resultado para la funcin de grupo.
1451
enum Item_result *arg_type Puntero a una matriz conteniendo los tipos para cada argumento. Los tipos posibles son STRING_RESULT, INT_RESULT, y REAL_RESULT. Par asegurar que los argumentos sean de un tipo dado y retorne un error si no lo son, chequee la matriz arg_type en la funcin de inicializacin. Por ejemplo:
if (args->arg_type[0] != STRING_RESULT || args->arg_type[1] != INT_RESULT) { strcpy(message,"XXX() requires a string and an integer"); return 1; }
Como alternativa a requerir que los argumentos de la funcin sean de un tipo particular, puede usar la funcin de inicializacin para asignar los elementos arg_type con los tipos que quiera. Esto hace que MySQL fuerce a los argumentos a los tipos para cada llamada de xxx(). Por ejemplo, para especificar que los primeros dos argumentos se fuercen a una cadena de caracteres de enteros, respectivamente, haga lo siguiente en xxx_init():
args->arg_type[0] = STRING_RESULT; args->arg_type[1] = INT_RESULT;
char **args args->args comunica informacin a la funcin de inicializacin acerca de la naturaleza general de los argumentos pasados a la funcin. Para un argumento constante i, args->args[i] apunta al valor del argumento. (Consulte a continuacin instrucciones sobre cmo acceder al valor apropiadamente.) Para argumentos no constantes, args->args[i] es 0. Un argumento constante es una expresin que usa slo constantes, como 3 o 4*7-2 o SIN(3.14). Un argumento no constante es una expresin que se refiere a valores que pueden cambiar de registro a registro, tales como nombres de columna o funciones que se llaman con argumentos no constantes. Para cada invocacin de la funcin principal, args->args contiene los argumentos que se pasan para el registro que est procesando. Las funciones pueden referirse a un argumento i como se muestra: Un argumento de tipo STRING_RESULT se da como puntero a una cadena de caracteres ms una longitud, para permitir tratar datos binarios o datos arbitrriamente largos. Los contenidos de la cadena de caracteres estn disponibles como args->args[i] y la longitud de la cadena es args->lengths[i]. No debe asumir que las cadenas de caracteres estn terminadas por null. Para un argumento de tipo INT_RESULT, debe convertir args->args[i] a un valor long long :
long long int_val; int_val = *((long long*) args->args[i]);
unsigned long *lengths Para la funcin de inicializacin, la matriz lengths indica la longitud mxima de cadena de caracteres para cada argumento. No debe cambiar este valor. Para cada invocacin de la funcin
1452
principal lengths contiene las longitudes reales de cualquier argumento de cadenas de caracteres que se pasa al registro en proceso. Para argumentos de tipos INT_RESULT o REAL_RESULT, lengths contiene la longitud mxima del argumento (como para la funcin de inicializacin).
El bffer result que se pasa a la funcin xxx() tiene longitud de 255 bytes. Si su resultado coincide con esto, no tiene que preocuparse acerca de reservar memoria para los resultados. Si su funcin de cadenas de caracteres necesita retornar una cadena de caracteres mayor a 255 bytes, debe reservar el espacio para ello con malloc() en su funcin xxx_init() o su funcin xxx() y liberarla en su funcin xxx_deinit() . Puede almacenar la memoria reservada en la entrada ptr en la estructura UDF_INIT para reusar para llamadas futuras xxx() . Consulte Seccin 27.2.3.1, Secuencias de llamada UDF para funciones simples. Para indicar un valor de retorno de NULL en la funcin principal, asigne a *is_null 1:
*is_null = 1;
Si xxx() asigna a *error 1 para cualquier registro, el valor de la funcin es NULL para el registro actual y para cualquier subsecuente registro procesado por el comando en que se invoca XXX() . (xxx() no se llama ni por registros subsecuentes.) Nota: Antes de MySQL 3.22.10, debe asignar tanto *error como *is_null:
*error = 1; *is_null = 1;
1453
sequence([const int]) retorna una secuencia empezando por el nmero dado o 1 si no se da ningn nmero. lookup() retorna la IP para un nombre de equipo. reverse_lookup() retorna el nombre de equipo para una IP. La funcin puede llamarse con un nico argumento de cadena de caracteres de la forma 'xxx.xxx.xxx.xxx' o con cuatro nmeros. Un fichero cargable dinmicamente debe compilarse como fichero objeto compartible, usando un comando como:
shell> gcc -shared -o udf_example.so udf_example.cc
Si usa gcc, debe ser capaz de crear udf_example.so con un comando ms simple:
shell> make udf_example.so
Puede determinar fcilmente las opciones de compilacin adecuadas para su sistema ejecutando este comando en el directorio sql del rbol fuente de MySQL:
shell> make udf_example.o
Debe ejecutar un comando de compilacin similar al que muestra make , excepto que debe quitar la opcin -c cerca del final de la lnea y aadir -o udf_example.so al final de la lnea. (En algunos sistemas, puede necesitar dejar -c en el comando.) Tras compilar un objeto compartido conteniendo UDFs, debe instalarlo y comunicarlo a MySQL. Compilar un objeto compartido de udf_example.cc produce un fichero llamado algo como udf_example.so (el nombre exacto puede variar de plataforma a plataforma). Copie este fichero en un directorio como /usr/lib en el que busque el lincador dinmico del sistema (en tiempo de ejecucin), o aada el directorio en el que est el objeto compartido en el fichero de configuracin del lincador (por ejemplo, /etc/ld.so.conf). El nombre del lincador depende del sistema (por ejemplo, ld-elf.so.1 en FreeBSD, ld.so en Linux, o dyld en Mac OS X). Consulte su documentacin del sistema para informacin acerca del nombre del lincador y cmo configurarlo. En muchos sistemas, puede cambiar las variables de entorno LD_LIBRARY o LD_LIBRARY_PATH para que apunten al directorio donde tiene los ficheros de su UDF. La pgina de manual dlopen explica qu variables debe usar en su sistema. Debe inicializarla en los scripts de arranque mysql.server o mysqld_safe y reiniciar mysqld. En algunos sistemas, el programa ldconfig que configura el lincador dinmico no reconoce un objeto compartido a no ser que su nombre comience con lib. En ese caso debe renombar el fichero como udf_example.so a libudf_example.so. En Windows, puede compilar funciones definidas por el usuario usando el siguiente procedimiento: 1. Necesita obtener el repositorio fuente BitKeeper para MySQL 4.0 o superior. Consulte Seccin 2.8.3, Instalar desde el rbol de cdigo fuente de desarrollo. 2. En el repositorio fuente, busque el directorio VC++Files/examples/udf_example . Hay ficheros llamados udf_example.def, udf_example.dsp, y udf_example.dsw . 3. En el repositorio fuente, busque en el directorio sql . Copie udf_example.cc de este directorio al directorio VC++Files/examples/udf_example y renombre el fichero a udf_example.cpp. 4. Abra el fichero udf_example.dsw con Visual Studio VC++ y selo para compilar los UDFs como un proyecto normal. Cuando el objeto compartido se ha instalado, notifique a mysqld con las nuevas funciones con estos comandos:
1454
FUNCTION metaphon RETURNS STRING SONAME 'udf_example.so'; 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';
Los comandos CREATE FUNCTION y DROP FUNCTION actualizan la tabla de sistema func en la base de datos mysql . El nombre de funcin, tipo y nombre de biblioteca compartida se salvan en la tabla. Debe tener los privilegios INSERT y DELETE para la base de datos mysql para crear y borrar funciones. No debe usar CREATE FUNCTION para aadir una funcin que se ha creado prviamente. Si necesita reinstalar una funcin, debe borrarla con DROP FUNCTION y reinstalarla con CREATE FUNCTION. Puede necesitar hacer esto, por ejemplo si recompila una nueva versin de su funcin, de forma que mysqld tenga la nueva versin. De otro modo, el servidor continua usando la versin antigua. Una funcin activa es una que se ha cargado con CREATE FUNCTION y no se ha borrado con DROP FUNCTION. Todas las funciones activas se recargan cada vez que el servidor arranca, a no ser que arranque mysqld con la opcin --skip-grant-tables . En ese caso, la inicializacin de UDFs no se hace y no estn disponibles.
El procedimiento para aadir una nueva funcin nativa se describe aqu. Tenga en cuenta que no puede aadir funciones nativas a una distribucin binaria ya que el procedimiento implica modificar cdigo fuente MySQL. Debe compilar MySQL de una distribucin fuente. Tambin tenga en cuenta que si migra a otra versin de MySQL (por ejemplo, cuando una nueva versin aparece), necesita repetir el procedimiento con la nueva versin. Para aadir una nueva funcin MySQL nativa, siga estos pasos: 1. Aada una lnea en lex.h que defina el nombre de funcin en la matriz sql_functions[]. 2. Si el prototipo de funcin es simple (slo tiene cero, uno, dos o tres argumentos), debe especificar en lex.h SYM(FUNC_ARGN) (donde N es el nmero de argumentos) como el segundo argumento en la matriz sql_functions[] y aadir una nueva funcin que cree un objeto funcin en item_create.cc. Consulte "ABS" y create_funcs_abs() para un ejemplo. Si la funcin prototipo es complicada (por ejemplo, tiene un nmero variable de argumentos), debe aadir dos lneas en sql_yacc.yy. Una indica el smbolo de preprocesador que yacc debe definir (debe aadirse al principio del fichero). Luego defina los parmetros de funcin y aada un item con estos parmetros a la regla de parseo simple_expr . Para un ejemplo, consulte todas las ocurrencias de ATAN en sql_yacc.yy para ver cmo se hace. 3. En item_func.h, declare una clase heredando de Item_num_func o Item_str_func, en funcin de si su funcin retorna un nmero o una cadena de caracteres. 4. En item_func.cc, aada una de las siguientes declaraciones, dependiendo de si est definiendo una funcin numrica o de cadena de caracteres:
double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str)
Si hereda su objeto de cualquiera de los objetos estndar (como Item_num_func), probablemente slo tiene que definier una de estas funciones y dejar que el objeto padre se ocupe de las otras funciones. Por ejemplo, la clase Item_str_func define una funcin val() que ejecuta atof() en el valor retornado por ::str(). 5. Debera probablemente definir la siguiente funcin objeto:
void Item_func_newname::fix_length_and_dec()
Esta funcin debe calcular al menos max_length basndose en los argumentos dados. max_length es el mximo nmero de caracteres que la funcin puede retornar. Esta funcin debera tambin asignar maybe_null = 0 si la funcin principal no puede retornar un valor NULL . La funcin puede chequear si algunos de los argumentos de la funcin puede retornar NULL chequeando la variable maybe_null de los argumentos. Puede consultar Item_func_mod::fix_length_and_dec para un ejemplo tpico de cmo hacer esto. Todas las funciones deben ser flujos seguros. En otras palabras, no usar ninguna variable global o esttica en las funciones sin protegerlas con semforos Si quiere retornar NULL, desde ::val(), ::val_int() or ::str() debe asignar a null_value 1 y retornar 0. Para funciones objeto ::str() , hay algunas consideraciones adicionales a tener en cuenta: El argumento String *str proporciona un bffer de cadenas de caracteres que puede usarse para guardar el resultado. (Para ms informacin acerca del tipo String , consulte el fichero sql_string.h .) La funcin ::str() debe retornar la cadena de caracteres que tiene el resultado o (char*) 0 si el resultado es NULL.
1456
Todas las funciones de cadenas de caracteres tratan de evitar cualquier reserva de memoria a no ser que sea absolutamente necesario!
1457
1458
1459
1460
Si un programa falla, siempre es til saber lo siguiente: Ha hecho el programa en cuestin un fallo de segmentacin? El programa est ocupando todo el tiempo disponible de CPU? Comprubelo con top. Deje el programa ejecutarse durante unos instantes, podra ser simplemente que est haciendo algunos clculos intensivos. Si el servidor mysqld est causando problemas, puede usted obtener algn tipo de respuesta de l con mysqladmin -u root ping o mysqladmin -u root processlist? Qu dicen los programas cliente cuando intenta conectarse al servidor MySQL? (Intntelo con mysql, por ejemplo.) Funciona el cliente? Consigue algn tipo de respuesta desde el cliente? Al enviar un informe de fallo, usted debe seguir el borrador descrito en Seccin 1.6.1.2, Hacer preguntas y reportar bugs.
1461
Si hay un proceso mysqld ejecutndose, puede comprobarlo ejecutando los siguientes comandos. El nmero de puerto o nombre del archivo socket de Unix pueden ser diferentes en su configuracin. host_ip representa el nmero de IP de la mquina donde se est ejecutando el servidor.represents the IP number of the machine where the server is running.
shell> shell> shell> shell> shell> shell> mysqladmin mysqladmin mysqladmin mysqladmin mysqladmin mysqladmin version variables -h `hostname` version variables -h `hostname` --port=3306 version -h host_ip version --protocol=socket --socket=/tmp/mysql.sock version
Tenga en cuenta la utilizacin de acentos abiertos en vez de comillas en el comando hostname; esto provoca que la salida de hostname (es decir, el nombre de mquina actual) sea sustituida en el comando mysqladmin. Si no tiene ningn comando hostname o est ejecutando sobre Windows, puede escribir manualmente el nombre de su mquina (sin acentos abiertos) tra la opcin -h. Tambin puede intentarlo con -h 127.0.0.1 para conectarse con TCP/IP a la mquina local. Aqu hay algunas razones por las que el error Can't connect to local MySQL server podra ocurrir: mysqld no se est ejecutando. Compruebe la lista de procesos de sus sistema operativo para asegurarse de que el proceso mysqld est presente. Usted est ejecutando un sistema que utiliza hilos tipo MIT-pthreads. Si est ejecutando un sistema que no tiene hilos antivos, mysqld utiliza el paquete de MIT-pthreads package. Consulte Seccin 2.1.1, Sistemas operativos que MySQL soporta. An as, no todas las versiones de MITpthreads soportan los archivos socket de Unix. En un sistema sin soporte para archivos socket, siempre debe especificar el nombre de mquina explcitamente cuando se conecte al servidor. Intente utilizar este comando para comprobar la conexin con el servidor:
shell> mysqladmin -h `hostname` version
Alguien ha borrado el archivo socket de Unix que mysqld utiliza (/tmp/mysql.sock por defecto). Por ejemplo, usted podra tener un trabajo de cron que elimine los archivos antiguos del directorio /tmp. Siempre puede ejecutar mysqladmin version para comprobar si el archivo socket de Unix que to check whether the Unix socket file that mysqladmin est intentando utilizar existe realmente. La solucin en este caso es cambiar el trabajo de cron para que no elimine mysql.sock o colocar el archivo socket en algn otro lugar. Consulte Seccin A.4.5, Cmo proteger o cambiar el fichero socket de MySQL /tmp/mysql.sock. Usted ha iniciado el servidor mysqld con la opcin --socket=/path/to/socket, pero ha olvidado decirle al programa cliente el nuevo nombre del archivo socket. Si cambia la ruta del socket en el servidor, tambin tiene que notificrselo a los programas cliente. Puede hacer esto proporcionndole al cliente la misma opcin --socket al ejecutarlo. Tambin debe asegurarse de que los programas cliente tienen permiso para acceder al archivo mysql.sock. Para averiguar donde est almacenado el archivo, puede hacer:
shell> netstat -ln | grep mysql
Consulte Seccin A.4.5, Cmo proteger o cambiar el fichero socket de MySQL /tmp/ mysql.sock. Usted est ejecutando Linux y un hilo del servidor ha muerto (volcado de memoria). En este caso, usted debe matar el resto de hilos de mysqld (por ejemplo, con kill o con el script mysql_zap) antes de que pueda reiniciar el servidor MySQL. Consulte Seccin A.4.2, Qu hacer si MySQL sigue fallando (crashing). El servidor o el programa cliente podran no tener los privilegios de acceso adecuados para el directorio que almacena el archivo socket de Unix, o para el archivo mismo. En este caso, usted debe cambiar los privilegios del directorio o los del archivo mismo para que el servidor y los clientes puedan acceder a ellos, o reiniciar mysqld con una opcin --socket que especifique un nombre
1462
de archivo de socket en un directorio donde el servidor pueda crearlo y los programas cliente puedan acceder a l. Si usted obtiene el mensaje de error Can't connect to MySQL server on some_host, puede intentar los siguientes procedimientos para averiguar cual es el problema: Compruebe si el servidor se est ejecutando en esa mquina mediante la ejecucin de telnet some_host 3306 y presionando la tecla Enter unas cuantas veces. (3306 es el puerto por defecto de MySQL. Cambie el valor si su servidor est escuchando en un puerto diferente.) Si hay un servidor MySQL ejecutndose y escuchando al puerto, debera obtener una respuesta que incluyera el nmero de versin del servidor. Si obtiene un error como telnet: Unable to connect to remote host: Connection refused, entonces no hay ningn servidor ejecutndose en el puerto dado. Si el servidor est ejecutndose en la mquina local, intente utilizar mysqladmin -h localhost variables para conectar utilizando el archivo socket de Unix. Colmpruebe el nmero de puerto TCP/IP al que el servidor est configurado para escuchar (es el valor de la variable port.) Asegrese de que su servidor mysqld no fue iniciado utilizando la opcin --skip-networking. Si lo fue no puede conectarse a l utilizando TCP/IP. Compruebe que no hay un cortafuegos bloqueando el acceso a MySQL. Aplicaciones como ZoneAlarm o el cortafuegos personal de Windows XP podra necesitar ser configurados para permitir el acceso externo a un servidor MySQL.
Para resolver este problema, debera utilizar alguno de los siguientes mtodos: Actualizar todos los programas clientes para que utilicen la librera de cliente 4.1.1 o posterior. Cuando se conecte al servidor con un programa cliente anterior al 4.1, utilice una cuenta que todava mantenga una clave al estilo pre-4.1. Reestablezca la clave al estilo pre-4.1 para cada usuario que necesite utilizar un programa cliente anterior a la versin 4.1. Esto puede hacerse utilizando la sentencia SET PASSWORD y la funcin OLD_PASSWORD():
mysql> SET PASSWORD FOR -> 'some_user'@'some_host' = OLD_PASSWORD('newpwd');
Sustituya la clave que quiera utilizar por newpwd en los ejemplos precedentes. MySQL no puede retornar la clave original, as que es necesario introducir una clave nueva. Indique al servidor que utilice el algoritmo de hashing de claves antiguo: 1. Inicie mysqld con la opcin --old-passwords. 1463
2. Asigne una clave con formato antiguo a cada cuenta que tenga su clave actualizada al formato ms largo de la versin 4.1. Puede identificar estas cuentas con la siguiente consulta:
mysql> SELECT Host, User, Password FROM mysql.user -> WHERE LENGTH(Password) > 16;
Para cada registro de cuentas que se muestre en la consulta, utilice los valores de Host y User y asigne una clave utilizando la funcin OLD_PASSWORD() y SET PASSWORD o UPDATE, tal como se ha explicado previamente. Nota: En PHP, la extensin mysql no soporta el nuevo protocolo de autentificacin en MySQL 4.1.1 y superior. Esto es as independientemente de la versin de PHP utilizada. Si desea poder utilizar la extensin mysql con MySQL 4.1 seguir alguna de las indicaciones explicadas arriba para configurar MySQL con clientes antiguos. La extensin mysqli (que significa "MySQL mejorado" - "MySQL Improved"; nueva en PHP 5) es compatible con el nuevo algoritmo de hashing mejorado empleado en MySQL 4.1 y superiores, y sin ninguna configuracin especial necesaria que deba hacerse para utilizar esta nueva librera cliente de MySQL para PHP. Para ms informacin sobre la extensin mysqli consulte http://php.net/mysqli. For additional background on password hashing and authentication, Consulte Seccin 5.6.9, Hashing de contraseas en MySQL 4.1.
En algunos sistemas, puede ocurrir que su contrasea funcione cuando es especificada en un archivo de opciones o en la lnea de comandos, pero no cuando sea introducida interactivamente en la lnea de comandos. Esto ocurre cuando la librera proveida por el sistema para leer contraseas limite los valores de stas a un nmero pequeo de caracteres (normalmente ocho). Eso es un problema con la librera del sistema, no con MySQL. Para poder solucionarlo, cambie su contrasea de MySQL a un valor que sea de ocho o menos caracteres de longitud, o ponga su constrasea en un archivo de opciones.
El nmero de intentos de conexin interrumpidos se puede determinar con el valor de la variable de sistema max_connect_errors. Tras max_connect_errors intentos fallidos, mysqld asume que hay algo que va mal (por ejemplo, que alguien est intentando romper la seguridad del sistema), y bloquea la mquina para que no pueda intentar volver a conectarse hasta que usted ejecute el comando mysqladmin flush-hosts o introduzca la sentencia FLUSH HOSTS. Consulte Seccin 5.3.3, Variables de sistema del servidor. Por defecto, mysqld bloquea una mquina tras 10 errores de conexin. Puede ajustar el valor iniciando el servidor as:
shell> mysqld_safe --max_connect_errors=10000 &
Si usted obtiene este mensaje de error para una mquina concreta, debera primero averiguar que no hay ningn problema con las conexiones TCP/IP desde esa mquina. Si est teniendo problemas de red, no hace ningn bien el incrementar el valor de la variable max_connect_errors.
1464
Demasiadas conexiones
Para remediarlo, primero compruebe si su consulta es correcta. Es razonable que devuelva tantas filas? Si no, corrjala y intntelo de nuevo. Si no es as, puede invocar mysql con la opcin --quick. Esto provoca que utilice la funcin mysql_use_result() de la API C para obtener el resultado, lo que hace que haya menos carga en el cliente (pero ms en el servidor).
Por defecto, el servidor cierra la conexin tras ocho horas si no pasa nada. Puede cambiar el lmite de tiempo estableciendo la variable wait_timeout cuadno inicie mysqld Consulte Seccin 5.3.3, Variables de sistema del servidor. Si usted tiene un script, tiene que ejecutar la consulta de nuevo para que el cliente haga una reconexin automtica. Esto da por hecho que tiene la reconexin automtica activada en el cliente (que es la opcin por defecto en el cliente de lnea de comandos mysql). Otras razones comunes por las que puede aparecer el error MySQL server has gone away son: Usted (o el administrador de la base de datos) ha matado el hilo que se estaba ejecutando con una sentencia KILL o el comando mysqladmin kill.
1465
MySQL se ha apagado
Usted ha intentado ejecutar una sentencia tras cerrar la conexin con el servidor. Esto es sntoma de un error lgico en la aplicacin que debera ser corregido. Se ha agotado el tiempo de espera de una conexin TCP/IP desde el lado cliente. Esto puede ocurrir si usted ha estado utilizando los comandos: mysql_options(..., MYSQL_OPT_READ_TIMEOUT,...) o mysql_options(..., MYSQL_OPT_WRITE_TIMEOUT,...). En este caso, aumentar el tiempo de espera puede ayudar a resolver el problema. Se ha agotado el tiempo de espera en el lado del servidor, y el cliente no tiene activada la opcin de reconexin automtica (la opcin reconnect en la estructura MYSQL es igual a 0). Usted est utilizando un cliente windows y el servidor ha cortado la conexin (probablemente porque wait_timeout ha expirado) antes de que el comando fuese ejecutado. El problema en windows es que en algunos casos MySQL no obtiene un error desde el SO cuando escribe a la conexin TCP/IP desde el servidor, sino que obtiene el error cuando intenta leer la respuesta desde la conexin. En este caso, aunque el flag reconnect en la estructura MYSQL sea igual a 1, MySQL no reconecta y vuelve a ejecutar la sentencia, ya que no sabe si el servidor recibi la sentencia original o no. La solucin a esto es o hacer un mysql_ping en la conexin si ha pasado mucho tiempo desde la ltima sentencia (esto es lo que MyODBC hace) o establecer un wait_timeout en el servidor mysqld tan alto que en la prctica, nunca llegue a sobrepasarse. Tambin puede obtener estos errores si enva una consulta al servidor que sea incorrecta o demasiado grande. Si mysqld recibe un paquete que es demasiado grande o fuera de lugar, asume que ha habido algn error con el cliente y cierra la conexin. Si necesita realizar grances consultas (por ejemplo, si est trabajando con columnas BLOB muy grandes), debera incrementar el lmite de las consultas estableciendo la variable de servidor max_allowed_packet, que tiene un valor por defecto de 1MB. Tambin podra necesitar incrementar el tamao mximo de paquete en el lado cliente. Puede encontrar ms informacin para establecer el tamao de paquete en Seccin A.2.9, Packet too large. Tambin puede perder la conexin si enva un paquete de ms de 16MB y su cliente es anterior a la versin 4.0.8 y su servidor posterior a 4.0.8, o viceversa. Tambin puede ver el error MySQL server has gone away si MySQL se inicia con la opcin -skip-networking. Ha encontrado un error por el que el servidor cay mientas ejecutaba una sentencia. Puede comprobar si el servidor MySQL cay y se reinici ejecutando mysqladmin version y examinando el tiempo de ejecucin del servidor (uptime). Si la conexin del cliente se cort debido a que mysqld fall y se reninic, debera intentar encontrar la razn del fallo. Comience por comprobar si ejecutando la misma sentencia el servidor cae de nuevo. Consulte Seccin A.4.2, Qu hacer si MySQL sigue fallando (crashing). Puede obtener ms informacin sobre las conexiones perdidas iniciando mysqld con la opcin --logwarnings=2. Esto registra algunos de los errores de desconexin en el archivo hostname.err. Consulte Seccin 5.10.1, El registro de errroes (Error Log). Si quiere crear un informe de error en relacin a este problema, asegrese de incluir la siguiente informacin: Indique si el servidor MySQL muri. Puede enecontrar esta informacin en el registro de errores del servidor. Consulte Seccin A.4.2, Qu hacer si MySQL sigue fallando (crashing). Si una consulta especfica mata a mysqld y las tablas implicadas haban sido comprobadas con CHECK TABLE antes de ejecutar la consulta, puede proporcionar una prueba que permita
1466
reproducir el caso? Consulte Seccin D.1.6, Crear un caso de prueba tras haber encontrado una tabla corrupta. Cual es el valor de la variable de sistema wait_timeout en el servidor MySQL? (mysqladmin variables le da el valor de esta variable.) Ha intentado ejecutar mysqld con la opcin --log para determinar si la consulta problemtica aparece en el registro? Consulte tambin Seccin A.2.10, Errores de comunicacin y conexiones abortadas. Consulte Seccin 1.6.1.2, Hacer preguntas y reportar bugs.
Esto establece el tamao del paquete en 32MB. El valor por defecto de la variable max_allowed_packet en el servidor es de 1MB. Pue incrementar esto si el servidor necesita gestionar consultas grandes (por ejemplo, si est trabajando con columnas BLOB grandes). Por ejemplo, para establecer la variable a 16MB, inicie el servidor as:
mysql> mysqld --max_allowed_packet=16M
Tambin puede utilizar un archivo de opciones para establecer max_allowed_packet. Por ejemplo, para establecer el valor para el servidor en 16MB, aada las siguientes lneas en su archivo de opciones:
[mysqld] max_allowed_packet=16M
Es seguro incrementar el valor de esta variable porque la memoria extra tan solo es utilizada cuando se necesite. Por ejemplo, mysqld solo ocupa ms memoria cuando usted ejecuta una consulta grande o cuando mysqld debe retornar una fila de resultados grande. El valor por defecto pequeo en la variable, es una precaucin para atrapar paquetes incorrectos entre el cliente y el servidor, y tambin
1467
para asegurarse de que usted no se queda sin memoria al utilizar paquetes grandes de manera accidental. Tambin puede sufrir problemas extraos con paquetes grandes si est utilizando valores BLOB grandes pero no ha dado a mysqld acceso a suficiente memoria para gestionar la consulta. Si sospecha que este es el caso, intente aadir ulimit -d 256000 al principio del script mysqld_safe y reinicie mysqld.
Si un mensaje Aborted connections aparece en el registro de errores, la causa puede ser alguna de las siguientes: El programa cliente no llam a mysql_close() antes de salir. El cliente ha estado inactivo ms de wait_timeout o interactive_timeout segundos, sin enviar ninguna peticin al servidor. Consulte Seccin 5.3.3, Variables de sistema del servidor. El programa cliente abort de manera abrupta en mitad de una transferencia de datos. Cuando alguna de estas cosas pasa, el servidor incrementa la variable de estado Aborted_clients. El servidor incrementa la variable de estado Aborted_connects cuando una de las siguientes cosas ocurren: Un cliente no tiene privilegios para conectar a una base de datos. Un cliente utiliza una contrasea incorrecta. Un paquete de conexin no contiene la informacin correcta. Se tarda ms de connect_timeout en obtener un paqueta de conexin. Consulte Seccin 5.3.3, Variables de sistema del servidor. Si este tipo de cosas pasan, podra ser indicativo de que alguien est intentando entrar en su servidor! Otros motivos para los problemas con clientes que abortan o conexiones interrumpidas: Utilizacin del protocolo Ethernet con Linux, tanto en half como en full duplex. Muchos drivers de Ethernet en Linux tienen este error. Debera comprobar si su driver contiene este error transfiriendo un archivo enorme via FTP entre el cliente y el servidor. Si la transferencia entra en un modo de ejecucin-pausa-ejecucin-pausa, usted est experimentando el sndrome duplex de Linux. La nica solucin es cambiar el modo duplex tanto de su tarjeta de red como de su concentrador o switch tanto a full como a half duplex, y comprobar los resultados para determinar la mejor configuracin. Algunos problemas con la librera de hilos de ejecucin que causa interrupciones en las lecturas. TCP/IP mal configurado. Redes, concentradores, switches o cables defectuosos. Esto solo puede ser diagnosticado mediante el reemplazo de hardware. El valor de la variable max_allowed_packet es demasiado pequeo o las consultas requieren ms memoria de la que tiene disponible para mysqld. Consulte Seccin A.2.9, Packet too large.
1468
Tambin puede utilizar myisamchk -dv /ruta/a/archivo-indice-de-tabla. Si el tamao del puntero es demasiado pequeo, puede corregir el problema utilizando ALTER TABLE:
ALTER TABLE nombre_tabla MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;
Tiene que especificar AVG_ROW_LENGTH solo para tablas con columnas BLOB o TEXT; en este caso, MySQL no puede optimizar el espacio requerido basndose nicamente en el nmero de filas.
El error anterior es un mensaje tpico para Windows; el mensaje de Unix es similar. Una solucin es iniciar mysqld con la opcin --tmpdir o aadir la opcin a la seccin [mysqld] de su archivo de opciones. Por ejemplo, para especificar el directorio C:\temp, utilice estas lneas:
[mysqld] tmpdir=C:/temp
1469
El directorio C:\temp debe existir y tener suficiente espacio para que el servidor MySQL escriba en l. Consulte Seccin 4.3.2, Usar ficheros de opciones. Otra causa de este error pueden ser temas de permisos. Asegrese de que el servidor MySQL puede escribir en el directorio tmpdir. Compruebe tambin el cdigo de error que obtiene con perror. Una razn por la que el servidor puede no escribir en una tabla es que el sistema de archivos est lleno:
shell> perror 28 Error code 28: No space left on device
En algunos casos, puede ser que la tabla no exista porque usted se est refiriendo a ella incorrectamente: Debido a que MySQL utiliza directorios y archivos para almacenar bases de datos y tablas, los nombres de bases de datos y tablas son sensibles a las letras maysculas si se encuentran en un sistema de archivos que lo sea.
1470
An en los sistemas de archivo que no son sensibles a la diferencia entre minscula y mayscula, como en Windows, todas las referencias a una tabla dada deben utilizar el mismo tipo de letra. Puede comprobar las tablas que hay en la base de datos actual con SHOW TABLES. Consulte Seccin 13.5.4, Sintaxis de SHOW.
Este error puede tener una de las siguientes causas: El juego de caracteres es un juego multi-byte, y no tiene soporte para ese juego de caracteres en el cliente. En este caso, necesita recompilar el cliente ejecutando configure con la opcin --withcharset=charset_name o --with-extra-charsets=charset_name. Consulte Seccin 2.8.2, Opciones tpicas de configure. Todos los binarios estndar MySQL se compilan con --with-extra-charactersets=complex, que activa el soporte para los juegos de carcter multi-byte. Consulte Seccin 5.9.1, El conjunto de caracteres utilizado para datos y ordenacin. El juego de caracteres es un juego simple que no est compilado en mysqld, y el archivo de definicin de juegos de caracteres no est en el lugar que el cliente espera encontrarlo. En este caso, necesita utilizar uno de los siguientes mtodos para resolver el problema: Recompile el cliente con soporte para el juego de caracteres. Consulte Seccin 2.8.2, Opciones tpicas de configure. Especifique al cliente el directorio donde la definicin del juego de caraceres tiene sus archivos. En muchos clientes puede hacerlo con la opcin --character-sets-dir. Copie los archivos de definicin de caracteres a la ruta donde el cliente espera que estn.
El problema aqu es que mysqld est intentando mantener abiertos demasiados archivos de manera simultnea. Puede decirle a mysqld que no abra tantos archivos a la vez, o incrementar el nmero de descriptores disponibles para mysqld. Para decirle a mysqld que mantenga abiertos menos archivos de manera simultnea, puede hacer la cache de la tabla mas pequea reduciendo el valor de la variable de sistema table_cache (el valor por defecto es 64). Reducir el valor de max_connections tambin reduce el nmero de archivos abiertos (el valor por defecto es 100). Para cambiar el nmero de descriptores de archivo disponibles para mysqld, puede utilizar la opcin --open-files-limit para mysqld_safe o (desde MySQL 3.23.30) establecer la variable de sistema open_files_limit. Consulte Seccin 5.3.3, Variables de sistema del servidor. La manera ms fcil de establecer estos valores es aadir una opcin a su archivo de opciones. Consulte
1471
Seccin 4.3.2, Usar ficheros de opciones. Si usted dispone de una versin antigua de mysqld que no soporta el establecimiento del lmite de archivos abiertos, puede editar el script mysqld_safe. Hay una lnea comentada en el script, ulimit -n 256. Puede eliminar el carcter '#' para descomentar esta lnea, y cambiar el nmero 256 para establecer el nmero de descriptores de archivos que sern puestos a disposicin de mysqld. --open-files-limit y ulimit pueden incrementar el nmero de descriptores de archivo, pero slo hasta el lmite impuesto por el sistema operativo. Hay tambin un lmite impuesto que puede ser sobreseido slo si inicia mysqld_safe o mysqld como root (simplemente recuerde que necesita iniciar el servidor con la opcin --user en este caso para que no continue ejecutndose como root tras el inicio). Si usted necesita incrementar el lmite del sistema operativo sobre el nmero de descriptores de archivo disponibles para cada proceso, consulte la documentacin de su sistema operativo. Nota: Si usted ejecuta el shell tcsh, ulimit no funciona! tcsh tambin informa de valores incorrectos cuando le interroga por los lmites actuales. En este caso, debera iniciar mysqld_safe utilizando sh.
Debera ser capaz de resolver este problema aadiento -Ldir_path -lmysqlclient al final de su comando de enlace, donde dir_path representa la ruta de el directorio donde la librera cliente est situada. Para determinar el directorio correcto, utilice este comando:
shell> mysql_config --libs
La salida de mysql_config podra indicar otras libreras que deberan ser especificadas en el comando de enlace tambin. Si obtiene errores de undefined reference en las funciones uncompress o compress, intente aadir -lz al final de su comando de enlace e intente de nuevo. Si usted obtiene errores undefined reference para una funcin que no deberan ocurrir en su sistema, tal como connect, compruebe la pgina de la funcin en el manual y determine qu libreras debera aadir para el comando de enlace. Podra obtener errores undefined reference como el siguiente por las funciones que no existen en su sistema:
mf_format.o(.text+0x201): undefined reference to `__lxstat'
Esto normalmente significa que su librera cliente MySQL fue compilada en un sistema que no es compatible al 100% con el suyo. En este caso, debera descargar la ltima distribucin de cdigo fuente de MySQL y compilar usted mismo MySQL. Consulte Seccin 2.8, Instalacin de MySQL usando una distribucin de cdigo fuente. Podra obtener errores de referencia en tiempo de ejecucin cuando intenta ejecutar un programa MySQL. Si estos errores especifican smbolos que comienzan con mysql_ o indican que la librera cliente mysqlclient no puede encontrarse, significa que su sistema no puede encontrar la librera compartida libmysqlclient.so. La correccin para esto es decirle a su sistema que busque las
1472
libreras compartidas donde estn situadas. Utilice aquel de los siguientes mtodos que sea apropiedo para su sistema: Aada la ruta al direcotorio donde se encuentre libmysqlclient.so a la variable de entorno LD_LIBRARY_PATH. Aada la ruta al directorio donde libmysqlclient.so se encuentra a la variable de entorno LD_LIBRARY. Copie el archivo libmysqlclient.so a algn directorio de los que su sistema busca, como por ejemplo /lib, y actualice la informacin de la librera compartido ejecutando ldconfig. Otra manera de resolver este problema es enlazando su programa de manera esttica con la opcin static, o eleminando las librera dinmicas MySQL antes de enlazar su cdigo. Antes de intentar el segundo mtodo, usted debera asegurarse de que ningn otro programa est utilizando las libreras dinmicas.
Si no hace esto, el servidor no es capaz de acceder a bases de datos o tablas cuando se ejecuta como user_name. Si los directorios o archivos en el directorio de datos de MySQL son enlaces simblicos, necesitar tambin seguir estos enlaces y cambiar los directorios y archivos a los que apuntan. Podra ser que chown -R no siguiera los enlaces por usted. 3. Inicie el servidor como el usuario user_name. Si usted est utilizando MySQL 3.22 o posterior, otra alternativa es iniciar mysqld como usuario root de Unix y utilizar la opcin -user=user_name. mysqld se inicia, y entonces cambia la ejecucin al usuario Unix user_name antes de aceptar ninguna conexin. 4. Para iniciar al servidor como el usuario dado automticamente al inicio del sistema, especifique el nombre de usuario aadiendo una opcin user a el grupo [mysqld] del archivo de opciones / etc/my.cnf o el archivo de opciones my.cnf en el directorio de datos del servidor. Por ejemplo:
[mysqld] user=user_name
Si su mquina Unix no es segura, debera asignar contraseas a las cuentas root de MySQL en las tablas de privilegios. De otra manera cualquier usuario con una cuenta de entrada a su mquina podra ejecutar el cliente mysql con una opcin --user=root y realizar cualquier operacin. (Es una buena idea asignar contraseas a las cuentas MySQL en cualquier caso, pero especialmente si existen otras cuentas de entrada en la mquina del servidor.) Consulte Seccin 2.9, Puesta en marcha y comprobacin despus de la instalacin.
Si usted tiene problemas con los permisos de archivos, la variable de entorno UMASK puede estar especificada de manera incorrecta al inicio de mysqld. Por ejemplo, MySQL puede devolver el siguiente mensaje de error al crear una tabla:
ERROR: Can't find file: 'path/with/filename.frm' (Errcode: 13)
El valor por defecto de UMASK es 0660. Ustee puede cambiar este comportamiento iniciando mysqld_safe de la siguiente manera:
shell> UMASK=384 # = 600 en octal shell> export UMASK shell> mysqld_safe &
Por defecto, MySQL crea las bases de datos y directorios RAID con un valor de permiso de acceso de 0700. Usted puede modificar este comportamiento estableciendo la variable UMASK_DIR. Si usted establece su valor, los nuevos directorios sern creados con los valores combinados de UMASK y UMASK_DIR. Por ejemplo, si usted quiere dar acceso de grupo a todos los directorios nuevos, puede hacer eso:
shell> UMASK_DIR=504 # = 770 en octal shell> export UMASK_DIR shell> mysqld_safe &
En MySQL 3.23.25 y superiores, MySQL asume que el valor de UMASK y UMASK_DIR est en octal si comienza por cero. Consulte Apndice E, Variables de entorno.
Despus encuentre en la lista el servicio MySQL, y parelo. Si su servidor no est ejecutndose como servicio, podra necesitar utilizar el Gestor de tareas para forzarlo a parar. 3. Cree un archivo de texto e introduzca el siguiente comando en l, en una nica lnea:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MiNuevaContrasea');
Guarde el archivo con cualquier nombre. Para este ejemplo, el nombre del archivo ser C: \mysql-init.txt. 4. Abra una ventana de comandos para obtener una consola de comandos DOS:
1474
5. Asumiremos que usted tiene instalado MySQL en C:\mysql. Si lo intal en algn otro lugar, ajuste los siguientes comandos de manera adecuada. En la lnea de comandos DOS, ejecute esta orden:
C:\> C:\mysql\bin\mysqld-nt --init-file=C:\mysql-init.txt
Los contenidos del archivo nombrado por la opcin --init-file son ejecutados en el inicio del servidor, cambiando la contrasea de root. Cuando el servidor se haya iniciado correctamente, debera borrar el archivo C:\mysql-init.txt. Los usuarios de MySQL 4.1 y superiores que instalen MySQL utilizando el instalador de mySQL, pueden necesitar especificar una opcin --defaults-file:
C:\> C:\Archivos de Programa\MySQL\MySQL Server 5.0\bin\mysqld-nt.exe --defaults-file="C:\Archivos de Programa\MySQL\MySQL Server 5.0\my.ini" --init-file=C:\mysql-init.txt
Encuentre el servicio MySQL en la lista, pulse con el botn derecho del ratn, y escoja la opcin Propiedades. El campo Ruta al Ejecutable contiene la configuracin de --defaultsfile. 6. Pare el servidor MySQL, y reincielo en modo normal de nuevo. Si ejecuta el servidor como servicio, incielo desde la ventana de servicios de Windows. Si ejecuta el servidor manualmente, utilice el comando que normalmente use. 7. Debera poder conectar utilizando la nueva contrasea. En un entorno Unix, el procedimiento para restablecer la contrasea root es el siguiente: 1. Entre en sus sitema como usuario Unix root o bien como el mismo usuario que ejecuta el servidor mysqld. 2. Localice el archivo .pid que contiene el ID de proceso del servidor. La localizacin exacta y el nombre de este archivo depende de su distribucin, nombre de mquina, y configuracin. Lugares comunes son /var/lib/mysql/, /var/run/mysqld/, y /usr/local/mysql/data/. Generalmente, el archivo tiene una extensin .pid y comienza con mysqld o el nombre de su mquina. Puede parar el servidor MySQL enviando un comando kill (no kill -9) a el proceso mysqld utilizando la ruta del archivo .pid en el siguiente comando:
shell> kill `cat /mysql-data-directory/host_name.pid`
Ntese el uso de acentos abiertos en vez de comillas simples con el comando cat; estos causan que la salida de cat sea sustituida en el comando kill. 3. Cree un archivo de texto e introduzca el siguiente comando en una nica lnea:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MiNuevaContrasea');
Guarde el archivo con cualquier nombre. Para este ejemplo, el archivo tendr el nombre ~/ mysql-init. 4. Reinicie el servidor MySQL con la opcin especial --init-file=~/mysql-init:
shell> mysqld_safe --init-file=~/mysql-init &
1475
Los contenidos del archivo son ejecutados al inicio del servidor, cambiando la contrasea de root. Despus de que el servidor se haya iniciado con xito, debera borrar ~/mysql-init. 5. Debera poder conectar utilizando la nueva contrasea. Una alternativa, en cualquier plataforma, es establecer la nueva contrasea desde el cliente mysql (pero esta manera es menos segura): 1. Pare mysqld y reincielo con la opcin --skip-grant-tables --user=root (Los usuarios de Windows deben omitir la parte de --user=root). 2. Conecte al servidor mysqld con este comando:
shell> mysql -u root
Reemplace nuevacontrasea con la contrasea de root real que quiere utilizar. 4. Debera poder conectar utilizando la nueva contrasea.
1476
Est ejecutando varios servidores mysqld utilizando el mismo directorio de datos en un sistema que no soporta un buen mecanismo de bloqueo de sistema de archivos (normalmente gestionado por el gestor de bloqueos lockd), o est ejecutando mltiples servidores con la opcin --skipexternal-locking. Usted tiene un archivo de datos o ndices errneo que contiene datos muy corruptos que han confundido a mysqld. Ha encontrado un fallo en el cdigo de almacenaje de datos. Esto no es muy probable, pero es posible. En este caso, puede intentar cambiar el tipo de la tabla a otro motor de almacenamiento utilizando ALTER TABLE sobre una copia reparada de la tabla. Debido a que es muy difcil saber por qu algo est fallando, primero intente comprobar las cosas que funcionan frente a las que fallan en su caso. Por favor, intente las siguientes comprobaciones: Pare el servidor mysqld con mysqladmin shutdown, ejecute myisamchk --silent --force */*.MYI desde el directorio de datos para comprobar todas las tablas MyISAM, y reinicie mysqld. Esto le har estar seguro de que est ejecutando el servidor desde un estado inicial limpio. Consulte Captulo 5, Administracin de bases de datos. Inicie mysqld con la opcin --log e intente determinar a travs de la informacin escrita en el registro si hay alguna consulta particular que mate al servidor. Sobre el 95% de todos los fallos son relacionados con una consulta en particular. Normalmente, esta es una de las ltimas consultas en el archivo de registro antes de que el servidor se reinicie. Consulte Seccin 5.10.2, El registro general de consultas. Si usted puede matar repetidamente MySQL con una consulta especfica, an cuando ha comprobado todas las tablas antes de ejecutarla, entonces ha sido capaz de localizar el fallo, y debera enviar un informe de fallos. Consulte Seccin 1.6.1.3, Cmo informar de bugs y problemas. Intente hacer un juego de pruebas que podamos utilizar para repetir el problema. Consulte Seccin D.1.6, Crear un caso de prueba tras haber encontrado una tabla corrupta. Intente ejecutar las pruebas en el direcotrio mysql-test y los bancos de pruebas MySQL. Consulte Seccin 27.1.2, El paquete de pruebas MySQL Test. Estos deberan comprobar bastante bien MySQL. Tambin puede aadir cdigo a los bancos de pruebas que simulen su aplicacin. Los bancos de pruebas pueden ser localizados en el directorio sql-bench en una distribucin de cdigo fuente, o, en una distribucin binaria, en el directorio sql-bench bajo su directorio de instalacin de MySQL. Intente el script fork_big.pl. (Est ubicado en el directorio tests de una distribucin de cdigo fuente.) Si usted configura MySQL para depuracin, es mucho ms fcil recoger informacin sbore los posibles errores cuando algo va mal. Configurar MySQL para depuracin causa que un gestor de memoria seguro se incluya para encontrar algunos errores. Tambin produce muchas ms salidas informativas sobre lo que est pasando. Reconfigure MySQL con la opcin --with-debug o -with-debug=full para ejecutar despus configure y seguidamente recompilar. Consulte Seccin D.1, Depurar un servidor MySQL. Asegrese de que usted ha aplicado los ltimos parches para su sistema operativo. Utilice la opcin --skip-external-locking para mysqld. En algunos sitemas, el gestor de bloqueos lockd no funciona apropiadamente; la opcin --skip-external-locking le dice a mysqld que no utilice bloqueos externos. (Esto significa que no puede ejecutar dos servidores mysqld en el mismo directorio de datos, y que debe ser muy cuidadoso cuando utilice myisamchk). An as, puede ser muy instructivo intentar la opcin como prueba.) Ha intentado el comando mysqladmin -u root processlist cuando mysqld parece estar ejecutndose pero no responde? A veces mysqld no est comatoso, aunque usted pueda pensar lo contrario. El problema puede ser que todas las conexiones estn en uso, o que haya algn problema de bloqueo interno. mysqladmin -u root processlist es normalmente capaz de
1477
hacer una conexin an en esots casos, y puede proveerle de informacin til sobre el nmero actual de conexiones y su estado. Ejecute del comando mysqladmin -i 5 status o mysqladmin -i 5 -r status en una ventana separada para producir estadsticas mientras ejecuta sus otras consultas. Intente lo siguiente: 1. Inicie mysqld desde gdb (u otro depurador). Consulte Seccin D.1.3, Depurar mysqld con gdb. 2. Ejecute sus scripts de comprobacin. 3. Imprima el trazado y las variables locales en los tres niveles ms bajos. En gdb, puede hacer esto con los siuguientes comandos cuando mysqld ha caido dentro de gdb:
backtrace info local up info local up info local
Con gdb, usted puede tambin examinar que hilos de ejecucin existen con info threads y cambiar a un hilo especfico con thread #, donde # es el ID del hilo. Trate de simular su aplicacin con un script Perl para forzar a que MySQL falle o se comporte indebidamente. Enve un informe de fallos normal. Consulte Seccin 1.6.1.3, Cmo informar de bugs y problemas. Sea an ms detallado de lo normal. Debido a que MySQL funciona para mucha gente, podra ser que los fallos fueran resultado de algo que exista tan slo en su mquina (por ejemplo, un error relacionado con sus libreras de sistema particulares). Si usted tiene un problema con tablas que contengan filas de longitud dinmica y est utilizando nicamente columnas VARCHAR (no columnas BLOB ni TEXT), puede intentar cambiar todas las columnas VARCHAR a CHAR con ALTER TABLE. Esto fuerza a MySQL a utilizar filas de tamao fijo. Las filas de tamao fijo ocupan un poco ms de espacio, pero son mucho ms tolerantes a la corrupcin. El cdigo de filas dinmicas actual ha sido utilizado en MySQL AB durante muchos aos con muy pocos problemas, pero las filas de longitud dinmica son, por naturaleza, ms propensas a errores, as que podra ser una buena idea intentar esta estrategia y ver si ayuda. No deje fuera el hardware de su servidor cuando est diagnosticando problemas. El hardware defectuoso puede ser causa de corrupcin de datos. Debe poner especial atencin en la RAM y los discos duros cuando est buscando problemas de hardware.
1478
Cada 10 minutos, escribe una entrada en el archivo de registro, avisando sobre la situacin de disco lleno. Para aliviar el problema, puede hacer lo siguiente: Para continuar, lo nico que tiene que hacer es liberar suficiente espacio en disco para insertar todos los registros. Para abortar el hilo, debe utilizar el comando mysqladmin kill. El hilo se aborta la prxima vez que comprueba el disco (en un minuto). Otros hilos podran estar esperando a la tabla que caus la situacin de disco lleno. Si tiene varios hilos bloqueados matar al que est esperando por la situacin de disco lleno permite que los dems hilos puedan continuar. Hay excepciones al comportamiento descrito previamente, como cuando utiliza REPAIR TABLE o OPTIMIZE TABLE, o cuando los ndices son creados en batch tras la sentencia LOAD DATA INFILE o la sentencia ALTER TABLE. Todas estas sentencias podran crear grandes archivos temporales que, si se dejan a su suerte, podran causar enormes problemas para el resto del sistema. Si el disco se llena mientras MySQL est haciendo alguna de estas operaciones, elimina el archivo temporal grande y marca la tabla como corrupta. La excepcin es que con ALTER TABLE, la tabla antigua se deja tal como estaba, sin cambios.
El tamao del puntero de fila es normalmente de 4 bytes, pero puede crecer en el futuro para tablas realmente grandes. Para algunas consultas SELECT, MySQL tambin crea tablas SQL temporales. Estas no estn ocultas y tienen nombres del tipo SQL_*.
1479
ALTER TABLE crea una tabla temporal en el mismo directorio que la tabla original.
Puede comprobar si el bit sticky esta activado ejecutando ls -ld /tmp. Si el ltimo carcter de privilegios es t, el bit est activado. Otra solucin es cambiar el lugar donde el servidor crea el archivo socket de Unix. Si hace esto, debera tambin hacrselo saber a los programas clientes. Puede especificar el lugar del archivo de diferentes maneras: Especifique la ruta en un archivo de opciones global o local. Por ejemplo, ponga las siguientes lneas en /etc/my.cnf:
[mysqld] socket=/ruta/a/socket [client] socket=/ruta/a/socket
Consulte Seccin 4.3.2, Usar ficheros de opciones. Especifique una opcin --socket en la lnea de comandos a mysqld_safe y cuando ejecute programas cliente. Establezca la variable de entorno MYSQL_UNIX_PORT apuntando a la ruta del archivo de socket Unix. Recompile MySQL desde el cdigo fuente para utilizar una ruta por defect diferente para el archivo socket. Defina la ruta al arhivo con la opcin --with-unix-socket-path cuando ejecute configure. Consulte Seccin 2.8.2, Opciones tpicas de configure. Puede comprobar si el nuevo lugar del socket funciona intentando conectar al servidor con el siguiente comando:
shell> mysqladmin --socket=/ruta//socket version
1480
Si quiere que una columna siemrpe sea tratada de manera sensible a maysculas, declrela de esa manera, con una colacin que lo sea. Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE. Previamentea MySQL 4.1, COLLATE no est disponible. Utilice el operador BINARY en las expresiones para tratar una cadena de carceres como binaria: BINARY col_name LIKE 'a%' o col_name LIKE BINARY 'a%'. En declaracines de columnas, utilice el atributo BINARY. Las operaciones de comparacin simples (>=, >, =, <, <=, ordenacin, y agrupacin) se basan en el valor de orden del carcter. Caracteres con el mismo valor de orden (como 'E', 'e', y '') se tratan como el mismo carcter.
Por motivos de conveniencia, MySQL convierte automticamente una fecha a un nmero si la fecha se utiliza en un contexto numrico (y viceversa). Es tambin suficientemente inteligente para permitir diversos formatos de cadena de caracteres cuando se est actualizando y en las clusulas WHERE que comparan una fecha con una columna TIMESTAMP, DATE, o DATETIME. (Diversos formatos, significa que puede utilizarse cualquier carcter de puntuacin como separador de las partes de la fecha. Por ejemplo, '2004-08-15' y '2004#08#15' son equivalentes.) MySQL tambin puede convertir una cadena de caracteres que no contenga separadores (como '20040815'), siempre que tenga sentido como fecha. Cuando compara una colmna DATE, TIME, DATETIME, o TIMESTAMP a una cadena de caracteres constante con los operadores <, <=, =, >=, >, o BETWEEN, MySQL normalmente convierte la cadena de carteres a un entero largo interno para una comparacin ms rpda (y tambin para hacer una comparacin algo ms permisiva). An as, esta conversin est sujeta a las siguientes restricciones: Cuando compara dos columnas Cuando usted compare columnas DATE, TIME, DATETIME, o TIMESTAMP con una expresin. Cuando usted utilice cualquier otro mtodo de comparacin que no sean aquellos recientemente citados, como IN o STRCMP(). Para estos casos excepcionales, la comparacin se hace convirtiendo los objetos a cadenas de caracteres y realizando una comparacin de cadenas de caracteres.
1481
Para mantener todo a salvo, asuma que las fechas son comparadas como cadenas de caracteresy utilice las funciones de cadena de caracteres apropiadas para comparar un valor temporal con una cadena de caracteres. La fecha especial '0000-00-00' puede almacenarse y recogerse como '0000-00-00'. Cuando se utiliza una fecha '0000-00-00' a travs de MyODBC, es convierte automticamente en NULL en MyODBC 2.50.12 y superiores, porque ODBC no puede gestionar este tipo de fechas. Como MySQL realiza las conversiones anteriores, las siguientes sentencias funcionan:
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 nombre_de_tabla nombre_de_tabla nombre_de_tabla nombre_de_tabla nombre_de_tabla nombre_de_tabla (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 nombre_de_tabla WHERE idate >= idate FROM nombre_de_tabla WHERE idate >= MOD(idate,100) FROM nombre_de_tabla WHERE idate FROM nombre_de_tabla WHERE idate >=
STRCMP() es una funcin de comparacin de cadenas, as que convierte idate a una cadena de caracteres en formato 'YYYY-MM-DD' y realiza una comparacin de cadenas. Es decir, NO convierte '20030505' en la fecha '2003-05-05' para realizar una comparacin de fechas. Si est utilizando el modo SQL ALLOW_INVALID_DATES (permitir fechas no vlidas), MySQL le permite almacenar las fechas que le proporciona con una comprobacin mnima: MySQL se asegura nicamente que el da est en el rango entre 1 y 31, y el mes en el rango entre 1 y 12. Esto hace que MySQL sea muy convenienta para las aplicaciones web en que usted obtiene el ao, mes y da en tres campos diferentes y quiere almacenar exactamente lo que el usuario insert (sin validacin de fechas). Si no est utilizando el modo SQL NO_ZERO_IN_DATE, la parte del da o el mes pueden ser cero. Esto es conveniente si quiere almacenar una fecha de nacimiento en una columna DATE y solo conoce parte de esa fecha. Si no est utlizando el modo SQL NO_ZERO_DATE, MySQL tambin le permite almacenar '0000-00-00' como fecha comodn. En algunos momentos esto puede ser ms adecuado que utilizar valores NULL. Si la fecha no puede ser convertida a ningn valor razonable, se almacena un 0 en la columna DATE, que se extrae como '0000-00-00'. Esto es una cuestin de velocidad y conveniencia. Creemos que la responsabilidad del servidor de bases de datos es recoger la misma fecha que usted almacen (an cuando la fecha no fuese lgicamente correcta en todos los casos). Creemos que es responsabilidad de la aplicacin y no del servidor comprobar las fechas. Si quiere que MySQL compruebe todas las fechas y acepte solo las que sean correctas (al menos que esto sea sobreseido por IGNORE), debera establecer el modo SQL a "NO_ZERO_IN_DATE,NO_ZERO_DATE". La gestin de fechas en MySQL 5.0.1 y anteriores funciona como en MySQL 5.0.2 con el modo SQL ALLOW_INVALID_DATES activado.
1482
mysql> INSERT INTO my_table (phone) VALUES (NULL); mysql> INSERT INTO my_table (phone) VALUES ('');
Ambas sentencias insertan un valor en la columna phone, pero la primera inserta un valor NULL y la segunda una cadena vaca. El significado de la primera se puede traducir por el nmero de telfono no es conocido, y el significado de la segunda es se sabe que la persona no tiene telfono, y por tanto, no hay nmero de telfono. Para ayudarle con la gestin de NULL, tiene disponibles los operadores IS NULL y IS NOT NULL y la funcin IFNULL(). En SQL, el valor NULL nunca da verdadero al compararlo con otro valor, an cuando este valor sea tambin NULL. Una expresin que contiene NULL siempre produce un valor NULL a menos que se indique lo contrario en la documentacin de los operadores y funciones implicadas en la expresin. Todas las columnas en el siguiente ejemplo retornan NULL:
mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
Si quiere buscar valores de columna que son NULL, no puede utilizar una comprobacin expr = NULL. La siguiente sentencia no retorna registros, porque expr = NULL nunca es verdadero para cualquier expresin:
mysql> SELECT * FROM my_table WHERE phone = NULL;
Para buscar valores NULL debe utilizar la comprobacinIS NULL. Las siguientes sentencias muestran como encontrar el nmero de telfono NULL y el vaco:
mysql> SELECT * FROM my_table WHERE phone IS NULL; mysql> SELECT * FROM my_table WHERE phone = '';
Puede aadir una columna ndice que tenga valores NULL si utiliza MySQL 3.23.2 o superiores, o si est utilizando los motores de almacenamiento MyISAM, InnoDB, o BDB. A partir de MySQL 4.0.2, el motor de almacenamiento MEMORY tambin tiene soporte para valores NULL en los ndices. Si no es as, todas las columnas de ndice deben ser declaradas como NOT NULL y usted no podr insertar un valor NULL en la columna. Cuando lee datos con LOAD DATA INFILE, las columnas vacas o inexistentes se rellenan con ''. Si quiere un valor NULL en una columna, usted deber utilizar \N en el archivo de datos. La palabra exacta NULL puede ser tambin utilizada en algunas circunstancias. Consulte Seccin 13.2.5, Sintaxis de LOAD DATA INFILE. Cuando utiliza DISTINCT, GROUP BY, o ORDER BY, todos los valores NULL son tratados como iguales. Cunado utilice ORDER BY, los valores NULL son mostrados al principio, o al final si se especifica DESC para ordenar de manera descendiente. Excepcin: De MySQL 4.0.2 hasta 4.0.10, los valores NULL se muestran primeros independientemente del orden. Las funciones de agregacin (resumen) como COUNT(), MIN(), y SUM() ignoran los valores NULL. La excepcin a esto es COUNT(*), que cuenta filas y no valores de columna individuales. Por ejemplo, la siguiente sentencia produce dos conteos. El primero es un recuento del nmero de registros en la tabla, y el segundo un recuento del nmero de valores diferentes a NULL en la columna age:
mysql> SELECT COUNT(*), COUNT(age) FROM person;
En algunos tipos de columnas, MySQL gestiona los valores NULL de manera especial. Si inserta un valor NULL en una columna TIMESTAMP, se insertan la fecha y hora actual. Si inserta un valor NULL en una columna entera que tiene el atributo AUTO_INCREMENT, se inserta el siguiente nmero en la secuencia.
Puede utilizar un alias para referirse a una columna en las clausulas GROUP BY, ORDER BY, o HAVING. Los alias tambin se puede utilizar para dar mejores nombres a las columnas:
SELECT SQRT(a*b) AS root FROM nombre_de_tabla GROUP BY root HAVING root > 0; SELECT id, COUNT(*) AS cnt FROM nombre_de_tabla GROUP BY id HAVING cnt > 0; SELECT id AS 'Customer identity' FROM nombre_de_tabla;
El SQL estndar no permite referirse a un alias de columna en una clausula WHERE. Esto es porque cuando se ejecuta el cdigo de WHERE, el valor de la columna podra no estar establecido an. Por ejemplo, la siguiente consulta es ilegal:
SELECT id, COUNT(*) AS cnt FROM nombre_de_tabla WHERE cnt > 0 GROUP BY id;
La sentencia WHERE se ejecuta para determinar qu registros sern incluidos en la parte de GROUP BY, as como HAVING se utiliza para decidir qu filas del conjunto de resultados deben utilizarse.
Estas tablas no transaccionales no se ven afectadas por la sentencia ROLLBACK. Si usted no estaba mezclando tablas transaccionales y no transaccionales deliberadamente en la transaccin, la razn ms probable para que este mensaje aparezca es que una tabla que usted pensaba que era transaccional no lo es realmente. Esto puede pasar si usted intenta crear una tabla utilizando un motor de almacenamiento que no est configurado en su servidor mysqld (o que fue desactivado con una opcin inicial). Si mysqld no tiene soporte para ese motor de almacenamiento, crea la tabla como una tabla MyISAM, que es no transaccional. Puede comprobar el tipo de una tabla utilizando cualquiera de las siguientes sentencias:
SHOW TABLE STATUS LIKE 'nombre_de_tabla'; SHOW CREATE TABLE nombre_de_tabla;
Consulte Seccin 13.5.4.18, Sintaxis de SHOW TABLE STATUS y Seccin 13.5.4.5, Sintaxis de SHOW CREATE TABLE. Puede consultar qu motores de almacenamiento soporta su servidor mysqld mediante la sentencia:
SHOW ENGINES;
Anteriormente a MySQL 4.1.2, la sentencia SHOW ENGINES no est disponible. Utilice la siguiente sentencia en su lugar y compruebe el valor de la variable que est asociada al motor de almacenamiento en el que est interesado:
SHOW VARIABLES LIKE 'have_%';
Por ejemplo, para determinar si el motor InnoDB est disponible, compruebe el valor de la variable have_innodb. Consulte Seccin 13.5.4.8, Sintaxis de SHOW ENGINES y Seccin 13.5.4.21, Sintaxis de SHOW VARIABLES.
1484
2. Borre (DELETE) los registros de la tabla principal basndose en la misma condicin. 3. DELETE FROM tabla_relacionada WHERE columna_relacionada IN (registros_seleccionados). Si la longitud total de la sentencia DELETE para tabla_relacionada es ms de 1MB (el valor por defecto de la variable de sistema max_allowed_packet), debera partirla en partes ms pequeas y ejecutar mltiples sentencias DELETE. Problablemente obtenga el borrado ms rpido especificando entre 100 y 1000 valores de columna_relacionada por sentencia si columna_relacionada est indexada. Si columna_relacionada no est indexada, la velocidad es independiente del nmero de argumentos en la clausula IN.
Enve el archivo de pruebas utilizando mysqlbug a la lista de correo general de MySQL. Consulte Seccin 1.6.1.1, Las listas de correo de MySQL.
1485
clculos sobre valores DECIMAL, en versiones previas a 5.0.3, eran realizadas utilizando operaciones de coma flotante. El siguiente ejemplo (para versiones anteriores a 5.0.3 de MySQL) demuestra el problema. Muestra que incluso para los tipos de columna DECIMAL, los clculos se realizan utilizando operaciones de coma flotante que estn sujetas al error. (En todas las versiones de MySQL, tendra problemas similares si reemplazara las columnas DECIMAL con FLOAT).
mysql> mysql> -> -> -> -> -> CREATE TABLE t1 (i INT, d1 DECIMAL(9,2), d2 DECIMAL(9,2)); INSERT INTO t1 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00), (2, 0.00, 0.00), (2, -13.20, 0.00), (2, 59.60, 46.40), (2, 30.40, 30.40), (3, 37.00, 7.40), (3, -29.60, 0.00), (4, 60.00, 15.40), (4, -10.60, 0.00), (4, -34.00, 0.00), (5, 33.00, 0.00), (5, -25.80, 0.00), (5, 0.00, 7.20), (6, 0.00, 0.00), (6, -51.40, 0.00);
mysql> SELECT i, SUM(d1) AS a, SUM(d2) 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 | +------+--------+-------+
El resultado es correcto. Aunque los cinco primeros registros aparentan no poder pasar la comparacin (los valores a y b no parecen ser diferentes), lo son porque la diferencia entre los dos nmeros se encuentra a partir del decimal nmero diez aproximadamente, dependiendo de la arquitectura de la computadora. A partir de MySQL 5.0.3, usted obtendra nicamente el ltimo registro en el resultado anterior. El problema no puede ser resulto utilizando funciones como ROUND() o similares, porque el resultado sigue siendo un nmero en coma flotante:
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 | +------+--------+-------+
Esta es la apariencia que los nmeros en la columna a tienen al mostrarse ms cifras decimales:
mysql> SELECT i, ROUND(SUM(d1), 2)*1.0000000000000000 AS a, -> ROUND(SUM(d2), 2) AS b FROM t1 GROUP BY i HAVING a <> b; +------+----------------------+-------+ | i | a | b | +------+----------------------+-------+ | 1 | 21.3999999999999986 | 21.40 | | 2 | 76.7999999999999972 | 76.80 | | 3 | 7.4000000000000004 | 7.40 | | 4 | 15.4000000000000004 | 15.40 | | 5 | 7.2000000000000002 | 7.20 | | 6 | -51.3999999999999986 | 0.00 | +------+----------------------+-------+
Dependiendo de la arquitectura de su computadora, usted puede que vea o no resultados similares. Diferentes procesadores pueden evaluar los nmeros en coma flotante de manera diferente. Por
1486
ejemplo, en algunas mquinas usted podra obtener los resultados correctos multiplicando ambos argumentos por 1, como en el siguiente ejemplo. Aviso: Nunca utilice este mtodo en sus aplicaciones. No es un ejemplo de procedimiento fiable.
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 razn por la que el ejemplo precedente parece funcionar es que en una mquina particular donde la prueba fue realizada, la aritmtica de coma flotante del procesador redondea los nmeros al mismo valor. No obstante, no hay ninguna regla que diga que un procesador deba hacerlo, as que este mtodo no merece confianza. La manera adecuada de hacer comparaciones en coma flotante es primero decidir una tolerancia aceptable para las diferencias entre los nmeros y realizar entonces las comparaciones sobre el valor de tolerancia. Por ejemplo, si estamos de acuerdo en que los nmeros en coma flotante deben ser considerados el mismo si estn dentro de una precisin de uno sobre diez mil (0.0001), la comparacin debera escribirse para encontrar diferencias mayores que el valor de tolerancia:
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)
De manera anloga, para obtener los registros en que los nmeros son iguales, la comparacin debera encontrar diferencias dentro del valor de tolerancia:
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 explicado con ms detalle en Seccin 7.2.1, Sintaxis de EXPLAIN (Obtener informacin acerca de un SELECT).
1487
Utilice ANALYZE TABLE nombre_de_tabla para actualizar las definiciones de claves de la tabla analizada. Consulte Seccin 13.5.2.1, Sintaxis de ANALYZE TABLE. Utilice FORCE INDEX sobre la tabla analizada para decirle a MySQL que los escaneos de tabla son muy costosos comparado con utilizar el ndice dado. Consulte Seccin 13.2.7, Sintaxis de SELECT.
SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;
USE INDEX y IGNORE INDEX podran tambin ser tiles. STRAIGHT_JOIN a nivel global y de tabla. Consulte Seccin 13.2.7, Sintaxis de SELECT. Puede adaptar variables globales o especficas de hilos de ejecucin. Por ejemplo, inicie mysqld con la opcin --max-seeks-for-key=1000 o utilice SET max_seeks_for_key=1000 para decirle al optimizador que asuma que ninguna rastreo de claves genera ms de 1000 bsquedas. Consulte Seccin 5.3.3, Variables de sistema del servidor.
En este caso, vaya al directorio de datos de MySQL y borre todos los archivos que tengan nombres que comiencen con A- o B-. (Quiz debera moverlos a algn otro lugar en vez de borrarlos directamente.) ALTER TABLE trabaja de la siguiente manera: Crea una tabla llamada A-xxx con los cambios estructurales demandados. Copia todas las filas de la tabla original en A-xxx. Renombra la tabla original a B-xxx. Renombra A-xxx a el nombre de tabla original. Borra B-xxx. Si algo falla durante la operacin de renombrado, MySQL intenta deshacer los cambios. Si algo falla seriamente (aunque esto no debera pasar), MySQL podra dejar la vieja tabla como B-xxx. Un renombrado simple de los archivos de tabla al nivel de sistema debera devolverle todos sus datos. Si usted utiliza ALTER TABLE en una tabla transaccional o si est utilizando Windows o OS/2, ALTER TABLE desbloquea la tabla si usted ha hecho un LOCK TABLE previo sobre ella. Esto es debido a que InnoDB y estos sistemas operativos no puede eliminar una tabla que est en uso.
1488
especificar el orden en el que quiere recoger sus datos. La primera de las siguiente sentencias retorna las columnas en el orden First, consider whether you really need to change the column order in a table. The whole point of SQL is to abstract the application from the data storage format. You should always specify the order in which you wish to retrieve your data. The first of the following statements returns columns in the order col_name1, col_name2, col_name3, mientras que la segunda las retorna en orden col_name1, col_name3, col_name2:
mysql> SELECT col_name1, col_name2, col_name3 FROM nombre_de_tabla; mysql> SELECT col_name1, col_name3, col_name2 FROM nombre_de_tabla;
Si usted decide cambiar el orden de las columnas de la tabla an as, debe hacerlo de la siguiente manera: 1. Cree una tabla con las columnas en el nuevo orden. 2. Ejecute esta sentencia:
mysql> INSERT INTO new_table -> SELECT columns-in-new-order FROM old_table;
SELECT * es muy til para consultas de prueba. No obstante, en una aplicacin, nunca debera utilizar SELECT * y despus recoger las columnas basndose en su posicin. El orden y posicin en que las columnas son devueltas no es el mismo si usted aade, mueve, o elimina columnas. Un cambio simple a la estructura de su tabla podra causar que su aplicacin falle.
La sentencia SHOW TABLES no muestra tablas TEMPORARY. No puede utilizar RENAME para renombrar una tabla TEMPORARY. No obstante, puede utilicer ALTER TABLE como alternativa:
mysql> ALTER TABLE orig_name RENAME new_name;
1489
Arreglado en MySQL 4.0: Evite utilizar espacios al final de los nombres de columna porque esto puede causar comportamientos inesperados. (Bug #4196) Arreglado en MySQL 4.0.12: Puede obtener un abrazo murtal (deadlock) si utiliza LOCK TABLE para bloquear mltiples tablas y luego en la misma conexin utiliza DROP TABLE para eliminar una de ellas mientras otro hilo est intentando bloquearla. (Para romper el abrazo mortal, puede utilizar KILL para matar cualquiera de los hilos implicados.) Arreglado en MySQL 4.0.11: SELECT MAX(key_column) FROM t1,t2,t3... donde una de las tablas est vaca no retorna NULL sino que retorna el valor mximo de la columna. DELETE FROM heap_table sin una clausula WHERE no funciona en uan tabla HEAP bloqueada.
1490
An cuando utilice lower_case_table_names=2 (que permite a MySQL recordar la diferencia entre maysculas y minsculas utilizada en los nombres de las bases de datos y las tablas), MySQL no la recuerda en los nombres de bases de datos al utilizar la funcin DATABASE() o en los diversos registro (en sistemas no sensibles a maysculas/minsculas). Eliminar una restriccin de FOREIGN KEY no funciona en una replicacin porque la restriccin puede tener otro nombre en el esclavo. REPLACE (y LOAD DATA con la opcin REPLACE) no dispara a ON DELETE CASCADE. DISTINCT con ORDER BY no funciona dentro de GROUP_CONCAT() si no utiliza todas y nicamente aquellas columnas que estn en la lista de DISTINCT. Si un usuario tiene una transaccin ejecutndose durante mucho tiempo y otro usuario elimina una tabla que es actualizada durante la transaccin, hay una pequea posibilidad de que el registro binario contenga el comando DROP TABLE antes de que dicha tabla sea utilizada en la transaccin. Planeamos arreglar esto haciendo que el comando DROP TABLE espera a que la tabla no sea utilizada en ninguna transaccin. Cuando se inserta un valor de entero grande (entre 2 y 2 1) en una columna decimal o de cadena de caracteres, se inserta con un valor negativo porque el nmero es evaluado en un contexto de entero con signo. FLUSH TABLES WITH READ LOCK no bloquea los COMMIT si el servidor se est ejecutando sin registro binario, lo que puede causar un problema (de consistencia entre tablas) cuando se hace una copia de seguridad completa. ANALYZE TABLE en una tabla BDB puede hacer que en algunos casos la tabla quede inutilizable hasta que reinicie mysqld. Si esto ocurre, busque los errores similares a este en el archivo de error de MySQL:
001207 22:07:56 bdb: log_flush: LSN past current end-of-log
63 64
No ejecute ALTER TABLE en una tabla BDB en la que usted est ejecutando transacciones de varias sentencias hasta que todas esas transacciones hayan sido completadas. (La transaccin podra ser ignorada.) ANALYZE TABLE, OPTIMIZE TABLE, y REPAIR TABLE podra causar problemas en tablas para las que usted est utilizando INSERT DELAYED. Realizar LOCK TABLE ... y FLUSH TABLES ... no garantiza que no haya una transaccin a medio ejecutar en progreso en la tabla. Las tablas BDB son relativamente lentas de abrir. Si usted tiene muchas tablas BDB en una base de datos, un cliente mysql podra tardar mucho en estar listo si no est utilizando la opcin -A o s est utilizando rehash. Esto es especialmente notable cuando tiene una cache de tablas grande. La replicacin utiliza registro a nivel de consulta: El maestro escribe las sentencias ejecutadas al registro binario. Este es un mtodo de registro muy rpido, compacto, y eficiente que trabaja de manera perfecta en la mayor parte de los casos. Es posible que los datos en el maestro y el esclavo difieran si una consulta se disea de manera que la modificacin de los datos sea no-determinista (generalmente no es una prctica recomendada, incluso sin hablar de replicacin). Por ejemplo: Las sentencias CREATE ... SELECT o INSERT ... SELECT que inserten valores cero o NULL en una columna AUTO_INCREMENT. DELETE, si usted est borrando registros de una tabla que tiene claves forneas con propiedad ON DELETE CASCADE.
1491
REPLACE ... SELECT, INSERT IGNORE ... SELECT si tiene valores de clave duplicados en los datos insertados. Si y nicamente si las sentencias precedentes no tienen una clausula ORDER BY garantizado un orden determinista. Por ejemplo, en INSERT ... SELECT sin un ORDER BY, el SELECT podra retornar registros en orden diferente (lo que resulta en una fila que termina teniendo diferente rango, es decir, obteniendo un nmero diferente en la columna AUTO_INCREMENT), dependiendo de las elecciones hechas por los optimizadores en el maestro y el esclavo. Una consulta est optimizada de manera diferente en el maestro y el esclavo slo s: Los archivos utilizados en las dos consultas no son exactamente los mismos; por ejemplo se ejecut OPTIMIZE TABLE en las tablas del maestro, pero no en las de los esclavos. (Para arreglar esto, OPTIMIZE TABLE, ANALYZE TABLE, y REPAIR TABLE se escriben en el registro binario a partir de MySQL 4.1.1). La tabla est almacenada utilizando un motor de almacenamiento diferente en el maestro que en el esclavo. (Es posible utilizar diferentes motores de almacenamiento en el maestro y el esclavo. Por ejemplo, puede utilizar InnoDB en el maestro, pero MyISAM en el esclavo, si el esclavo tiene menos espacio de disco disponible.) El tamao de buffer de MySQL (key_buffer_size, y dems) es diferente en el maestro y el esclavo. El maestro y el esclavo ejecutan versiones de MySQL diferentes, y el cdigo del optimizador difiere entra esas dos versiones. Este problema podra tambin afectar a la restauracin de bases de datos utilizando mysqlbinlog|mysql. La manera ms fcil de evitar este problema es aadir una clausula ORDER BY a las mencionadas consultas no-deterministas para asegurarse de que los registros son siempre almacenados o modificados en el mismo orden. En versiones futuras de MySQL, aadiremos automticamente una clausula ORDER BY all donde sea necesaria. Los siguientes problemas son conocidos y sern arreglados a su debido tiempo: Los nombres de archivo de los registros se basan en el nombre del servidor (si no especifica un nombre en la opcin de inicio). Tiene que utilizar opciones como --log-bin=old_host_namebin si usted cambia el nombre de su servidor. Otra opcin es renombrar los antiguos archivos para reflejar el cambio al nuevo nombre (si estos son registros binarios, debera editar el archivo de ndice del registro binario y arreglar los nombres tambin). Consulte Seccin 5.3.1, Opciones del comando mysqld. mysqlbinlog no borra los archivos temporales tras un comando LOAD DATA INFILE. Consulte Seccin 8.5, La utilidad mysqlbinlog para registros binarios. RENAME no funciona con tablas TEMPORARY o tablas utilizadas en una tabla MERGE. Debido a la manera en que los archivos de definicin de talba son almacenados, usted no puede utilizar el carcter 255 (CHAR(255)) en los nombres de tabla, columna, o enumeraciones. Esto ser arreglado previsiblemente en la versin 5.1, cuando implementemos un nuevo formato de archivo de definicin de tablas. Cuando utiliza SET CHARACTER SET, usted no puede utilizar caracteres traducidos en los nombres de base de datos, tabla y columna.
1492
No puede utilizar '_' o '%' con ESCAPE en LIKE ... ESCAPE. Si usted tiene una columna DECIMAL en la que el mismo nmero se almacena en diferentes formatos (por ejemplo, +01.00, 1.00, 01.00), GROUP BY puede tratar cada valor como uno diferente. No puede instalar el servidor en otro directorio cuando utiliza MIT-pthreads. Debido a que este problema requiere cambios en los hilos MIT-pthreads, no es probable que lo arreglemos. Consulte Seccin 2.8.5, Notas sobre MIT-pthreads. Los valores BLOB y TEXT no puede ser utilizados de manera fiablemente en GROUP BY, ORDER BY o DISTINCT. Solo los primeros max_sort_length se utilizan para comparar valores BLOB en estos casos. El valor por defecto de max_sort_length es 1024 y puede cambiarse en el momento de iniciar el servidor. A partir de MySQL 4.0.3, tambin puede cambiarse en tiempo de ejecucin. En versiones ms antiguas, una solucin alternativa es utilizar una subcadena de caracteres. Por ejemplo:
SELECT DISTINCT LEFT(blob_col,2048) FROM nombre_de_tabla;
Los clculos numricos son hechos con BIGINT o DOUBLE (ambos son normalmente de 64 bits de longitud). La precisin que usted obtenga depende de la funcin. La regla general es que las funciones de bit son realizadas con precisin de BIGINT, IF y ELT() con precisin BIGINT o DOUBLE, y el resto con precisin DOUBLE. Debera evitar utilizar valores sin signo largos si son ms grandes de 63 bits (9223372036854775807) para cualquier cosa que no sean campos de tipo bit. La versin 4.0 de MySQL tiene mejor gestin de BIGINT que 3.23. Puede tener hasta 255 columnas ENUM y SET en una tabla. En las funciones MIN(), MAX(), y otras funciones de agregacin, MySQL actualmente compara las columnas ENUM y SET por su valor de cadena decaracteres en vez de la posicin relativa de la cadena en el conjunto. mysqld_safe redirige todos los mensajes desde mysqld al registro mysqld. Un problema con esto es que si usted ejecuta mysqladmin refresh para cerrar y reabrir el registro, stdout y stderr son redirigidos todava al registro antiguo. Si usted utiliza --log a menudo, debera editar mysqld_safe para que almacene sus registros en host_name.err en vez de host_name.log de manera que pueda fcilmente recuperar el espacio borrando el registro antiguo y ejecutando mysqladmin refresh. En una sentencia UPDATE, las columnas son actualizadas de izquierda a drecha. Si se refiere a una columna actualizada, usted obtiene el valor actualizado en vez del original. Por ejemplo, la siguiente sentencia incrementa KEY en 2, no 1:
mysql> UPDATE nombre_de_tabla SET KEY=KEY+1,KEY=KEY+1;
Puede referirse a mltiples tablas temporales en la misma sentencia, pero no puede referirse a ninguna de ellas ms de una vez. Por ejemplo, lo siguiente no funciona:
mysql> SELECT * FROM temp_table, temp_table AS t2; ERROR 1137: Can't reopen table: 'temp_table'
El optimizador podra gestionar DISTINCT de manera diferente cuando est utilizando columnas ocultas en una join, y cuando no lo haga. En una join, las columnas ocultas se contan como parte del resultado (aunque no sean mostradas), mientras que en las consultas normales, las columnas ocultas no participan en la comparacin DISTINCT. Probalemente cambiemos esto en el futuro para que nunca se comparen las columnas ocultas al ejecutar DISTINCT. Un ejemplo de esto es:
SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id DESC;
and
1493
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;
En el segundo caso, al utilizar el servidor MySQL 3.23.x, podra obtener dos registros idnticos en el conjunto de resultados (porque los valores en las columnas id ocultas podran diferir). Tenga en cuenta que esto pasa solo en las consultas que no tienen columnas pertenecientes al ORDER BY en el resultado. Si ejecuta un PROCEDURE en una consulta que retorna un conjunto vaco, en algunos casos el PROCEDURE no transforma las columnas. La creacin de una tabla de tipo MERGE no comprueba si los tablas subyacentes son de tipos compatibles. Si utiliza ALTER TABLE para aadir un ndice UNIQUE a una tabla utilizada en una tabla MERGE y despus aade un ndice normal en la tabla MERGE, el orden de las claves es diferente para las tablas si haba una clave no-UNIQUE antigua en la tabla. Esto es porque ALTER TABLE pone ndices UNIQUE antes de los ndices normales para poder detectar claves duplicadas tan pronto como sea posible.
1494
Apndice B. Credits
Tabla de contenidos
B.1. B.2. B.3. B.4. B.5. B.6. B.7. Desarrolladores de MySQL AB ......................................................................................... Han contribuido a crear MySQL ........................................................................................ Documentadores y traductores ......................................................................................... Bibliotecas incluidas en MySQL y que MySQL utiliza ......................................................... Paquetes que soportan MySQL ........................................................................................ Herramientas utilizadas en la creacin de MySQL ............................................................. Han ayudado a MySQL .................................................................................................... 1495 1500 1504 1505 1506 1507 1507
Este apndice lista los desarrolladores, contribuidores, y gente que ha soportado y ayudado que MySQL sea lo que es hoy en da.
1495
Desarrolladores de MySQL AB
Testear nuevas caractersticas. Nuestro experto en Software Libre . Mantener la lista de mail (aunque nunca tiene tiempo para hacerlo bien...). Nuestro cdigo original de portabilidad (ahora con ms de 10 aos de antigedad). Hoy en da slo quedan algunas partes de mysys. Alguien a quien Monty pueda llamar a media noche cuando tiene nuevas funcionalidades listas. Jefe "Open Sourcerer" (relaciones con la comunidad MySQL). Jani Tolonen mysqlimport Muchas de las extensiones al cliente de lnea de comandos. PROCEDURE ANALYSE() Sinisa Milivojevic (ahora en soporte) Compresin (con zlib) en el protocolo cliente/servidor. Hashing perfecto para la fase de anlisis lxico. INSERT de mltiples registros Opcin mysqldump -e LOAD DATA LOCAL INFILE SQL_CALC_FOUND_ROWS SELECT opcin --max-user-connections=... opcin net_read y net_write_timeout GRANT/REVOKE y SHOW GRANTS FOR Nuevo protocolo cliente/servidor para 4.0 UNION en 4.0 DELETE/UPDATE de mltiples tablas. Tablas derivadas en 4.1 Administracin de recursos de usuario Desarrollo inicial de la API MySQL++ C++ y del cliente MySQLGUI . Tonu Samuel (antiguo desarrollador) Interfaz VIO (la base para el protocolo de cifrado entre cliente/servidor). MySQL Filesystem (forma de usar bases de datos MySQL como ficheros y directorios). La expresin CASE . Las funciones MD5() y COALESCE() .
1496
Desarrolladores de MySQL AB
Soporte RAID para tablas MyISAM . Sasha Pachev (antiguo desarrollador) Implementacin inicial de la replicacin (hasta la versin 4.0). SHOW CREATE TABLE. mysql-bench Matt Wagner MySQL test suite. Webmaster (hasta 2002). Miguel Solorzano (ahora en soporte) Desarrollo en Win32 y construccin de las versiones. Cdigo del servidor Windows NT. WinMySQLAdmin Timothy Smith (ahora en soporte) Soporte de conjuntos de caracteres dinmico. configure, RPMs y otras partes del sistema de compilacin. Desarrollo inicial de libmysqld, el servidor empotrado. Sergei Golubchik Bsqueda full-text . Claves aadidas a la biblioteca MERGE . Matemticas de precisin. Jeremy Cole (antiguo desarrollador) Comprobacin y edicin de este manual. ALTER TABLE ... ORDER BY .... UPDATE ... ORDER BY .... DELETE ... ORDER BY .... Indrek Siitan Desarrollo/programacin de nuestra interfaz Web. Autor del sistema de administracin del sistema de newsletters. Jorge del Conde (ahora en soporte) MySQLCC (MySQL Control Center) Desarrollo Win32 Implementacin inicial de los portales del sitio Web .
1497
Desarrolladores de MySQL AB
Venu Anuganti (antiguo desarrollador) MyODBC 3.51 Nuevo protocolo cliente/servidor para 4.1 (para comandos preparados). Arjen Lentz (ahora tratando la comunidad) Mantener el manual de referencia de MySQL Preparacin de la edicin impresa del manual de O'Reilly . Alexander (Bar) Barkov, Alexey (Holyfoot) Botchkov, y Ramil Kalimullin Data espacial (GIS) e implementacin de R-Trees para 4.1 Cdigos de caracteres y Unicode para 4.1; documentacin para lo mismo Oleksandr (Sanja) Byelkin Cach de consultas en 4.0 Implementacin de subconsultas (4.1). Implementacin de vistas y tablas derivadas (5.0). Aleksey (Walrus) Kishkin y Alexey (Ranger) Stroganov Diseo de pruebas de rendimiento y anlisis. Mantenimiento de la MySQL test suite. Zak Greant (antiguo empleado) Abogado Open Source , relaciones comunidad MySQL . Carsten Pedersen El programa de certificacin MySQL . Lenz Grimmer Ingeniera de produccin (construccin y publicacin). Peter Zaitsev Funciones SHA1(), AES_ENCRYPT() y AES_DECRYPT() . Depuracin de varias caractersticas. Alexander (Salle) Keremidarski Soporte. Depuracin. Per-Erik Martin Desarrollador jefe para procedimientos almacenados (5.0). Jim Winstead Antiguo desarrollador jefe Web. Mejorar el servidor, arreglar errores.
1498
Desarrolladores de MySQL AB
Mark Matthews Connector/J (Java). Peter Gulutzan Cumplimiento de estndares SQL . Documentacin de cdigo/algoritmos MySQL existentes. Documentacin de conjuntos de caracteres. Guilhem Bichot Replicacin, desde MySQL versin 4.0. Arregla tratamiento de exponentes para DECIMAL. Autor de mysql_tableinfo. Backup (en 5.1). Antony T. Curtis Portar el software de base de datos a OS/2. Mikael Ronstrom Mucho del trabajo inicial de NDB Cluster hasta 2000. Casi la mitad del cdigo base en aqul entonces. Protocolo de transacciones, recuperacin de nodos, reinicio del sistema y cdigo de reinicio y partes de la funcionalidades de la API. Arquitecto lider, desarrollador, depurador de NDB Cluster 1994-2004 Varias optimizaciones Jonas Oreland On-line Backup Entorno de test automtico de MySQL Cluster Biblioteca de portabilidad para NDB Cluster Muchas otras cosas Pekka Nouisiainen Implementacin de ndices ordenados de MySQL Cluster Soporte de BLOB en MySQL Cluster Soporte de conjuntos de caracteres para MySQL Cluster Martin Skold Implementacin de ndice nico en MySQL Cluster Integracin de NDB Cluster en MySQL Magnus Svensson Marco de test para MySQL Cluster
1499
Integracin de NDB Cluster en MySQL Tomas Ulin Trabajo en cambios de configuracin ara instalaciones simples y uso de MySQL Cluster Konstantin Osipov Comandos preparados. Cursores. Dmitri Lenev Soporte zona horaria. Disparadores (en 5.0).
1500
Yuri Dario Por mantener y extender el port MySQL OS/2 . Tim Bunce Autor de mysqlhotcopy. Zarko Mocnik <zarko.mocnik@dem.si> Ordenacin para idioma esloveno. "TAMITO" <tommy@valley.ne.jp> Las macros del conjunto de caracteres _MB y los conjuntos de caracteres ujis y sjis . Joshua Chamas <joshua@chamas.com> Base para inserciones concurrentes, sintaxis de fecha extendida, depuracin para NT, y responder las listas de correo de MySQL. Yves Carlier <Yves.Carlier@rug.ac.be> mysqlaccess, programa para mostrar los permisos de acceso para el usuario. Rhys Jones <rhys@wales.com> (Y GWE Technologies Limited) Por uno de los primeros JDBC drivers. Dr Xiaokun Kelvin ZHU <X.Zhu@brad.ac.uk> Desarrollo de uno de los primeros JDBC drivers y otras herramientas Java relacionadas con MySQL. James Cooper <pixel@organic.com> Preparacin de un histrico de lista de correo donde se puede buscar. Rick Mehalick <Rick_Mehalick@i-o.com> Para xmysql, cliente X grfico para MySQL Server. Doug Sisk <sisk@wix.com> Por proporcionar paquetes RPM de MySQL para Red Hat Linux. Diemand Alexander V. <axeld@vial.ethz.ch> Por proporcionar paquetes RPM de MySQL para Red Hat Linux-Alpha. Antoni Pamies Olive <toni@readysoft.es> Por proporcionar versiones RMP de muchos clientes MySQL para Intel y SPARC. Jay Bloodworth <jay@pathways.sde.state.sc.us> Por proporcionar versiones RPM para MySQL 3.21. David Sacerdote <davids@secnet.com> Ideas para chequeo seguro de nombres de equipo DNS. Wei-Jou Chen <jou@nematic.ieo.nctu.edu.tw> Soporte para caracteres chinos(BIG5).
1501
Wei He <hewei@mail.ied.ac.cn> Mucha funcionalidad para el conjunto de caracteres chino(GBK). Jan Pazdziora <adelton@fi.muni.cz> Ordenacin checa. Zeev Suraski <bourbon@netvision.net.il> FROM_UNIXTIME() formato temporal, funciones ENCRYPT() y consejos de bison . Miembro activo de la lista de correo. Luuk de Boer <luuk@wxs.nl> Port (y extendi) la suite de rendimiento a DBI/DBD. Ha sido de gran ayuda con crashme y ejecutando pruebas de rendimiento. Algunas nuevas funciones de fecha. El script mysql_setpermission . Alexis Mikhailov <root@medinf.chuvashia.su> Funciones definidas por el usuario (UDFs); CREATE FUNCTION y DROP FUNCTION. Andreas F. Bobak <bobak@relog.ch> La extensin AGGREGATE para funciones definidas por el usuario. Ross Wakelin <R.Wakelin@march.co.uk> Ayuda para preparar InstallShield para MySQL-Win32. Jethro Wright III <jetman@li.net> La biblioteca libmysql.dll . James Pereria <jpereira@iafrica.com> Mysqlmanager, una herramienta Win32 GUI para administrar MySQL Servers. Curt Sampson <cjs@portal.ca> Portar MIT-pthreads a NetBSD/Alpha y NetBSD 1.3/i386. Martin Ramsch <m.ramsch@computer.org> Ejemplos en el MySQL Tutorial. Steve Harvey Por hacer mysqlaccess ms seguro. Konark IA-64 Centre of Persistent Systems Private Limited http://www.pspl.co.in/konark/. Ayua con el port a Win64 de MySQL server. Albert Chin-A-Young. Configuracin de actualizaciones para Tru64, soporte para grandes ficheros y mejor soporte TCP para los wrappers . John Birrell Emulacin de pthread_mutex() para OS/2.
1502
Benjamin Pflugmann Tablas MERGE extendidas para tratar INSERTS. Miembro activo de la lista MySQL. Jocelyn Fournier Bsqueda y reporte de innumerables fallos (especialmente en el cdigo de MySQL 4.1 para subconsultas). Marc Liyanage Mantenimiento de paquetes Mac OS X packages y proporciona innumerable opinin sobre cmo crear Mac OS X PKGs. Robert Rutherford Proporciona informacin y opinin sobre el port the QNX. Desarrolladores anteriores de NDB Cluster Mucha gente se ha involucrado de muchas formas: estudiantes de verano, estudiantes de tesis, empleados.... En total ms de 100 personas, demasiados para mencionar aqu. Un nombre notable es el de Ataullah Dabaghi quin hasta 1999 contribuy acerda de un tercio del cdigo base. Tambin gracias especiales a los desarrolladores del sistema AXE que proporciona muchas de las bases arquitectnicas para el NDB Cluster con bloques, seales y traceo de errores. Tambin debe darse crdito a los que creyeron en nuestras ideas lo suficiente para dar parte de su presupuesto para este desarrollo desde 1992 hasta hoy. Otros contribuidores, buscadores de fallos y testeadores: 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. Y muchos buscadores/arregladores de fallos de las listas de correo. Un gran tributo para los que nos han ayudado a responder preguntas en las listas de MySQL : Daniel Koch <dkoch@amcity.com> Irix setup. Luuk de Boer <luuk@wxs.nl> Preguntas de rendimiento. Tim Sailer <tps@users.buoy.com> DBD::mysql preguntas. Boyd Lynn Gerber <gerberb@zenez.com> Preguntas relacionadas con SCO. Richard Mehalick <RM186061@shellus.com> Preguntas relacionadas con xmysql y preguntas bsicas de instalacin. Zeev Suraski <bourbon@netvision.net.il> Preguntas acerca del mdulo de configuracin de Apache (log & auth), preguntas sobre PHP, sobre sintaxis de SQL y otras preguntas generales. Francesc Guasch <frankie@citel.upc.es>
1503
Documentadores y traductores
Preguntas generales. Jonathan J Smith <jsmith@wtp.net> Preguntas especficas de SO Linux, sintaxis SQL y otras cosas que pueden necesitar algn trabajo. David Sklar <sklar@student.net> Uso de MySQL desde PHP y Perl. Alistair MacDonald <A.MacDonald@uel.ac.uk> No especificado todava, pero es flexible y puede tratar Linux y tal vez HP-UX. trata de que algn usuario lo use mysqlbug. John Lyon <jlyon@imag.net> Preguntas sobre instalar MySQL en Linux systems, usando ficheros .rpm o compilando desde las fuentes. Lorvid Ltd. <lorvid@WOLFENET.com> Temas de facturacin/licencias/soporte/copyright . Patrick Sherrill <patrick@coconet.com> Preguntas sobre interfaz ODBC y VisualC++. Randy Harmon <rjharmon@uptimecomputers.com> Preguntas sobre DBD, Linux, y sintaxis SQL .
1504
Therrien Gilbert <gilbert@ican.net>, Jean-Marc Pouyot <jmp@scalaire.fr> Mensajes de error en francs. Petr Snajdr, <snajdr@pvt.net> Mensajes de error en checo. Jaroslaw Lewandowski <jotel@itnet.com.pl> Mensajes de error en polaco. Miguel Angel Fernandez Roiz Mensajes de error en espaol. Roy-Magne Mo <rmo@www.hivolda.no> Mensajes de error en noruego y testeo de MySQL 3.21.xx. Timur I. Bakeyev <root@timur.tatarstan.ru> Mensajes de error en ruso. <brenno@dewinter.com> & Filippo Grassilli <phil@hyppo.com> Mensajes de error en italiano. Dirk Munzinger <dirk@trinity.saar.de> Mensajes de error en en alemn. Billik Stefan <billik@sun.uniag.sk> Mensajes de error en eslovaco. Stefan Saroiu <tzoompy@cs.washington.edu> Mensajes de error en rumano Peter Feher Mensajes de error en hngaro. Roberto M. Serqueira Mensajes de error en portugs. Carsten H. Pedersen Mensajes de error en dans. Arjen G. Lentz Mensajes de error en alemn, complentando una traduccin parcial (tambin trabaj en consistencia y deletreo).
1505
Por su excelente biblioteca en C para depurar y tracear. Monty ha hecho un nmero de pequeas mejoras a la biblioteca (velocidad y opciones adicionales). Richard A. O'Keefe Por su biblioteca de dominio pblico de cadenas. Henry Spencer Por su biblioteca regex, usada en WHERE column REGEXP regexp. Chris Provenzano Pthreads protables a nivel de usuario. Desde el copyright: este producto incluye software desarrollado por Chris Provenzano, la University of California, Berkeley, y contribuidores. Estamos usando actualmente la versin 1_60_beta6 parcheada por Monty (consulte mit-pthreads/ Changes-mysql). Jean-loup Gailly and Mark Adler Por la biblioteca zlib (usada por MySQL en Windows). Bjorn Benson Por su paquete safe_malloc (comprobador de memoria) seguro que se usa cuando configura MySQL con --debug. Free Software Foundation La biblioteca readline (usada por el cliente de lnea de comandos mysql ). The NetBSD foundation El paquete libedit (usado opcionalmente por el cliente de lnea de comandos mysql ).
1506
Giovanni Maruzzelli <maruzz@matrice.it> Por portar iODBC (Unix ODBC). Xavier Leroy <Xavier.Leroy@inria.fr> Autor de LinuxThreads (usado por el MySQL Server en Linux).
1507
FutureQuest --skip-show-database
1508
1509
C.4. MySQL Visual Studio Plugin Change History ..................................................................... C.4.1. Changes in MySQL Visual Studio Plugin 1.0.2 (Not yet released) ............................. C.4.2. Changes in MySQL Visual Studio Plugin 1.0.1 (4 October 2006) .............................. C.4.3. Changes in MySQL Visual Studio Plugin 1.0.0 (4 October 2006) .............................. C.5. MySQL Connector/J Change History ................................................................................. C.5.1. Changes in MySQL Connector/J 5.1.x .................................................................... C.5.2. Changes in MySQL Connector/J 5.0.x .................................................................... C.5.3. Changes in MySQL Connector/J 3.1.x .................................................................... C.5.4. Changes in MySQL Connector/J 3.0.x .................................................................... C.5.5. Changes in MySQL Connector/J 2.0.x .................................................................... C.5.6. Changes in MySQL Connector/J 1.2b (04 July 1999) .............................................. C.5.7. Changes in MySQL Connector/J 1.2.x and lower ....................................................
1573 1573 1573 1573 1573 1573 1574 1577 1594 1606 1610 1611
This appendix lists the changes in the MySQL source code for version 5.1.0 and later releases. For information about changes in previous versions of the MySQL database software, see the Manual de referencia de MySQL 4.1, which provides coverage of the 3.22, 3.23, 4.0, and 4.1 series of releases. We are working actively on MySQL 5.0 and 5.1, and provide only critical bugfixes for MySQL 4.1, 4.0, and MySQL 3.23. We update this section as we add new features, so that everybody can follow the development. Note that we tend to update the manual at the same time we make changes to MySQL. If you find a recent version of MySQL listed here that you can't find on our download page (http://dev.mysql.com/ downloads/), it means that the version has not yet been released. The date mentioned with a release version is the date of the last BitKeeper ChangeSet on which the release was based, not the date when the packages were made available. The binaries are usually made available a few days after the date of the tagged ChangeSet, because building and testing all packages takes some time.
1510
Strict mode, which in essence means that you get an error instead of a warning when inserting an incorrect value into a column. See Seccin 5.3.2, El modo SQL del servidor. VARCHAR and VARBINARY columns remember end space. A VARCHAR() or VARBINARY column can contain up to 65,535 characters or bytes, respectively. MEMORY (HEAP) tables can have VARCHAR() columns. When using a constant string or a function that generate a string result in CREATE ... SELECT, MySQL creates the result field based on the max_length of the string/expression: max_length =0 < 512 >= 512 Column type CHAR(0) VARCHAR(max_length) TEXT
For a full list of changes, please refer to the changelog sections for each individual 5.0.x release.
1511
In stored procedures, a cursor that fetched an empty string into a variable would set the variable to NULL instead. (Bug #8692) A trigger dependent on a feature of one SQL_MODE setting would cause an error when invoked after the SQL_MODE was changed. (Bug #5891) A delayed insert that would duplicate an existing record crashed the server instead. (Bug #12226) ALTER TABLE when SQL_MODE = 'TRADITIONAL' gave rise to an invalid error message. (Bug #11964) On AMD64, attempting to repair a MyISAM table with a full-text index would crash the server. (Bug #11684) The MySQL Cluster backup log was invalid where the number of Cluster nodes was not equal to a power of 2. (Bug #11675) GROUP_CONCAT() sometimes returned a result with a different collation that that of its arguments. (Bug #10201) The LPAD() and RPAD() functions returned the wrong length to mysql_fetch_fields(). (Bug #11311) A UNIQUE VARCHAR column would be mis-identified as MUL in table descriptions. (Bug #11227) Incorrect error message displayed if user attempted to create a table in a non-existing database using CREATE database_name.table_name syntax. (Bug #10407) InnoDB: Do not flush after each write, not even before setting up the doublewrite buffer. Flushing can be extremely slow on some systems. (Bug #12125) InnoDB: True VARCHAR: Return NULL columns in the format expected by MySQL. (Bug #12186)
1512
MySQL Cluster: A new -p option is available for use with the ndb_mgmd client. When called with this option, ndb_mgmd prints all configuration data to stdout, then exits. The namespace for triggers has changed. Previously, trigger names had to be unique per table. Now they must be unique within the schema (database). An implication of this change is that DROP TRIGGER syntax now uses a schema name instead of a table name (schema name is optional and, if omitted, the current schema will be used). Note: When upgrading from a previous version of MySQL 5 to MySQL 5.0.10 or newer, you must drop all triggers before upgrading and re-create them after or DROP TRIGGER will not work after the upgrade. (Bug #5892) Bugs fixed: NDB: Attempting to create or drop tables during a backup would cause the cluster to shut down. (Bug #11942) When attempting to drop a table with a broken unique index, NDB failed to drop the table and erroneously report that the table was unknown. (Bug #11355) SELECT ... NOT IN() gave unexpected results when only static value present between the (). (Bug #11885) Fixed compile error when using GCC4 on AMD64. (Bug #12040) NDB ignored the Hostname option in the NDBD DEFAULT section of the Cluster configuration file. (Bug #12028) SHOW PROCEDURE/FUNCTION STATUS didn't work for users with limited access. (Bug #11577) MySQL server would crash is a fetch was performed after a ROLLBACK when cursors were involved. (Bug #10760) The temporary tables created by an ALTER TABLE on a cluster table were visible to all MySQL servers. (Bug #12055) NDB_MGMD was leaking file descriptors. (Bug #11898) IP addresses not shown in ndb_mgm SHOW command on second ndb_mgmd (or on ndb_mgmd restart). (Bug #11596) Functions that evaluate to constants (such as NOW() and CURRENT_USER() were being evaluated in the definition of a VIEW rather than included verbatim. (Bug #4663) Execution of SHOW TABLES failed to increment the Com_show_tables status variable. (Bug #11685) For execution of a stored procedure that refers to a view, changes to the view definition were not seen. The procedure continued to see the old contents of the view. (Bug #6120) For prepared statements, the SQL parser did not disallow ? parameter markers immediately adjacent to other tokens, which could result in malformed statements in the binary log. (For example, SELECT * FROM t WHERE? = 1 could become SELECT * FROM t WHERE0 = 1.) (Bug #11299) When two threads compete for the same table, a deadlock could occur if one thread has also a lock on another table through LOCK TABLES and the thread is attempting to remove the table in some manner and the other thread want locks on both tables. (Bug #10600) Aliasing the column names in a VIEW did not work when executing a SELECT query on the VIEW. (Bug #11399) Performing an ORDER BY on a SELECT from a VIEW produced unexpected results when VIEW and underlying table had the same column name on different columns. Bug #11709)
1513
The C API function mysql_statement_reset() did not clear error information. (Bug #11183) When used within a subquery, SUBSTRING() returned an empty string. (Bug #10269) Multiple-table UPDATE queries using CONVERT_TZ() would fail with an error. (Bug #9979) mysql_fetch_fields() returned incorrect length information for MEDIUM and LONG TEXT and BLOB columns. (Bug #9735) mysqlbinlog was failing the test suite on Windows due to BOOL being incorrectly cast to INT. (Bug #11567) NDBCLuster: Server left core files following shutdown if data nodes had failed. (Bug #11516) Creating a trigger in one database that references a table in another database was being allowed without generating errors. (Bug #8751) Duplicate trigger names were allowed within a single schema. (Bug #6182) Server did not accept some fully-qualified trigger names. (Bug #8758) The traditional SQL mode accepted invalid dates if the date value provided was the result of an implicit type conversion. (Bug #5906) The MySQL server had issues with certain combinations of basedir and datadir. (Bug #7249) INFORMATION_SCHEMA.COLUMNS had some inaccurate values for some data types. (Bug #11057) LIKE pattern matching using prefix index didn't return correct result. (Bug #11650) For several character sets, MySQL incorrectly converted the character code for the division sign to the eucjpms character set. (Bug #11717) When invoked within a view, SUBTIME() returned incorrect values. (Bug #11760) SHOW BINARY LOGS displayed a file size of 0 for all log files but the current one if the files were not located in the data directory. (Bug #12004) Server-side prepared statements failed for columns with a character set of ucs2. (Bug #9442) References to system variables in an SQL statement prepared with PREPARE were evaluated during EXECUTE to their values at prepare time, not to their values at execution time. (Bug #9359) For server shutdown on Windows, error messages of the form Forcing close of thread n user: 'name' were being written to the error log. Now connections are closed more gracefully without generating error messages. (Bug #7403) Increased the version number of the libmysqlclient shared library from 14 to 15 because it is binary incompatible with the MySQL 4.1 client library. (Bug #11893) A recent optimizer change caused DELETE WHERE NOT LIKE and DELETE WHERE NOT BETWEEN to not properly identify the rows to be deleted. (Bug #11853) Within a stored procedure that selects from a table, invoking another procedure that requires a write lock for the table caused that procedure to fail with a message that the table was read-locked. (Bug #9565) Within a stored procedure, selecting from a table through a view caused subsequent updates to the table to fail with a message that the table was read-locked. (Bug #9597) For a stored procedure defined with SQL SECURITY DEFINER characteristic, CURRENT_USER() incorrectly reported the use invoking the procedure, not the user who defined it. (Bug #7291) Creating a table with a SET or ENUM column with the DEFAULT 0 clause caused a server crash if the table's character set was utf8. (Bug #11819)
1514
With strict SQL mode enabled, ALTER TABLE reported spurious Invalid default value messages for columns that had no DEFAULT clause. (Bug #9881) In SQL prepared statements, comparisons could fail for values not equally space-padded. For example, SELECT 'a' = 'a '; returns 1, but PREPARE s FROM 'SELECT ?=?'; SET @a = 'a', @b = 'a '; PREPARE s FROM 'SELECT ?=?'; EXECUTE s USING @a, @b; incorrectly returned 0. (Bug #9379) Labels in stored routines did not work if the character set was not latin1. (Bug #7088) Invoking the DES_ENCRYPT() function could cause a server crash if the server was started without the --des-key-file option. (Bug #11643) The server crashed upon execution of a statement that used a stored function indirectly (via a view) if the function was not yet in the connection-specific stored routine cache and the statement would update a Handler_xxx status variable. This fix allows the use of stored routines under LOCK TABLES without explicitly locking the mysql.lock table. However, you cannot use mysql.proc in statements that will combine locking of it with modifications for other tables. (Bug #11554) The server crashed when dropping a trigger that invoked a stored procedure, if the procedure was not yet in the connection-specific stored routine cache. (Bug #11889) Selecting the result of an aggregate function for an ENUM or SET column within a subquery could result in a server crash. (Bug #11821) Incorrect column values could be retrieved from views defined using statements of the form SELECT * FROM tbl_name. (Bug #11771) The mysql.proc table was not being created properly with the proper utf8 character set and collation, causing server crashes for stored procedure operations if the server was using a multi-byte character set. To take advantage of the bug fix, mysql_fix_privileges_tables should be run to correct the structure of the mysql.proc table. (Bug #11365) Execution of a prepared statement that invoked a non-existent or dropped stored routine would crash the server. (Bug #11834) Executing a statement that invoked a trigger would cause problems unless a LOCK TABLES was first issued for any tables accessed by the trigger. Note: The exact nature of the problem depended upon the MySQL 5.0 release being used: prior to 5.0.3, this resulted in a crash; from 5.0.3 to 5.0.7, MySQL would issue a warning; in 5.0.9, the server would issue an error. (Bug #8406) The same issue caused LOCK TABLES to fail following UNLOCK TABLES if triggers were involved. (Bug #9581) In a shared Windows environment, MySQL could not find its configuration file unless the file was in the C:\ directory. (Bug #5354)
1515
InnoDB: Make innodb_thread_concurrency=20 by default. Bypass the concurrency checking if the setting is greater than or equal to 20. InnoDB: Make CHECK TABLE killable. (Bug #9730) Recursion in stored routines is now disabled because it was crashing the server. We plan to modify stored routines to allow this to operate safely in a future release. (Bug #11394) The handling of BIT columns has been improved, and should now be much more reliable in a number of cases. (Bug #10617, Bug #11091, Bug #11572) Bugs fixed: SHOW CREATE VIEW did not take the ANSI MODE into account when quoting identifiers. (Bug #6903) The mysql_config script did not handle symbolic linking properly. (Bug #10986) Incorrect results when using GROUP BY ... WITH ROLLUP on a VIEW. (Bug #11639) Instances of the VAR_SAMP() function in view definitions were converted to VARIANCE(). This is incorrect because VARIANCE() is the same as VAR_POP(), not VAR_SAMP(). (Bug #10651) mysqldump failed when reloading a view if the view was defined in terms of a different view that had not yet been reloaded. mysqldump now creates a dummy table to handle this case. (Bug #10927) mysqldump could crash for illegal or nonexistent table names. (Bug #9358) The --no-data option for mysqldump was being ignored if table names were given after the database name. (Bug #9558) The --master-data option for mysqldump resulted in no error if the binary log was not enabled. Now an error occurs unless the --force option is given. (Bug #11678) DES_ENCRYPT() and DES_DECRYPT() require SSL support to be enabled, but were not checking for it. Checking for incorrect arguments or resource exhaustion was also improved for these functions. (Bug #10589) When used in joins, SUBSTRING() failed to truncate to zero any string values that could not be converted to numbers. (Bug #10124) mysqldump --xml did not format NULL column values correctly. (Bug #9657) There was a compression algorithm issue with myisampack for very large datasets (where the total size of of all records in a single column was on the order of 3 GB or more) on 64-bit platforms. (A fix for other platforms was made in MySQL 5.0.6.) (Bug #8321) Temporary tables were created in the data directory instead of tmpdir. (Bug #11440) MySQL would not compile correctly on QNX due to missing rint() function. (Bug #11544) A SELECT DISTINCT col_name would work correctly with a MyISAM table only when there was an index on col_name. (Bug #11484) The server would lose table-level CREATE VIEW and SHOW VIEW privileges following a FLUSH PRIVILEGES or server restart. (Bug #9795) In strict mode, an INSERT into a view that did not include a value for a NOT NULL column but that did include a WHERE test on the same column would succeed, This happened even though the INSERT should have been prevented due to the failure to supply a value for the NOT NULL column. (Bug #6443) Running a CHECK TABLES on multiple views crashed the server. (Bug #11337)
1516
When a table had a primary key containing a BLOB column, creation of another index failed with the error BLOB/TEXT column used in key specification without keylength, even when the new index did not contain a BLOB column. (Bug #11657) NDB Cluster: When trying to open a table that could not be discovered or unpacked, cluster would return error codes which the MySQL server falsely interpreted as operating system errors. (Bug #103651) Manually inserting a row with host='' into mysql.tables_priv and performing a FLUSH PRIVILEGES would cause the server to crash. (Bug #11330) A cursor using a query with a filter on a DATE or DATETIME column would cause the server to crash server after the data was fetched. (Bug #11172) Closing a cursor that was already closed would cause MySQL to hang. (Bug #9814) Using CONCAT_WS on a column set NOT NULL caused incorrect results when used in a LEFT JOIN. (Bug #11469) Signed BIGINT would not accept -9223372036854775808 as a DEFAULT value. (Bug #11215) Views did not use indexes on all appropriate queries. (Bug #10031) For MEMORY tables, it was possible for for updates to be performed using outdated key statistics when the updates involved only very small changes in a very few rows. This resulted in the random failures of queries such as UPDATE t SET col = col + 1 WHERE col_key = 2; where the same query with no WHERE clause would succeed. (Bug #10178) Optimizer performed range check when comparing unsigned integers to negative constants, could cause errors. (Bug #11185) Wrong comparison method used in VIEW when relaxed date syntax used (i.e. 2005.06.10). (Bug #11325) The ENCRYPT() and SUBSTRING_INDEX() functions would cause errors when used with a VIEW. (Bug #7024) Clients would hang following some errors with stored procedures. (Bug #9503) Combining cursors and subselects could cause server crash or memory leaks. (Bug #10736) If a prepared statement cursor is opened but not completely fetched, attempting to open a cursor for a second prepared statement will fail. (Bug #10794)
1517
unambiguously reference a column of the table resulting from the query's FROM clause, and allowing columns from the SELECT clause to be used as grouping columns is a MySQL extension to the standard. By way of example, consider the following table:
CREATE TABLE users ( userid INT NOT NULL PRIMARY KEY, username VARCHAR(25), usergroupid INT NOT NULL );
However, the SQL standard requires that the column name be used, as shown here:
SELECT usergroupid AS id, COUNT(userid) AS number_of_users FROM users GROUP BY usergroupid;
Queries such as the first of the two shown above will continue to be supported in MySQL; however, beginning with MySQL 5.0.8, using a column alias in this fashion will generate a warning. Note that in the event of a collision between column names and/or aliases used in joins, MySQL attempts to resolve the conflict by giving preference to columns arising from tables named in the query's FROM clause. (Bug #11211) The granting or revocation of privileges on a stored routine is no longer performed when running the server with --skip-grant-tables even after the statement SET @@global.automatic_sp_privileges=1; has been executed. (Bug #9993) Added support for B'10' syntax for bit literal. (Bug #10650) Bugs fixed: Security fix: On Windows systems, a user with any of the following privileges REFERENCES CREATE TEMPORARY TABLES GRANT OPTION CREATE SELECT on *.* could crash mysqld by issuing a USE LPT1; or USE PRN; command. In addition, any of the commands USE NUL;, USE CON;, USE COM1;, or USE AUX; would report success even though the database was not in fact changed. Note: Although this bug was thought to be fixed previously, it was later discovered to be present in the MySQL 5.0.7-beta release for Windows. (Bug #9148, CVE-2005-0799) A CREATE TABLE db_name.tbl_name LIKE ... statement would crash the server when no database was selected. (Bug #11028) SELECT DISTINCT queries or GROUP BY queries without MIN() or MAX() could return inconsistent results for indexed columns. (Bug #11044) The SHOW INSTANCE OPTIONS command in MySQL Instance Manager displayed option values incorrectly for options for which no value had been given. (Bug #11200)
1518
An outer join with an empty derived table (a result from a subquery) returned no result. (Bug #11284) An outer join with an ON condition that evaluated to false could return an incorrect result. (Bug #11285) mysqld_safe would sometimes fail to remove the pid file for the old mysql process after a crash. As a result, the server would fail to start due to a false A mysqld process already exists... error. (Bug #11122) CAST( ... AS DECIMAL) didn't work for strings. (Bug #11283) NULLIF() function could produce incorrect results if first argument is NULL. (Bug #11142) Setting @@SQL_MODE = NULL caused an erroneous error message. (Bug #10732) Converting a VARCHAR column having an index to a different type (such as TINYTEXT) gave rise to an incorrect error message. (Bug #10543) Note that this bugfix induces a slight change in the behaviour of indexes: If an index is defined to be the same length as a field (or is left to default to that field's length), and the length of the field is later changed, then the index will adopt the new length of the field. Previously, the size of the index did not change for some field types (such as VARCHAR) when the field type was changed. sql_data_access column of routines table of INFORMATION_SCHEMA was empty. (Bug #11055) A CAST() value could not be included in a VIEW. (Bug #11387) Server crashed when using GROUP BY on the result of a DIV operation on a DATETIME value. (Bug #11385) Possible NULL values in BLOB columns could crash the server when a BLOB was used in a GROUP BY query. (Bug #11295) Fixed 64 bit compiler warning for packet length in replication. (Bug #11064) Multiple range accesses in a subquery cause server crash. (Bug #11487) An issue with index merging could cause suboptimal index merge plans to be chosen when searching by indexes created on DATE columns. The same issue caused the InnoDB storage engine to issue the warning using a partial-field key prefix in search. (Bug #8441) The mysqlhotcopy script was not parsing the output of SHOW SLAVE STATUS correctly when called with the --record_log_pos option. (Bug #7967) SELECT * FROM table returned incorrect results when called from a stored procedure, where table had a primary key. (Bug #10136) When used in defining a view, the TIME_FORMAT() function failed with calculated values, for example, when passed the value returned by SEC_TO_TIME(). (Bug #7521) SELECT DISTINCT ... GROUP BY constant returned multiple rows (it should return a single row). (Bug #8614) INSERT INTO SELECT FROM view produced incorrect result when using ORDER BY. (Bug #11298) Fixed hang/crash with Boolean full-text search where a query contained more query terms that onethird of the query length (it could be achieved with truncation operator: 'a*b*c*d*'). (Bug #7858) Fixed column name generation in VIEW creation to ensure there are no duplicate column names. (Bug #7448)
1519
An ORDER BY clause sometimes had no effect on the ordering of a result when selecting specific columns (as opposed to using SELECT *) from a view. (Bug #7422) Some data definition statements (CREATE TABLE where the table was not a temporary table, TRUNCATE TABLE, DROP DATABASE, and CREATE DATABASE) were not being written to the binary log after a ROLLBACK. This also caused problems with replication. (Bug #6883) Calling a stored procedure that made use of an INSERT ... SELECT ... UNION SELECT ... query caused a server crash. (Bug #11060) Selecting from a view defined using SELECT SUM(DISTINCT ...) caused an error; attempting to execute a SELECT * FROM INFORMATION_SCHEMA.TABLES query after defining such a view crashed the server. (Bug #7015) The mysql client would output a prompt twice following input of very long strings, because it incorrectly assumed that a call to the _cgets() function would clear the input buffer. (Bug #10840) A three byte buffer overflow in the client functions caused improper exiting of the client when reading a command from the user. (Bug #10841) Fixed a problem where a stored procedure caused a server crash if the query cache was enabled. (Bug #9715) SHOW CREATE DATABASE INFORMATION_SCHEMA returned an unknown database error. (Bug #9434) Corrected a problem with IFNULL() returning an incorrect result on 64-bit systems. (Bug #11235) Fixed a problem resolving table names with lower_case_table_names=2 when the table name lettercase differed in the FROM and WHERE clauses. (Bug #9500) Fixed server crash due to some internal functions not taking into account that for multi-byte character sets, CHAR columns could exceed 255 bytes and VARCHAR columns could exceed 65,535 bytes. (Bug #11167) Fixed locking problems for multiple-statement DELETE statements performed within a stored routine, such as incorrectly locking a to-be-modified table with a read lock rather than a write lock. (Bug #11158) Fixed a portability problem testing for crypt() support that caused compilation problems when using OpenSSL/yaSSL on HP-UX and Mac OS X. (Bug #10675, Bug #11150) The hostname cache was not working. (Bug #10931) On Windows, mysqlshow did not interpret wildcard characters properly if they were given in the table name argument. (Bug #10947) Using PREPARE to prepare a statement that invoked a stored routine that deallocated the prepared statement caused a server crash. This is prevented by disabling dynamic SQL within stored routines. (Bug #10975) Default hostname for MySQL server was always mysql. (Bug #11174) Using PREPARE to prepare a statement that invoked a stored routine that executed the prepared statement caused a Packets out of order error the second time the routine was invoked. This is prevented by disabling dynamic SQL within stored routines. (Bug #7115) Using prepared statements within a stored routine (PREPARE, EXECUTE, DEALLOCATE) could cause the client connection to be dropped after the routine returned. This is prevented by disabling dynamic SQL within stored routines. (Bug #10605) When using a cursor with a prepared statement, the first execution returned the correct result but was not cleaned up properly, causing subsequent executions to return incorrect results. (Bug #10729)
1520
MySQL Cluster: Connections between data nodes and management nodes were not being closed following shutdown of ndb_mgmd. (Bug #11132) MySQL Cluster: mysqld processes would not reconnect to cluster following restart of ndb_mgmd. (Bug #11221) MySQL Cluster: Fixed problem whereby data nodes would fail to restart on 64-bit Solaris (Bug #9025) MySQL Cluster: Calling ndb_select_count() crashed the cluster when running on Red Hat Enterprise 4/64-bit/Opteron. (Bug #10058) MySQL Cluster: Insert records were incorrectly applied by ndb_restore, thus making restoration from backup inconsistent if the binlog contained inserts. (Bug #11166) MySQL Cluster: Cluster would time out and crash after first query on 64-bit Solaris 9. (Bug #8918) MySQL Cluster: ndb_mgm client show command displayed incorrect output after master data node failure. (Bug #11050) MySQL Cluster: A delete performed as part of a transaction caused an erroneous result. (Bug #11133) MySQL Cluster: Not allowing sufficient parallelism in cluster configuration (e.g. NoOfTransactions too small) caused ndb_restore to fail without providing any error messages. (Bug #10294) MySQL Cluster: When using dynamically allocated ports on Linux, cluster would hang on initial startup. (Bug #10893) MySQL Cluster: Setting TransactionInactiveTimeout= 0 did not result in an infinite timeout. (Bug #11290) InnoDB: Enforce maximum CHAR_LENGTH() of UTF-8 data in ON UPDATE CASCADE. (Bug #10409) InnoDB: Pad UTF-8 variable-length CHAR columns with 0x20. Pad UCS2 CHAR columns with 0x0020. (Bug #10511)
1521
Improved the optimizer to be able to use indexes for expressions of the form indexed_col NOT IN (val1, val2, ...) and indexed_col NOT BETWEEN val1 AND val2.. (Bug #10561) Removed mysqlshutdown.exe and mysqlwatch.exe from the Windows No Installer distribution (they had already been removed from the With Installer distribution before). Removed those programs from the source distribution. Removed WinMySQLAdmin from the source distribution and from the No Installer Windows distribution (it had already been removed from the With Installer distribution before). InnoDB: In stored procedures and functions, InnoDB no longer takes full explicit table locks for every involved table. Only `intention' locks are taken, similar to those in the execution of an ordinary SQL statement. This greatly reduces the number of deadlocks. Bugs fixed: Security update: A user with limited privileges could obtain information about the privileges of other users by querying objects in the INFORMATION_SCHEMA database for which that user did not have the requisite privileges. (Bug #10964) Triggers with dropped functions caused crashes. (Bug #5893) Failure of a BEFORE trigger did not prevent the triggering statement from performing its operation on the row for which the trigger error occurred. Now the triggering statement fails as described in Seccin 20.3, Utilizacin de disparadores. (Bug #10902) Issuing a write lock for a table from one client prevented other clients from accessing the table's metadata. For example, if one client issued a LOCK TABLES mydb.mytable WRITE, then a second client attempting to execute a USE mydb; would hang. (Bug #9998) The LAST_DAY() failed to return NULL when supplied with an invalid argument. See Seccin 12.5, Funciones de fecha y hora. (Bug #10568) The functions COALESCE(), IF(), and IFNULL() performed incorrect conversions of their arguments. (Bug #9939) The TIME_FORMAT() function returned incorrect results with some format specifiers. See Seccin 12.5, Funciones de fecha y hora. (Bug #10590) Dropping stored routines when the MySQL server had been started with --skip-grant-tables generated extraneous warnings. (Bug #9993) A problem with the my_global.h file caused compilation of MySQL to fail on single-processor Linux systems running 2.6 kernels. (Bug #10364) The ucs2_turkish_ci collation failed with upper('i'). UPPER/LOWER now can return a string with different length. (Bug #8610) OPTIMIZE of InnoDB table does not return 'Table is full' if out of tablespace. (Bug #8135) GROUP BY queries with ROLLUP returned wrong results for expressions containing group by columns. (Bug #7894) Fixed bug in FIELD() function where value list contains NULL. (Bug #10944) Corrected a problem where an incorrect column type was returned in the result set metadata when using a prepared SELECT DISTINCT statement to select from a view. (Bug #11111) Fixed bug in the MySQL Instance manager that caused the version to always be unknown when SHOW INSTANCE STATUS was issued. (Bug #10229) Using ORDER BY to sort the results of an IF() that contained a FROM_UNIXTIME() expression returned incorrect results due to integer overflow. (Bug #9669)
1522
Fixed a server crash resulting from accessing InnoDB tables within stored functions. This is handled by prohibiting statements that do an explicit or explicit commit or rollback within stored functions or triggers. (Bug #10015) Fixed a server crash resulting from the second invocation of a stored procedure that selected from a view defined as a join that used ON in the join conditions. (Bug #6866) Using ALTER TABLE for a table that had a trigger caused a crash when executing a statement that activated the trigger, and also a crash later with USE db_name for the database containing the table. (Bug #5894) Fixed a server crash resulting from an attempt to allocate too much memory when GROUP BY blob_col and COUNT(DISTINCT) were used. (Bug #11088) Fixed a portability problem for compiling on Windows with Visual Studio 6. (Bug #11153) The incorrect sequence of statements HANDLER tbl_name READ index_name NEXT without a preceding HANDLER tbl_name READ index_name = (value_list) for an InnoDB table resulted in a server crash rather than an error. (Bug #5373) On Windows, with lower_case_table_names set to 2, using ALTER TABLE to alter a MEMORY or InnoDB table that had a mixed-case name also improperly changed the name to lowercase. (Bug #9660) The server timed out SSL connections too quickly on Windows. (Bug #8572) Executing LOAD INDEX INTO CACHE for a table while other threads where selecting from the table caused a deadlock. (Bug #10602) Fixed a server crash resulting from CREATE TABLE ... SELECT that selected from a table being altered by ALTER TABLE. (Bug #10224) The FEDERATED storage engine properly handled outer joins, but not inner joins. (Bug #10848) Consistently report INFORMATION_SCHEMA table names in uppercase in SHOW TABLE STATUS output. (Bug #10059) Fixed a failure of WITH ROLLUP to sum values properly. (Bug #10982) Triggers were not being activated for multiple-table UPDATE or DELETE statements. (Bug #5860) INSERT BEFORE triggers were not being activated for INSERT ... SELECT statements. (Bug #6812) INSERT BEFORE triggers were not being activated for implicit inserts (LOAD DATA). (Bug #8755) If a stored function contained a FLUSH statement, the function crashed when invoked. FLUSH now is disallowed within stored functions. (Bug #8409) Multiple-row REPLACE could fail on a duplicate-key error when having one AUTO_INCREMENT key and one unique key. (Bug #11080) Fixed a server crash resulting from invalid string pointer when inserting into the mysql.host table. (Bug #10181) Multiple-table DELETE did always delete on the fly from the first table that was to be deleted from. In some cases, when using many tables and it was necessary to access the same row twice in the first table, we could miss some rows-to-be-deleted from other tables. This is now fixed. The mysql_next_result() function could hang if you were executing many statements in a mysql_real_query() call and one of those statements raised an error. (Bug #9992) The combination of COUNT(), DISTINCT, and CONCAT() sometimes triggered a memory deallocation bug on Windows resulting in a server crash. (Bug #9593)
1523
InnoDB: Do very fast shutdown only if innodb_fast_shutdown=2, but wait for threads to exit and release allocated memory if innodb_fast_shutdown=1. Starting with MySQL/InnoDB 5.0.5, InnoDB would do brutal shutdown also when innodb_fast_shutdown=1. (Bug #9673) InnoDB: Fixed InnoDB: Error: stored_select_lock_type is 0 inside ::start_stmt()! in a stored procedure call if innodb_locks_unsafe_for_binlog was set in my.cnf. (Bug #10746) InnoDB: Fixed a duplicate key error that occurred with REPLACE in a table with an AUTO-INC column. (Bug #11005) Fixed that MySQL would pass a wrong key length to storage engines in MIN(). This could cause warnings InnoDB: Warning: using a partial-field key prefix in search. in the .err log. (Bug #11039) Fixed a server crash for INSERT or UPDATE when the WHERE clause contained a correlated subquery that referred to a column of the table being modified. (Bug #6384) Fixed a problem causing an incorrect result for columns that include an aggregate function as part of an expression when WITH ROLLUP is added to GROUP BY. (Bug #7914) Fixed a problem with returning an incorrect result from a view that selected a COALESCE() expression from the result of an outer join. (Bug #9938) MySQL was adding a DEFAULT clause to ENUM columns that included no explicit DEFAULT and were defined as NOT NULL. (This is supposed to happen only for columns that are NULL.) (Bug #6267) Corrected inappropriate error messages that were displayed when attempting to set the read-only warning_count and error_count system variables. (Bug #10339)
1524
Added a --show-warnings option to mysql to cause warnings to be shown after each statement if there are any. This option applies to interactive and batch mode. In interactive mode, \w and \W may be used to enable and disable warning display. (Bug #8684) Removed a limitation that prevented use of FIFOs as logging targets (such as for the general query log). This modification does not apply to the binary log and the relay log. (Bug #8271) Added a --debug option to my_print_defaults. When the server cannot read a table because it cannot read the .frm file, print a message that the table was created with a different version of MySQL. (This can happen if you create tables that use new features and then downgrade to an older version of MySQL.) (Bug #10435) SHOW VARIABLES now shows the slave_compressed_protocol, slave_load_tmpdir and slave_skip_errors system variables. (Bug #7800) Removed unused system variable myisam_max_extra_sort_file_size. Changed default value of myisam_data_pointer_size from 4 to 6. This allows us to avoid table is full errors for most cases. The variable concurrent_insert now takes 3 values. Setting this to 2 changes MyISAM to do concurrent inserts to end of table if table is in use by another thread. New /*> prompt for mysql. This prompt indicates that a /* ... */ comment was begun on an earlier line and the closing */ sequence has not yet been seen. (Bug #9186) If strict SQL mode is enabled, VARCHAR and VARBINARY columns with a length greater than 65,535 no longer are silently converted to TEXT or BLOB columns. Instead, an error occurs. (Bug #8295, Bug #8296) The INFORMATION_SCHEMA.SCHEMATA table now has a DEFAULT_COLLATION_NAME column. (Bug #8998) InnoDB: When the maximum length of SHOW INNODB STATUS output would be exceeded, truncate the beginning of the list of active transactions, instead of truncating the end of the output. (Bug #5436) InnoDB: If innodb_locks_unsafe_for_binlog option is set and the isolation level of the transaction is not set to serializable then InnoDB uses a consistent read for select in clauses like INSERT INTO ... SELECT and UPDATE ... (SELECT) that do not specify FOR UPDATE or IN SHARE MODE. Thus no locks are set to rows read from selected table. Updated version of libedit to 2.9. (Bug #2596) Removed mysqlshutdown.exe and mysqlwatch.exe from the Windows With Installer distribution. Bugs fixed: An error in the implementation of the MyISAM compression algorithm caused myisampack to fail with very large sets of data (total size of all the records in a single column needed to be >= 3 GB in order to trigger this issue). (Bug #8321) Statements that create and use stored routines were not being written to the binary log, which affects replication and data recovery options. (Bug #2610) Stored routine-related statements now are logged, subject to the issues and limitations discussed in Seccin 19.3, Registro binario de procedimientos almacenados y disparadores Disabled binary logging within stored routines to avoid writing spurious extra statements to the binary log. For example, if a routine p() executes an INSERT statement, then for CALL p(), the CALL statement appears in the binary log, but not the INSERT statement. (Bug #9100)
1525
Statements that create and drop triggers were not being written to the binary log, which affects replication and data recovery options. (Bug #10417) Trigger-related statements now are logged, subject to the issues and limitations discussed in Seccin 19.3, Registro binario de procedimientos almacenados y disparadores The mysql_stmt_execute() and mysql_stmt_reset() C API functions now close any cursor that is open for the statement, which prevents a server crash. (Bug #9478) The mysql_stmt_attr_set() C API function now returns an error for option values that are defined in mysql.h but not yet implemented, such as CURSOR_TYPE_SCROLLABLE. (Bug #9643) MERGE tables could fail on Windows due to incorrect interpretation of pathname separator characters for filenames in the .MRG file. (Bug #10687) Fixed a server crash for INSERT ... ON DUPLICATE KEY UPDATE with MERGE tables, which do not have unique indexes. (Bug #10400) Fix FORMAT() to do better rounding for double values (for example, FORMAT(4.55,1) returns 4.6, not 4.5). (Bug #9060) Disallow use of SESSION or GLOBAL for user variables or local variables in stored routines. (Bug #9286) Fixed a server crash when using GROUP BY ... WITH ROLLUP on an indexed column in an InnoDB table. (Bug #9798) In strict SQL mode, some assignments to numeric columns that should have been rejected were not (such as the result of an arithmetic expression or an explicit CAST() operation). (Bug #6961) CREATE TABLE t AS SELECT UUID() created a VARCHAR(12) column, which is too small to hold the 36-character result from UUID(). (Bug #9535) Fixed a server crash in the BLACKHOLE storage engine. (Bug #10175) Fixed a server crash resulting from repeated calls to ABS() when the argument evaluated to NULL. (Bug #10599) For a user-defined function invoked from within a prepared statement, the UDF's initialization routine was invoked for each execution of the statement, but the deinitialization routine was not. (It was invoked only when the statement was closed.) Similarly, when invoking a UDF from within a trigger, the initialization routine was invoked but the deinitialization routine was not. For UDFs that have an expensive deinit function (such as myperl, this bugfix will have negative performance consequences. (Bug #9913) Portability fix for Cygwin: Don't use #pragma interface in source files. (Bug #10241) Fix CREATE TABLE ... LIKE to work when lower_case_table_names is set on a casesensitive filesystem and the source table name is not given in lowercase. (Bug #9761) Fixed a server crash resulting from a CHECK TABLE statement where the arguments were a view name followed by a table name. (Bug #9897) Within a stored procedure, attempting to update a view defined as an inner join failed with a Table 'tbl_name' was locked with a READ lock and can't be updated error. (Bug #9481) Fixed a problem with INFORMATION_SCHEMA tables being inaccessible depending on lettercase used to refer to them. (Bug #10018) my_print_defaults was ignoring the --defaults-extra-file option or crashing when the option was given. (Bug #9136, Bug #9851) The INFORMATION_SCHEMA.COLUMNS table was missing columns of views for which the user has access. (Bug #9838)
1526
Fixed a mysqldump crash that occurred with the --complete-insert option when dumping tables with a large number of long column names. (Bug #10286) Corrected a problem where DEFAULT values where not assigned properly to BIT(1) or CHAR(1) columns if certain other columns preceded them in the table definition. (Bug #10179) For MERGE tables, avoid writing absolute pathnames in the .MRG file for the names of the constituent MyISAM tables so that if the data directory is moved, MERGE tables will not break. For mysqld, write just the MyISAM table name if it is in the same database as the MERGE table, and a path relative to the data directory otherwise. For the embedded servers, absolute pathnames may still be used. (Bug #5964) Corrected a problem resolving outer column references in correlated subqueries when using the prepared statements. (Bug #10041) Corrected the error message for exceeding the MAX_CONNECTIONS_PER_HOUR limit to say max_connections_per_hour instead of max_connections. (Bug #9947) Fixed incorrect memory block allocation for the query cache in the embedded server. (Bug #9549) Corrected an inability to select from a view within a stored procedure. (Bug #9758) Fixed a server crash resulting from use of AVG(DISTINCT) with GROUP BY ... WITH ROLLUP. (Bug #9799) Fixed a server crash resulting from use of DISTINCT AVG() with GROUP BY ... WITH ROLLUP. (Bug #9800) Fixed a server crash resulting from use of a CHAR or VARCHAR column with MIN() or MAX() and GROUP BY ... WITH ROLLUP. (Bug #9820) Fixed a server crash resulting from use of SELECT DISTINCT with a prepared statement that uses a cursor. (Bug #9520) Fixed server crash resulting from multiple calls to a stored procedure that assigned the result of a subquery to a variable or compared it to a value with IN. (Bug #5963) Selecting from a single-table view defined on multiple-table views caused a server crash. (Bug #8528) If the file named by a --defaults-extra-file option does not exist or is otherwise inaccessible, an error now occurs. (Bug #5056) net_read_timeout and net_write_timeout were not being respected on Windows. (Bug #9721) SELECT from INFORMATION_SCHEMA tables failed if the statement has a GROUP BY clause and an aggregate function in the select list. (Bug #9404) Corrected some failures of prepared statements for SQL (PREPARE plus EXECUTE) to return all rows for some SELECT statements. (Bug #9096, Bug #9777) Remove extra slashes in --tmpdir value (for example, convert /var//tmp to /var/tmp, because they caused various errors. (Bug #8497) Added Create_routine_priv, Alter_routine_priv, and Execute_priv privileges to the mysql.host privilege table. (They had been added to mysql.db in MySQL 5.0.3 but not to the host table.) (Bug #8166) Fixed configure to properly recognize whether NTPL is available on Linux. (Bug #2173) Incomplete results were returned from INFORMATION_SCHEMA.COLUMNS for INFORMATION_SCHEMA tables for non-root users. (Bug #10261)
1527
Fixed a portability problem in compiling mysql.cc with VC++ on Windows. (Bug #10245) SELECT 0/0 returned 0 rather than NULL. (Bug #10404) 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) SHOW CREATE VIEW got confused and could not find the view if there was a temporary table with the same name as the view. (Bug #8921) Fixed a deadlock resulting from use of FLUSH TABLES WITH READ LOCK while an INSERT DELAYED statement is in progress. (Bug #7823) The optimizer was choosing suboptimal execution plans for certain outer joins where the right table of a left join (or left table of a right join) had both ON and WHERE conditions. (Bug #10162) RENAME TABLE for an ARCHIVE table failed if the .arn file was not present. (Bug #9911) Invoking a stored function that executed a SHOW statement resulted in a server crash. (Bug #8408) Fixed problems with static variables and do not link with libsupc++ to allow building on FreeBSD 5.3. (Bug #9714) Fixed some awk script portability problems in cmd-line-utils/libedit/makelist.sh. (Bug #9954) Fixed a problem with mishandling of NULL key parts in hash indexes on VARCHAR columns, resulting in incorrect query results. (Bug #9489, Bug #10176) InnoDB: Fixed a critical bug in InnoDB AUTO_INCREMENT: it could assign the same value for several rows. (Bug #10359) InnoDB: All InnoDB bug fixes from 4.1.12 and earlier versions, and also the fixes to bugs #10335 and #10607 listed in the 4.1.13 change notes.
1528
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) SET @var= CAST(NULL AS [INTEGER|CHAR]) now sets the result type of the variable to INTEGER/CHAR. (Bug #6598) 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) Within a stored procedure, attempting to execute a multiple-table UPDATE 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) 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)
1529
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 postive 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)
1530
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) 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)
1531
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 incorrect INTEGER and CHAR values. This also applies to implicit string to number casts. (Bug #5912) ALTER TABLE now fails in STRICT mode if the alteration generates warnings. Using CONVERT('0000-00-00',date) or CAST('0000-00-00' as date) in TRADITIONAL SQL 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) Too many rows were returned from queries that combined ROLLUP and LIMIT if SQL_CALC_FOUND_ROWS was given. (Bug #8617)
1532
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)
1533
Boolean full-text phrase searching now requires only that matches contain exactly the same words as the phrase and in the same order. Non-word characters no longer need match exactly. 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.
1534
Added --large-pages option for mysqld. Added multi_read_range system variable. 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 Captulo 22, La base de datos de informacin 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. In Mac OS X, fsync() does not flush the write cache in the disk drive, but the special fcntl() does; however, the flush request is ignored by some external devices. Failure to flush the buffers may cause severe database 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 Seccin 5.3.4, Variables de estado del servidor. Added the FEDERATED storage engine. See Seccin 14.6, El motor de almacenamiento 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 Seccin C.1, Cambios en la entrega 5.0.x (Desarrollo). 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
1535
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. 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 Seccin A.4.3, Cmo se comporta MySQL ante un disco lleno. 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 Seccin A.8.4, Cuestiones abiertas en 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 INSERTSELECT, single table UPDATESELECT and single table DELETESELECT clauses when innodb_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)
1536
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. Bugs fixed: 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) 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)
1537
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) 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)
1538
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) 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)
1539
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) 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 Seccin 7.2.1, Sintaxis de EXPLAIN (Obtener informacin acerca de un 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)
1540
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) 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.
1541
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 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)
1542
MySQL now by default checks dates and in strict mode allows only fully correct dates. If you want MySQL to behave as before, you should enable the new ALLOW_INVALID_DATES SQL mode. Added STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, and TRADITIONAL SQL modes. The TRADITIONAL mode is shorthand for all the preceding modes. When using mode TRADITIONAL, MySQL generates an error if you try to insert a wrong value in a column. It does not adjust the value to the closest possible legal value. MySQL now remembers which columns were declared to have default values. In STRICT_TRANS_TABLES/STRICT_ALL_TABLES mode, you now get an error if you do an INSERT without specifying all columns that don't have a default value. A side effect of this is that when you do SHOW CREATE for a new table, you no longer see a DEFAULT value for a column for which you didn't specify a default value. The compilation flag DONT_USE_DEFAULT_FIELDS was removed because you can get the same behavior by setting the sql_mode system variable to STRICT_TRANS_TABLES. Added NO_AUTO_CREATE_USER SQL mode to prevent GRANT from automatically creating new users if it would otherwise do so, unless a password also is specified. We now detect too-large floating point numbers during statement parsing and generate an error messages for them. Renamed the sql_updatable_view_key system variable to updatable_views_with_limit. This variable now can have only two values: 1 or YES: Don't issue an error message (warning only) if a VIEW without presence of a key in the underlying table is used in queries with a LIMIT clause for updating. (This is the default value.) 0 or NO: Prohibit update of a VIEW, which does not contain a key in the underlying table and the query uses a LIMIT clause (usually get from GUI tools). Reverted output format of SHOW TABLES to old pre-5.0.1 format that did not include a table type column. To get the additional column that lists the table type, use SHOW FULL TABLES now. The mysql_fix_privilege_tables script now initializes the global CREATE VIEW and SHOW VIEW privileges in the user table to the value of the CREATE privilege in that table. 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. InnoDB: If you specify the option innodb_locks_unsafe_for_binlog in my.cnf, InnoDB in an UPDATE or a DELETE only locks the rows that it updates or deletes. This greatly reduces the probability of deadlocks. A connection doing a rollback now displays "Rolling back" in the State column of SHOW PROCESSLIST. 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. Two new server system variables were introduced. auto_increment_increment and auto_increment_offset can be set locally or globally, and are intended for use in controlling the behaviour of AUTO_INCREMENT columns in master-to-master replication. Note that these variables are not intended to take the place of sequences. See Seccin 5.3.3, Variables de sistema del servidor. Bugs fixed: Fixed that mysqlbinlog --read-from-remote-server sometimes couldn't accept two binary logfiles on the command line. (Bug #4507)
1543
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 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 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 (complaining about error 1223). Bug surfaced when using the InnoDB innobackup script. (Bug #5949) OPTIMIZE TABLE, REPAIR TABLE, and ANALYZE TABLE are now replicated without any error code in the binary log. (Bug #5551) 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) Fixed a bug which prevented mysqlbinlog from being able to read from stdin, for example, when piping the output from zcat to mysqlbinlog. (Bug #7853)
1544
are still some open critical bugs in our bugs database at http://bugs.mysql.com/ that affect this release as well. We are actively fixing these and will make a new release where these are fixed as soon as possible. However, this binary should be a good candidate for testing new MySQL 5.0 features for future products. Functionality added or changed: Warning: Incompatible change! C API change: mysql_shutdown() now requires a second argument. This is a source-level incompatibility that affects how you compile client programs; it does not affect the ability of compiled clients to communicate with older servers. See Seccin 24.2.3.56, mysql_shutdown(). When installing a MySQL server as a Windows service, the installation command can include a --local-service option following the service name to cause the server to run using the LocalService Windows account that has limited privileges. This is in addition to the -defaults-file option that also can be given following the service name. Added support for read-only and updatable views based on a single table or other updatable views. View use requires that you upgrade your grant tables to add the view-related privileges. See Seccin 2.10.2, Aumentar la versin de las tablas de privilegios. Implemented a new greedy search optimizer that can significantly reduce the time spent on query optimization for some many-table joins. (You are affected if not only some particular SELECT is slow, but even using EXPLAIN for it takes a noticeable amount of time.) Two new system variables, optimizer_search_depth and optimizer_prune_level, can be used to fine-tune optimizer behavior. A stored procedure is no longer global. That is, it now belongs to a specific database: When a database is dropped, all routines belonging to that database are also dropped. Procedure names may be qualified, for example, db.p() When executed from another database, an implicit USE db_name is in effect. Explicit USE db_name statements no longer are allowed in a stored procedure. See Captulo 19, Procedimientos almacenados y funciones. Fixed SHOW TABLES output field name and values according to standard. Field name changed from Type to table_type, values are BASE TABLE, VIEW and ERROR. (Bug #4603) Added the sql_updatable_view_key system variable. Added the --replicate-same-server-id server option. Added Last_query_cost status variable that reports optimizer cost for last compiled query. Added the --to-last-log option to mysqlbinlog, for use in conjunction with --read-fromremote-server. Added the --innodb-safe-binlog server option, which adds consistency guarantees between the content of InnoDB tables and the binary log. See Seccin 5.10.3, El registro binario (Binary Log). OPTIMIZE TABLE for InnoDB tables is now mapped to ALTER TABLE instead of ANALYZE TABLE. This rebuilds the table, which updates index statistics and frees space in the clustered index. sync_frm is now a settable global variable (not only a startup option). 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
1545
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 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 binary log cache is allocated for connections. This should save binlog_cache_size bytes of memory (32KB by default) for every connection. Added the sync_binlog=N global variable and startup option, which makes the MySQL server synchronize its binary log to disk (fdatasync()) after every Nth write to the binary log. Changed the slave SQL thread to print less useless error messages (no more message duplication; no more messages when an error is skipped because of slave-skip-errors). DROP DATABASE IF EXISTS, DROP TABLE IF EXISTS, single-table DELETE, and single-table UPDATE now are written to the binary log even if they changed nothing on the master (for example, even if a DELETE matched no rows). The old behavior sometimes caused bad surprises in replication setups. Replication and mysqlbinlog now have better support for the case that the session character set and collation variables are changed within a given session. See Seccin 6.7, Caractersticas de la replicacin y problemas conocidos. 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 Seccin 13.5.5.3, Sintaxis de KILL. Bugs fixed: 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 a statement (submitted through mysql_real_query() or mysql_stmt_prepare()) was terminated by garbage characters. This can happen if you pass a wrong length parameter to these functions. 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 that one gets when an update is refused because of the --readonly option. (Bug #2757)
1546
Fixed that --replicate-wild-*-table rules apply to ALTER DATABASE when the table pattern is %, as is 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 as it does when reading a local binary log. There is an option --to-last-log to get the old behavior. (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) If server-id was not set using startup options but with SET GLOBAL, the replication slave still complained that it was not set. (Bug #3829) mysql_fix_privilege_tables didn't correctly handle the argument of its --password=# option. (Bug #4240) Fixed potential memory overrun in mysql_real_connect() (which required a compromised DNS server and certain operating systems). (Bug #4017, CVE-2004-0836)
1547
During the installation process of the server RPM on Linux, mysqld was run as the root system user, and if you had --log-bin=somewhere_out_of_var_lib_mysql it created binary log files owned by root in this directory, which remained owned by root after the installation. This is now fixed by starting mysqld as the mysql system user instead. (Bug #4038) Made DROP DATABASE honor the value of lower_case_table_names. (Bug #4066) The slave SQL thread refused to replicate INSERT ... SELECT if it examined more than 4 billion rows. (Bug #3871) mysqlbinlog didn't escape the string content of user variables, and did not deal well when these variables were in non-ASCII character sets; this is now fixed by always printing the string content of user variables in hexadecimal. The character set and collation of the string is now also printed. (Bug #3875) Fixed incorrect destruction of expression that led to a server crash on complex AND/OR expressions if query was ignored (either by a replication server because of --replicate-*-table rules, or by any MySQL server because of a syntax error). (Bug #3969, Bug #4494) If CREATE TEMPORARY TABLE t SELECT failed while loading the data, the temporary table was not dropped. (Bug #4551) 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)
1548
replicacin for more details). The format of the binary log and relay log is changed compared to that of MySQL 4.1 and older. Bugs fixed:
1549
1550
C.2.7. Changes in Connector/ODBC 5.0.3 (Connector/ODBC 5.0 Alpha 3) (20 June 2006)
This is an implementation and testing release, and is not designed for use within a production environment. Features, limitations and notes on this release: The following ODBC API functions have been added in this release: SQLBindParameter SQLBindCol
C.2.9. Changes in Connector/ODBC 5.0.1 (Connector/ODBC 5.0 Alpha 2) (05 June 2006)
Features, limitations and notes on this release: Connector/ODBC 5.0 is Unicode aware. Connector/ODBC is currently limited to basic applications. ADO applications and Microsoft Office are not supported. Connector/ODBC must be used with a Driver Manager. The following ODBC API functions are implemented: SQLAllocHandle SQLCloseCursor SQLColAttribute
1551
SQLColumns SQLConnect SQLCopyDesc SQLDisconnect SQLExecDirect SQLExecute SQLFetch SQLFreeHandle SQLFreeStmt SQLGetConnectAttr SQLGetData SQLGetDescField SQLGetDescRec SQLGetDiagField SQLGetDiagRec SQLGetEnvAttr SQLGetFunctions SQLGetStmtAttr SQLGetTypeInfo SQLNumResultCols SQLPrepare SQLRowcount SQLTables The following ODBC API function are implemented, but not yet support all the available attributes/ options: SQLSetConnectAttr SQLSetDescField SQLSetDescRec SQLSetEnvAttr SQLSetStmtAttr
1552
Added support for the HENV handlers in SQLEndTran(). Added auto-reconnect option to Connector/ODBC option parameters. Added auto is null option to Connector/ODBC option parameters. (Bug #10910) Bugs fixed: Using DataAdapter, Connector/ODBC may continually consume memory when reading the same records within a loop (Windows Server 2003 SP1/SP2 only). (Bug #20459) Connector/ODBC may insert the wrong parameter values when using prepared statements under 64bit Linux. (Bug #22446) Using Connector/ODBC, with SQLBindCol and binding the length to the return value from SQL_LEN_DATA_AT_EXEC fails with a memory allocation error. (Bug #20547) The SQLDriverConnect() ODBC method did not work with recent Connector/ODBC releases. (Bug #12393)
1553
GetSchema and DataTypes would throw an exception due to an incorrect table name. (Bug #25906) Times with negative values would be returned incorrectly. (Bug #25912) SELECT did not work correctly when using a WHERE clause containing a UTF-8 string. (Bug #25651) When closing and then re-opening a connection to a database, the character set specification is lost. (Bug #25614) When connecting to a MySQL Server earlier than version 4.1, the connection would hang when reading data. (Bug #25458) When connecting to a server, the return code from the connection could be zero, even though the hostname was incorrect. (Bug #24802) Using ExecuteScalar() with more than one query, where one query fails, will hang the connection. (Bug #25443)
1554
Deleting a connection to a disconnected server when using the Visual Studio Plugin would cause an assertion failure. (Bug #23687) When using a DbNull.Value as the value for a parameter value, and then later setting a specific value type, the command would fail with an exception because the wrong type was implied from the DbNull.Value. (Bug #24565)
The default value of this property is true. Bugs fixed: Creating a connection through the Server Explorer when using the Visual Studio Plugin would fail. The installer for the Visual Studio Plugin has been updated to ensure that Connector/NET 5.0.2 must be installed. (Bug #23071) Within Mono, using the PreparedStatement interface could result in an error due to a BitArray copying error. (Bug #18186) Using Windows Vista (RC2) as a non-privileged user would raise a Registry key 'Global' access denied. (Bug #22882) One system where IPv6 was enabled, Connector/NET would incorrectly resolve hostnames. (Bug #23758) Column names with accented characters were not parsed properly causing malformed column names in result sets. (Bug #23657) Connector/NET did not work as a data source for the SqlDataSource object used by ASP.NET 2.0. (Bug #16126) A System.FormatException exception would be raised when invoking a stored procedure with an ENUM input parameter. (Bug #23268) During installation, an antivirus error message would be raised (indicating a malicious script problem). (Bug #23245) An exception would be thrown when calling GetSchemaTable and fields was null. (Bug #23538)
1555
Submitting an empty string to a command object through prepare raises an System.IndexOutOfRangeException, rather than a Connector/Net exception. (Bug #18391) Starting a transaction on a connection created by MySql.Data.MySqlClient.MySqlClientFactory, using BeginTransaction without specifying an isolation level, causes the SQL statement to fail with a syntax error. (Bug #22042) Connector/NET on a Tukish operating system, may fail to execute certain SQL statements correctly. (Bug #22452) You can now install the Connector/NET MSI package from the command line using the /passive, / quiet, /q options. (Bug #19994) The MySqlexception class is now derived from the DbException class. (Bug #21874) Executing multiple queries as part of a transaction returns There is already an openDataReader associated with this Connection which must be closed first. (Bug #7248) The # would not be accepted within column/table names, even though it was valid. (Bug #21521)
1556
The default value of this property is true. Bugs fixed: Trying to fill a table schema through a stored procedure triggers a runtime error. (Bug #25609) MySqlConnection throws an exception when connecting to MySQL v4.1.7. (Bug #25726) SELECT did not work correctly when using a WHERE clause containing a UTF-8 string. (Bug #25651) Times with negative values would be returned incorrectly. (Bug #25912) When closing and then re-opening a connection to a database, the character set specification is lost. (Bug #25614) When connecting to a server, the return code from the connection could be zero, even though the hostname was incorrect. (Bug #24802) Using ExecuteScalar() with more than one query, where one query fails, will hang the connection. (Bug #25443) Nested transactions do not raise an error or warning. (Bug #22400) When adding parameter objects to a command object, if the parameter direction is set to ReturnValue before the parameter is added to the command object then when the command is executed it throws an error. (Bug #25013) Additional text added to error message. (Bug #25178) The CommandBuilder would mistakenly add insert parameters for a table column with auto incrementation enabled. (Bug #23862) Stored procedure executions are not thread safe. (Bug #23905) Using Driver.IsTooOld() would return the wrong value. (Bug #24661) When using a DbNull.Value as the value for a parameter value, and then later setting a specific value type, the command would fail with an exception because the wrong type was implied from the DbNull.Value. (Bug #24565) Within Mono, using the PreparedStatement interface could result in an error due to a BitArray copying error. (Bug 18186) One system where IPv6 was enabled, Connector/NET would incorrectly resolve hostnames. (Bug #23758) An System.OverflowException would be raised when accessing a varchar field over 255 bytes. Bug (#23749)
1557
Using ExecuteScalar with a datetime field, where the value of the field is "0000-00-00 00:00:00", a MySqlConversionException exception would be raised. (Bug #11991) The MySqlDateTime class did not contain constructors. (Bug #15112) DataReader would show the value of the previous row (or last row with non-null data) if the current row contained a datetime field with a null value. (Bug #16884) An MySql.Data.Types.MySqlConversionException would be raised when trying to update a row that contained a date field, where the date field contained a zero value (0000-00-00 00:00:00). (Bug #9619) When using MySqlDataAdapter, connections to a MySQL server may remain open and active, even though the use of the connection has been completed and the data received. (Bug #8131) Incorrect field/data lengths could be returned for VARCHAR UTF8 columns. Bug (#14592) Submitting an empty string to a command object through prepare raises an System.IndexOutOfRangeException, rather than a Connector/Net exception. (Bug #18391) Connector/NET on a Tukish operating system, may fail to execute certain SQL statements correctly. (Bug #22452) You can now install the Connector/NET MSI package from the command line using the /passive, / quiet, /q options. (Bug #19994) Executing multiple queries as part of a transaction returns There is already an openDataReader associated with this Connection which must be closed first. (Bug #7248) Called MySqlCommandBuilder.DeriveParameters for a stored procedure that has no paramers would cause an application crash. (Bug #15077) A SELECT query on a table with a date with a value of '0000-00-00' would hang the application. (Bug #17736) The # would not be accepted within column/table names, even though it was valid. (Bug #21521) Calling Close on a connection after calling a stored procedure would trigger a NullReferenceException. (Bug #20581) IDataRecord.GetString would raise NullPointerException for null values in returned rows. Method now throws SqlNullValueException. (Bug #19294) An exception would be raised when using an output parameter to a System.String value. (Bug #17814) The DiscoverParameters function would fail when a stored procedure used a NUMERIC parameter type. (Bug #19515) When running a query that included a date comparison, a DateReader error would be raised. (Bug #19481) Parameter substitution in queries where the order of parameters and table fields did not match would substitute incorrect values. (Bug #19261) When working with multiple threads, character set initialization would generate errors. (Bug #17106) When using an unsigned 64-bit integer in a stored procedure, the unsigned bit would be lost stored. (Bug #16934) The connection string parser did not allow single or double quotes in the password. (Bug #16659)
1558
The CommandBuilder ignored Unsigned flag at Parameter creation. (Bug #17375) CHAR type added to MySqlDbType. (Bug #17749) Unsigned data types were not properly supported. (Bug #16788) Functionality added or changed: Stored procedures are now cached. The method for retrieving stored procedured metadata has been changed so that users without SELECT privileges on the mysql.proc table can use a stored procedure.
1559
A call to a stored procedure caused an exception if the stored procedure had no parameters. (Bug #11542) Certain malformed queries would trigger a Connection must be valid and open error message. (Bug #11490) The MySqlCommandBuilder class could not handle queries that referenced tables in a database other than the default database. (Bug #8382) Connector/NET could not work properly with certain regional settings. (WL#8228) Trying to use a stored procedure when Connection.Database was not populated generated an exception. (Bug #11450) Trying to read a TIMESTAMP column generated an exception. (Bug #7951) Parameters were not recognized when they were separated by linefeeds. (Bug #9722) Calling MySqlConnection.clone when a connection string had not yet been set on the original connection would generate an error. (Bug #10281) Added support to call a stored function from Connector/NET. (Bug #10644) Connector/NET could not connect to MySQL 4.1.14. (Bug #12771) The ConnectionString property could not be set when a MySqlConnection object was added with the designer. (Bug #12551, Bug #8724)
1560
Fixed Invalid character set index: 200. (Bug #6547) Installer now includes options to install into GAC and create Start Menu items. Int64 Support in MySqlCommand Parameters. (Bug #6863) Connections now do not have to give a database on the connection string. MySqlDataReader.GetChar(int i) throws IndexOutOfRange exception. (Bug #6770) Fixed problem where multiple resultsets having different numbers of columns would cause a problem. Exception stack trace lost when re-throwing exceptions. (Bug #6983) Fixed major problem with detecting null values when using prepared statements. Errors in parsing stored procedure parameters. (Bug #6902) Integer "out" parameter from stored procedure returned as string. (Bug #6668) MySqlDateTime in Datatables sorting by Text, not Date. (Bug #7032) Invalid query string when using inout parameters (Bug #7133) Test suite fails with MySQL 4.0 because of case sensitivity of table names. (Bug #6831) Inserting DateTime causes System.InvalidCastException to be thrown. (Bug #7132) InvalidCast when using DATE_ADD-function. (Bug #6879) An Open Connection has been Closed by the Host System. (Bug #6634) Added ServerThread property to MySqlConnection to expose server thread id. Added Ping method to MySqlConnection. Changed the name of the test suite to MySql.Data.Tests.dll.
1561
Fixed Long inserts take very long time (Bu #5453) Fixed Objects not being disposed (Bug #6649) Provider is now using character set specified by server as default
1562
Fixed MySqlDateTime sets IsZero property on all subseq.records after first zero found (Bug #6006) Fixed Can't display Chinese correctly (Bug #5288) Fixed Russian character support as well Fixed Method TokenizeSql() uses only a limited set of valid characters for parameters (Bug #6217) Fixed NET Connector source missing resx files (Bug #6216) Fixed DBNull Values causing problems with retrieving/updating queries. (Bug #5798) Fixed Yet Another "object reference not set to an instance of an object" (Bug #5496) Fixed problem in PacketReader where it could try to allocate the wrong buffer size in EnsureCapacity Fixed GetBoolean returns wrong values (Bug #6227) Fixed IndexOutOfBounds when reading BLOB with DataReader with GetString(index) (Bug #6230)
1563
MySqlDataReader GetXXX methods now using the field level MySqlValue object and not performing conversions. DataReader returning NULL for time column. (Bug #5097) Added test case for LOAD DATA LOCAL INFILE. Added replacetext custom nant task. Added CommandBuilderTest fixture. Added Last One Wins feature to CommandBuilder. Fixed persist security info case problem. Fixed GetBool so that 1, true, "true", and "yes" all count as true. Make parameter mark configurable. Added the "old syntax" connection string parameter to allow use of @ parameter marker. MySqlCommandBuilder. (Bug #4658) ByteFX.MySqlClient caches passwords if Persist Security Info is false. (Bug #4864) Updated license banner in all source files to include FLOSS exception. Added new .Types namespace and implementations for most current MySql types. Added MySqlField41 as a subclass of MySqlField. Changed many classes to now use the new .Types types. Changed type enum int to Int32, short to Int16, and bigint to Int64. Added dummy types UInt16, UInt32, and UInt64 to allow an unsigned parameter to be made. Connections are now reset when they are pulled from the connection pool. Refactored auth code in driver so it can be used for both auth and reset. Added UserReset test in PoolingTests.cs. Connections are now reset using COM_CHANGE_USER when pulled from the pool. Implemented SingleResultSet behavior. Implemented support of unicode. Added char set mappings for utf-8 and ucs-2. Time fields overflow using bytefx .net mysql driver (Bug #4520) Modified time test in data type test fixture to check for time spans where hours > 24. Wrong string with backslash escaping in ByteFx.Data.MySqlClient.MySqlParameter. (Bug #4505) Added code to Parameter test case TestQuoting to test for backslashes. MySqlCommandBuilder fails with multi-word column names. (Bug #4486) Fixed bug in TokenizeSql where underscore would terminate character capture in parameter name. Added test case for spaces in column names.
1564
MySqlDataReader.GetBytes don't works correctly. (Bug #4324) Added GetBytes() test case to DataReader test fixture. Now reading all server variables in InternalConnection.Configure into Hashtable. Now using string[] for index map in CharSetMap. Added CRInSQL test case for carriage returns in SQL. Setting maxPacketSize to default value in Driver.ctor. Setting MySqlDbType on a parameter doesn't set generic type. (Bug #4442) Removed obsolete data types Long and LongLong. Overflow exception thrown when using "use pipe" on connection string. (Bug #4071) Changed "use pipe" keyword to "pipe name" or just "pipe". Allow reading multiple resultsets from a single query. Added flags attribute to ServerStatusFlags enum. Changed name of ServerStatus enum to ServerStatusFlags. Inserted data row doesn't update properly. Error processing show create table. (Bug #4074) Change Packet.ReadLenInteger to ReadPackedLong and added packet.ReadPackedInteger that alwasy reads integers packed with 2,3,4. Added syntax.cs test fixture to test various SQL syntax bugs. Improper handling of time values. Now time value of 00:00:00 is not treated as null. (Bug #4149) Moved all test suite files into TestSuite folder. Fixed bug where null column would move the result packet pointer backward. Added new nant build script. Clear tablename so it will be regen'ed properly during the next GenerateSchema. (Bug #3917) GetValues was always returning zero and was also always trying to copy all fields rather than respecting the size of the array passed in. (Bug #3915) Implemented shared memory access protocol. Implemented prepared statements for MySQL 4.1. Implemented stored procedures for MySQL 5.0. Renamed MySqlInternalConnection to InternalConnection. SQL is now parsed as chars, fixes problems with other languages. Added logging and allow batch connection string options. RowUpdating event not set when setting the DataAdapter property. (Bug #3888) Fixed bug in char set mapping. Implemented 4.1 authentication.
1565
Improved open/auth code in driver. Improved how connection bits are set during connection. Database name is now passed to server during initial handshake. Changed namespace for client to MySql.Data.MySqlClient. Changed assembly name of client to MySql.Data.dll. Changed license text in all source files to GPL. Added the MySqlClient.build Nant file. Removed the mono batch files. Moved some of the unused files into notused folder so nant build file can use wildcards. Implemented shared memory accesss. Major revamp in code structure. Prepared statements now working for MySql 4.1.1 and later. Finished implementing auth for 4.0, 4.1.0, and 4.1.1. Changed namespace from MySQL.Data.MySQLClient back to MySql.Data.MySqlClient. Fixed bug in CharSetMapping where it was trying to use text names as ints. Changed namespace to MySQL.Data.MySQLClient. Integrated auth changes from UC2004. Fixed bug where calling any of the GetXXX methods on a datareader before or after reading data would not throw the appropriate exception (thanks Luca Morelli). Added TimeSpan code in parameter.cs to properly serialize a timespan object to mysql time format (thanks Gianluca Colombo). Added TimeStamp to parameter serialization code. Prevented DataAdatper updates from working right (thanks Michael King). Fixed a misspelling in MySqlHelper.cs (thanks Patrick Kristiansen).
1566
Changed other classes to use new properties and fields of MySqlConnectionString. ConnectionInternal is now using PING to see whether the server is alive. Moved toolbox bitmaps into resource folder. Changed field.cs to allow values to come directly from row buffer. Changed to use the new driver.Send syntax. Using a new packet queueing system. Started work handling the "broken" compression packet handling. Fixed bug in StreamCreator where failure to connect to a host would continue to loop infinitly (thanks Kevin Casella). Improved connectstring handling. Moved designers into Pro product. Removed some old commented out code from command.cs. Fixed a problem with compression. Fixed connection object where an exception throw prior to the connection opening would not leave the connection in the connecting state (thanks Chris Cline). Added GUID support. Fixed sequence out of order bug (thanks Mark Reay).
1567
Fixed small pooling bug where new connection was not getting created after IsAlive fails. Added Platform.cs and StreamCreator.cs. Fixed Field.cs to properly handle 4.1 style timestamps. Changed Common.Version to Common.DBVersion to avoid name conflict. Fixed field.cs so that text columns return the right field type. Added MySqlError class to provide some reference for error codes (thanks Geert Veenstra).
1568
Fixed InternalConnection to not use @@session.max_allowed_packet but use @@max_allowed_packet. (Thanks Miguel) Added many new XML doc lines. Fixed sql parsing to not send empty queries (thanks Rory). Fixed problem where the reader was not unpeeking the packet on close. Fixed problem where user variables were not being handled (thanks Sami Vaaraniemi). Fixed loop checking in the MySqlPool (thanks Steve M. Brown) Fixed ParameterCollection.Add method to match SqlClient (thanks Joshua Mouch). Fixed ConnectionString parsing to handle no and yes for boolean and not lowercase values (thanks Naucki). Added InternalConnection class, changes to pooling. Implemented Persist Security Info. Added security.cs and version.cs to project Fixed DateTime handling in Parameter.cs (thanks Burkhard Perkens-Golomb). Fixed parameter serialization where some types would throw a cast exception. Fixed DataReader to convert all returned values to prevent casting errors (thanks Keith Murray). Added code to Command.ExecuteReader to return null if the initial SQL command throws an exception (thanks Burkhard Perkens-Golomb). Fixed ExecuteScalar bug introduced with restructure. Restructure to allow for LOCAL DATA INFILE and better sequencing of packets. Fixed several bugs related to restructure. Early work done to support more secure passwords in Mysql 4.1. Old passwords in 4.1 not supported yet. Parameters appearing after system parameters are now handled correctly (Adam M. (adammil)). Strings can now be assigned directly to blob fields (Adam M.). Fixed float parameters (thanks Pent). Improved Parameter constructor and ParameterCollection.Add methods to better match SqlClient (thanks Joshua Mouch). Corrected Connection.CreateCommand to return a MySqlCommand type. Fixed connection string designer dialog box problem (thanks Abraham Guyt). Fixed problem with sending commands not always reading the response packet (thanks Joshua Mouch). Fixed parameter serialization where some blobs types were not being handled (thanks Sean McGinnis). Removed spurious MessageBox.show from DataReader code (thanks Joshua Mouch). Fixed a nasty bug in the split sql code (thanks everyone!).
1569
1570
Added more tests for MySQL. Improved casting problems by equating unsigned 32bit values to Int64 and usigned 16bit values to Int32, and so forth. Added new constructor for MySqlParameter for (name, type, size, srccol) Fixed bug in MySqlDataReader where it didn't check for null fieldlist before returning field count. Started adding MySqlClient unit tests (added MySqlClient/Tests folder and some test cases). Fixed some things in Connection String handling. Moved INIT_DB to MySqlPool. I may move it again, this is in preparation of the conference. Fixed bug inside CommandBuilder that prevented inserts from happening properly. Reworked some of the internals so that all three execute methods of Command worked properly. Fixed many small bugs found during benchmarking. The first cut of CoonectionPooling is working. "min pool size" and "max pool size" are respected. Work to enable multiple resultsets to be returned. Character sets are handled much more intelligently now. The driver queries MySQL at startup for the default character set. That character set is then used for conversions if that code page can be loaded. If not, then the default code page for the current OS is used. Added code to save the inferred type in the name,value constructor of Parameter. Also, inferred type if value of null parameter is changed using Value property. Converted all files to use proper Camel case. MySQL is now MySql in all files. PgSQL is now PgSql. Added attribute to PgSql code to prevent designer from trying to show. Added MySQLDbType property to Parameter object and added proper conversion code to convert from DbType to MySQLDbType). Removed unused ObjectToString method from MySQLParameter.cs. Fixed Add(..) method in ParameterCollection so that it doesn't use Add(name, value) instead. Fixed IndexOf and Contains in ParameterCollection to be aware that parameter names are now stored without @. Fixed Command.ConvertSQLToBytes so it only allows characters that can be in MySQL variable names. Fixed DataReader and Field so that blob fields read their data from Field.cs and GetBytes works right. Added simple query builder editor to CommandText property of MySQLCommand. Fixed CommandBuilder and Parameter serialization to account for Parameters not storing @ in their names. Removed MySQLFieldType enum from Field.cs. Now using MySQLDbType enum. Added Designer attribute to several classes to prevent designer view when using VS.Net. Fixed Initial catalog typo in ConnectionString designer.
1571
Removed 3 parameter constructor for MySQLParameter that conflicted with (name, type, value). Changed MySQLParameter so paramName is now stored without leading @ (this fixed null inserts when using designer). Changed TypeConverter for MySQLParameter to use the constructor with all properties.
1572
The default value of this property is false (i.e. Connector/J does not use server-side prepared statements).
1573
The default value of this property is false (i.e. Connector/J does not use server-side prepared statements). Bugs fixed: Comments auomatically generated by the Hibernate framework could cause problems in the parser when using batched inserts. (Bug #25025)
1574
1575
PreparedStatement.setString() didn't work correctly when sql_mode on server contained NO_BACKSLASH_ESCAPES and no characters that needed escaping were present in the string. Attempt detection of the MySQL type BINARY (it's an alias, so this isn't always reliable), and use the java.sql.Types.BINARY type mapping for it. Moved -bin-g.jar file into separate debug subdirectory to avoid confusion. Don't allow .setAutoCommit(true), or .commit() or .rollback() on an XA-managed connection as per the JDBC specification. If the connection useTimezone is set to true, then also respect time zone conversions in escapeprocessed string literals (for example, "{ts ...}" and "{t ...}"). Return original column name for RSMD.getColumnName() if the column was aliased, alias name for .getColumnLabel() (if aliased), and original table name for .getTableName(). Note this only works for MySQL-4.1 and newer, as older servers don't make this information available to clients. Setting useJDBCCompliantTimezoneShift=true (it's not the default) causes the driver to use GMT for all TIMESTAMP/DATETIME time zones, and the current VM time zone for any other type that refers to time zones. This feature can not be used when useTimezone=true to convert between server and client time zones. Add one level of indirection of internal representation of CallableStatement parameter metadata to avoid class not found issues on JDK-1.3 for ParameterMetadata interface (which doesn't exist prior to JDBC-3.0). Added unit tests for XADatasource, as well as friendlier exceptions for XA failures compared to the "stock" XAException (which has no messages). Idle timeouts cause XAConnections to whine about rolling themselves back. (Bug #14729) Added support for Connector/MXJ integration via url subprotocol jdbc:mysql:mxj://.... Moved all SQLException constructor usage to a factory in SQLError (ground-work for JDBC-4.0 SQLState-based exception classes). Removed Java5-specific calls to BigDecimal constructor (when result set value is '', (int)0 was being used as an argument indirectly via method return value. This signature doesn't exist prior to Java5.) Added service-provider entry to META-INF/services/java.sql.Driver for JDBC-4.0 support. Return "[VAR]BINARY" for RSMD.getColumnTypeName() when that is actually the type, and it can be distinguished (MySQL-4.1 and newer). When fix for Bug #14562 was merged from 3.1.12, added functionality for CallableStatement's parameter metadata to return correct information for .getParameterClassName(). Fuller synchronization of Connection to avoid deadlocks when using multithreaded frameworks that multithread a single connection (usually not recommended, but the JDBC spec allows it anyways), part of fix to Bug #14972). Implementation of Statement.cancel() and Statement.setQueryTimeout(). Both require MySQL-5.0.0 or newer server, require a separate connection to issue the KILL QUERY statement, and in the case of setQueryTimeout() creates an additional thread to handle the timeout functionality. Note: Failures to cancel the statement for setQueryTimeout() may manifest themselves as RuntimeExceptions rather than failing silently, as there is currently no way to unblock the thread that is executing the query being cancelled due to timeout expiration and have it throw the exception instead.
1576
The default value of this property is false (i.e. Connector/J does not use server-side prepared statements).
1577
Fixed bug where driver would not advance to next host if roundRobinLoadBalance=true and the last host in the list is down. Fixed BUG#18258 - DatabaseMetaData.getTables(), columns() with bad catalog parameter threw exception rather than return empty result set (as required by spec). Check and store value for continueBatchOnError property in constructor of Statements, rather than when executing batches, so that Connections closed out from underneath statements don't cause NullPointerExceptions when it's required to check this property. Fixed bug when calling stored functions, where parameters weren't numbered correctly (first parameter is now the return value, subsequent parameters if specified start at index "2").
1578
Added performance feature, re-writing of batched executes for Statement.executeBatch() (for all DML statements) and PreparedStatement.executeBatch() (for INSERTs with VALUE clauses only). Enable by using "rewriteBatchedStatements=true" in your JDBC URL. Fixed CallableStatement.registerOutParameter() not working when some parameters pre-populated. Still waiting for feedback from JDBC experts group to determine what correct parameter count from getMetaData() should be, however. (Bug #17898) Fixed calling clearParameters() on a closed prepared statement causes NPE. (Bug #17587) Map "latin1" on MySQL server to CP1252 for MySQL > 4.1.0. Added additional accessor and mutator methods on ConnectionProperties so that DataSource users can use same naming as regular URL properties. Fixed data truncation and getWarnings() only returns last warning in set. (Bug #18740) Improved performance of retrieving BigDecimal, Time, Timestamp and Date values from serverside prepared statements by creating fewer short-lived instances of Strings when the native type is not an exact match for the requested type. Fixes Bug #18496 for BigDecimals. Fixed aliased column names where length of name > 251 are corrupted. (Bug #18554) Fixed ResultSet.wasNull() not always reset correctly for booleans when done via conversion for server-side prepared statements. (Bug #17450) Fixed invalid classname returned for ResultSetMetaData.getColumnClassName() for BIGINT type. (Bug #19282) Fixed case where driver wasn't reading server status correctly when fetching server-side prepared statement rows, which in some cases could cause warning counts to be off, or multiple result sets to not be read off the wire. Driver now aware of fix for BIT type metadata that went into MySQL-5.0.21 for server not reporting length consistently (Bug #13601). Fixed PreparedStatement.setObject(int, Object, int) doesn't respect scale of BigDecimals. (Bug #19615) Fixed ResultSet.wasNull() returns incorrect value when extracting native string from serverside prepared statement generated result set. (Bug #19282)
1579
storesLowerCaseQuotedIdentifiers() returns false storesMixedCaseIdentifiers() returns true storesMixedCaseQuotedIdentifiers() returns true storesUpperCaseIdentifiers() returns false storesUpperCaseQuotedIdentifiers() returns true If lower_case_table_names=1 (on server): storesLowerCaseIdentifiers() returns true storesLowerCaseQuotedIdentifiers() returns true storesMixedCaseIdentifiers() returns false storesMixedCaseQuotedIdentifiers() returns false storesUpperCaseIdentifiers() returns false storesUpperCaseQuotedIdentifiers() returns true DatabaseMetaData.getColumns() doesn't return TABLE_NAME correctly. (Bug #14815) Escape processor replaces quote character in quoted string with string delimiter. (Bug #14909) OpenOffice expects DBMD.supportsIntegrityEnhancementFacility() to return true if foreign keys are supported by the datasource, even though this method also covers support for check constraints, which MySQL doesn't have. Setting the configuration property overrideSupportsIntegrityEnhancementFacility to true causes the driver to return true for this method. (Bug #12975) Added com.mysql.jdbc.testsuite.url.default system property to set default JDBC url for testsuite (to speed up bug resolution when I'm working in Eclipse). Unable to initialize character set mapping tables (due to J2EE classloader differences). (Bug #14938) Deadlock while closing server-side prepared statements from multiple threads sharing one connection. (Bug #14972) logSlowQueries should give better info. (Bug #12230) Extraneous sleep on autoReconnect. (Bug #13775) Driver incorrectly closes streams passed as arguments to PreparedStatements. Reverts to legacy behavior by setting the JDBC configuration property autoClosePStmtStreams to true (also included in the 3-0-Compat configuration bundle). (Bug #15024) maxQuerySizeToLog is not respected. Added logging of bound values for execute() phase of server-side prepared statements when profileSQL=true as well. (Bug #13048) Usage advisor complains about unreferenced columns, even though they've been referenced. (Bug #15065) Don't increase timeout for failover/reconnect. (Bug #6577) Process escape tokens in Connection.prepareStatement(...). (Bug #15141) You can disable this behavior by setting the JDBC URL configuration property processEscapeCodesForPrepStmts to false.
1580
Reconnect during middle of executeBatch() should not occur if autoReconnect is enabled. (Bug #13255)
1581
getBestRowIdentifier() getColumns() getCrossReference() getExportedKeys() getImportedKeys() getIndexInfo() getPrimaryKeys() getProcedures() (and thus indirectly getProcedureColumns()) getTables() The catalog argument in all of these methods now behaves in the following way: Specifying NULL means that catalog will not be used to filter the results (thus all databases will be searched), unless you've set nullCatalogMeansCurrent=true in your JDBC URL properties. Specifying "" means current catalog, even though this isn't quite JDBC spec compliant, it's there for legacy users. Specifying a catalog works as stated in the API docs. Made Connection.clientPrepare() available from wrapped connections in the jdbc2.optional package (connections built by ConnectionPoolDataSource instances). Added Connection.isMasterConnection() for clients to be able to determine if a multi-host master/slave connection is connected to the first host in the list. Tokenizer for = in URL properties was causing sessionVariables=.... to be parameterized incorrectly. (Bug #12753) Foreign key information that is quoted is parsed incorrectly when DatabaseMetaData methods use that information. (Bug #11781) The sendBlobChunkSize property is now clamped to max_allowed_packet with consideration of stream buffer size and packet headers to avoid PacketTooBigExceptions when max_allowed_packet is similar in size to the default sendBlobChunkSize which is 1M. CallableStatement.clearParameters() now clears resources associated with INOUT/OUTPUT parameters as well as INPUT parameters. Connection.prepareCall() is database name case-sensitive (on Windows systems). (Bug #12417) cp1251 incorrectly mapped to win1251 for servers newer than 4.0.x. (Bug #12752) java.sql.Types.OTHER returned for BINARY and VARBINARY columns when using DatabaseMetaData.getColumns(). (Bug #12970) ServerPreparedStatement.getBinding() now checks if the statement is closed before attempting to reference the list of parameter bindings, to avoid throwing a NullPointerException. ResultSetMetaData from Statement.getGeneratedKeys() caused a NullPointerException to be thrown whenever a method that required a connection reference was called. (Bug #13277)
1582
Backport of Field class, ResultSetMetaData.getColumnClassName(), and ResultSet.getObject(int) changes from 5.0 branch to fix behavior surrounding VARCHAR BINARY/VARBINARY and related types. Fixed NullPointerException when converting catalog parameter in many DatabaseMetaDataMethods to byte[]s (for the result set) when the parameter is null. (null isn't technically allowed by the JDBC specification, but we've historically allowed it). Backport of VAR[BINARY|CHAR] [BINARY] types detection from 5.0 branch. Read response in MysqlIO.sendFileToServer(), even if the local file can't be opened, otherwise next query issued will fail, because it's reading the response to the empty LOAD DATA INFILE packet sent to the server. Workaround for Bug #13374: ResultSet.getStatement() on closed result set returns NULL (as per JDBC 4.0 spec, but not backward-compatible). Set the connection property retainStatementAfterResultSetClose to true to be able to retrieve a ResultSet's statement after the ResultSet has been closed via .getStatement() (the default is false, to be JDBC-compliant and to reduce the chance that code using JDBC leaks Statement instances). URL configuration parameters don't allow & or = in their values. The JDBC driver now parses configuration parameters as if they are encoded using the application/x-www-form-urlencoded format as specified by java.net.URLDecoder (http://java.sun.com/j2se/1.5.0/docs/api/java/net/ URLDecoder.html). (Bug #13453) If the % character is present in a configuration property, it must now be represented as %25, which is the encoded form of % when using application/x-www-form-urlencoded encoding. The configuration property sessionVariables now allows you to specify variables that start with the @ sign. When gatherPerfMetrics is enabled for servers older than 4.1.0, a NullPointerException is thrown from the constructor of ResultSet if the query doesn't use any tables. (Bug #13043)
1583
Unsigned SMALLINT treated as signed for ResultSet.getInt(), fixed all cases for UNSIGNED integer values and server-side prepared statements, as well as ResultSet.getObject() for UNSIGNED TINYINT. (Bug #10156) Double quotes not recognized when parsing client-side prepared statements. (Bug #10155) Made enableStreamingResults() visible on com.mysql.jdbc.jdbc2.optional.StatementWrapper. Made ServerPreparedStatement.asSql() work correctly so auto-explain functionality would work with server-side prepared statements. Made JDBC2-compliant wrappers public in order to allow access to vendor extensions. Cleaned up logging of profiler events, moved code to dump a profiler event as a string to com.mysql.jdbc.log.LogUtils so that third parties can use it. DatabaseMetaData.supportsMultipleOpenResults() now returns true. The driver has supported this for some time, DBMD just missed that fact. Driver doesn't support {?=CALL(...)} for calling stored functions. This involved adding support for function retrieval to DatabaseMetaData.getProcedures() and getProcedureColumns() as well. (Bug #10310) SQLException thrown when retrieving YEAR(2) with ResultSet.getString(). The driver will now always treat YEAR types as java.sql.Dates and return the correct values for getString(). Alternatively, the yearIsDateType connection property can be set to false and the values will be treated as SHORTs. (Bug #10485) The datatype returned for TINYINT(1) columns when tinyInt1isBit=true (the default) can be switched between Types.BOOLEAN and Types.BIT using the new configuration property transformedBitIsBoolean, which defaults to false. If set to false (the default), DatabaseMetaData.getColumns() and ResultSetMetaData.getColumnType() will return Types.BOOLEAN for TINYINT(1) columns. If true, Types.BOOLEAN will be returned instead. Regardless of this configuration property, if tinyInt1isBit is enabled, columns with the type TINYINT(1) will be returned as java.lang.Boolean instances from ResultSet.getObject(...), and ResultSetMetaData.getColumnClassName() will return java.lang.Boolean. SQLException is thrown when using property characterSetResults with cp932 or eucjpms. (Bug #10496) Reorganized directory layout. Sources now are in src folder. Don't pollute parent directory when building, now output goes to ./build, distribution goes to ./dist. Added support/bug hunting feature that generates .sql test scripts to STDERR when autoGenerateTestcaseScript is set to true. 0-length streams not sent to server when using server-side prepared statements. (Bug #10850) Setting cachePrepStmts=true now causes the Connection to also cache the check the driver performs to determine if a prepared statement can be server-side or not, as well as caches serverside prepared statements for the lifetime of a connection. As before, the prepStmtCacheSize parameter controls the size of these caches. Try to handle OutOfMemoryErrors more gracefully. Although not much can be done, they will in most cases close the connection they happened on so that further operations don't run into a connection in some unknown state. When an OOM has happened, any further operations on the connection will fail with a Connection closed exception that will also list the OOM exception as the reason for the implicit connection close event. Don't send COM_RESET_STMT for each execution of a server-side prepared statement if it isn't required.
1584
Driver detects if you're running MySQL-5.0.7 or later, and does not scan for LIMIT ?[,?] in statements being prepared, as the server supports those types of queries now. VARBINARY data corrupted when using server-side prepared statements and ResultSet.getBytes(). (Bug #11115) Connection.setCatalog() is now aware of the useLocalSessionState configuration property, which when set to true will prevent the driver from sending USE ... to the server if the requested catalog is the same as the current catalog. Added the following configuration bundles, use one or many via the useConfigs configuration property: maxPerformance maximum performance without being reckless solarisMaxPerformance maximum performance for Solaris, avoids syscalls where it can 3-0-Compat Compatibility with Connector/J 3.0.x functionality Added maintainTimeStats configuration property (defaults to true), which tells the driver whether or not to keep track of the last query time and the last successful packet sent to the server's time. If set to false, removes two syscalls per query. autoReconnect ping causes exception on connection startup. (Bug #11259) Connector/J dumping query into SQLException twice. (Bug #11360) Fixed PreparedStatement.setClob() not accepting null as a parameter. Production package doesn't include JBoss integration classes. (Bug #11411) Removed nonsensical costly type conversion warnings when using usage advisor.
1585
A continuation of Bug #8868, where functions used in queries that should return non-string types when resolved by temporary tables suddenly become opaque binary strings (work-around for server limitation). Also fixed fields with type of CHAR(n) CHARACTER SET BINARY to return correct/ matching classes for RSMD.getColumnClassName() and ResultSet.getObject(). (Bug #9236) DBMD.supportsResultSetConcurrency() not returning true for forward-only/read-only result sets (we obviously support this). (Bug #8792) DATA_TYPE column from DBMD.getBestRowIdentifier() causes ArrayIndexOutOfBoundsException when accessed (and in fact, didn't return any value). (Bug #8803) Check for empty strings ('') when converting CHAR/VARCHAR column data to numbers, throw exception if emptyStringsConvertToZero configuration property is set to false (for backwardcompatibility with 3.0, it is now set to true by default, but will most likely default to false in 3.2). PreparedStatement.getMetaData() inserts blank row in database under certain conditions when not using server-side prepared statements. (Bug #9320) Connection.canHandleAsPreparedStatement() now makes best effort to distinguish LIMIT clauses with placeholders in them from ones without in order to have fewer false positives when generating work-arounds for statements the server cannot currently handle as server-side prepared statements. Fixed build.xml to not compile log4j logging if log4j not available. Added support for the c3p0 connection pool's (http://c3p0.sf.net/) validation/connection checker interface which uses the lightweight COM_PING call to the server if available. To use it, configure your c3p0 connection pool's connectionTesterClassName property to use com.mysql.jdbc.integration.c3p0.MysqlConnectionTester. Better detection of LIMIT inside/outside of quoted strings so that the driver can more correctly determine whether a prepared statement can be prepared on the server or not. Stored procedures with same name in different databases confuse the driver when it tries to determine parameter counts/types. (Bug #9319) Added finalizers to ResultSet and Statement implementations to be JDBC spec-compliant, which requires that if not explicitly closed, these resources should be closed upon garbage collection. Stored procedures with DECIMAL parameters with storage specifications that contained , in them would fail. (Bug #9682) PreparedStatement.setObject(int, Object, int type, int scale) now uses scale value for BigDecimal instances. Statement.getMoreResults() could throw NPE when existing result set was .close()d. (Bug #9704) The performance metrics feature now gathers information about number of tables referenced in a SELECT. The logging system is now automatically configured. If the value has been set by the user, via the URL property logger or the system property com.mysql.jdbc.logger, then use that, otherwise, autodetect it using the following steps: 1. Log4j, if it's available, 2. Then JDK1.4 logging, 3. Then fallback to our STDERR logging.
1586
DBMD.getTables() shouldn't return tables if views are asked for, even if the database version doesn't support views. (Bug #9778) Fixed driver not returning true for -1 when ResultSet.getBoolean() was called on result sets returned from server-side prepared statements. Added a Manifest.MF file with implementation information to the .jar file. More tests in Field.isOpaqueBinary() to distinguish opaque binary (that is, fields with type CHAR(n) and CHARACTER SET BINARY) from output of various scalar and aggregate functions that return strings. Should accept null for catalog (meaning use current) in DBMD methods, even though it's not JDBC-compliant for legacy's sake. Disable by setting connection property nullCatalogMeansCurrent to false (which will be the default value in C/J 3.2.x). (Bug #9917) Should accept null for name patterns in DBMD (meaning %), even though it isn't JDBC compliant, for legacy's sake. Disable by setting connection property nullNamePatternMatchesAll to false (which will be the default value in C/J 3.2.x). (Bug #9769)
1587
Fixed bug with Connection not caching statements from prepareStatement() when the statement wasn't a server-side prepared statement. Choose correct direction to apply time adjustments when both client and server are in GMT time zone when using ResultSet.get(..., cal) and PreparedStatement.set(...., cal). Added dontTrackOpenResources option (default is false, to be JDBC compliant), which helps with memory use for non-well-behaved apps (that is, applications that don't close Statement objects when they should). ResultSet.getString() doesn't maintain format stored on server, bug fix only enabled when noDatetimeStringSync property is set to true (the default is false). (Bug #8428) Fixed NPE in ResultSet.realClose() when using usage advisor and result set was already closed. PreparedStatements not creating streaming result sets. (Bug #8487) Don't pass NULL to String.valueOf() in ResultSet.getNativeConvertToString(), as it stringifies it (that is, returns null), which is not correct for the method in question. ResultSet.getBigDecimal() throws exception when rounding would need to occur to set scale. The driver now chooses a rounding mode of half up if non-rounding BigDecimal.setScale() fails. (Bug #8424) Added useLocalSessionState configuration property, when set to true the JDBC driver trusts that the application is well-behaved and only sets autocommit and transaction isolation levels using the methods provided on java.sql.Connection, and therefore can manipulate these values in many cases without incurring round-trips to the database server. Added enableStreamingResults() to Statement for connection pool implementations that check Statement.setFetchSize() for specification-compliant values. Call Statement.setFetchSize(>=0) to disable the streaming results for that statement. Added support for BIT type in MySQL-5.0.3. The driver will treat BIT(1-8) as the JDBC standard BIT type (which maps to java.lang.Boolean), as the server does not currently send enough information to determine the size of a bitfield when < 9 bits are declared. BIT(>9) will be treated as VARBINARY, and will return byte[] when getObject() is called.
1588
Handle case when string representation of timestamp contains trailing . with no numbers following it. Inefficient detection of pre-existing string instances in ResultSet.getNativeString(). (Bug #5706) Don't throw exceptions for Connection.releaseSavepoint(). Use a per-session Calendar instance by default when decoding dates from ServerPreparedStatements (set to old, less performant behavior by setting property dynamicCalendars=true). Added experimental configuration property dontUnpackBinaryResults, which delays unpacking binary result set values until they're asked for, and only creates object instances for non-numerical values (it is set to false by default). For some usecase/jvm combinations, this is friendlier on the garbage collector. UNSIGNED BIGINT unpacked incorrectly from server-side prepared statement result sets. (Bug #5729) ServerSidePreparedStatement allocating short-lived objects unnecessarily. (Bug #6225) Removed unwanted new Throwable() in ResultSet constructor due to bad merge (caused a new object instance that was never used for every result set created). Found while profiling for Bug #6359. Fixed too-early creation of StringBuffer in EscapeProcessor.escapeSQL(), also return String when escaping not needed (to avoid unnecessary object allocations). Found while profiling for Bug #6359. Use null-safe-equals for key comparisons in updatable result sets. SUM() on DECIMAL with server-side prepared statement ignores scale if zero-padding is needed (this ends up being due to conversion to DOUBLE by server, which when converted to a string to parse into BigDecimal, loses all padding zeros). (Bug #6537) Use DatabaseMetaData.getIdentifierQuoteString() when building DBMD queries. Use 1MB packet for sending file for LOAD DATA LOCAL INFILE if that is < max_allowed_packet on server. ResultSetMetaData.getColumnDisplaySize() returns incorrect values for multi-byte charsets. (Bug #6399) Make auto-deserialization of java.lang.Objects stored in BLOB columns configurable via autoDeserialize property (defaults to false). Re-work Field.isOpaqueBinary() to detect CHAR(n) CHARACTER SET BINARY to support fixed-length binary fields for ResultSet.getObject(). Use our own implementation of buffered input streams to get around blocking behavior of java.io.BufferedInputStream. Disable this with useReadAheadInput=false. Failing to connect to the server when one of the addresses for the given host name is IPV6 (which the server does not yet bind on). The driver now loops through all IP addresses for a given host, and stops on the first one that accepts() a socket.connect(). (Bug #6348)
1589
Added support in DatabaseMetaData.getTables() and getTableTypes() for views, which are now available in MySQL server 5.0.x. ServerPreparedStatement.execute*() sometimes threw ArrayIndexOutOfBoundsException when unpacking field metadata. (Bug #4642) Optimized integer number parsing, enable old slower integer parsing using JDK classes via useFastIntParsing=false property. Added useOnlyServerErrorMessages property, which causes message text in exceptions generated by the server to only contain the text sent by the server (as opposed to the SQLState's standard description, followed by the server's error message). This property is set to true by default. ResultSet.wasNull() does not work for primatives if a previous null was returned. (Bug #4689) Track packet sequence numbers if enablePacketDebug=true, and throw an exception if packets received out-of-order. ResultSet.getObject() returns wrong type for strings when using prepared statements. (Bug #4482) Calling MysqlPooledConnection.close() twice (even though an application error), caused NPE. Fixed. ServerPreparedStatements dealing with return of DECIMAL type don't work. (Bug #5012) ResultSet.getObject() doesn't return type Boolean for pseudo-bit types from prepared statements on 4.1.x (shortcut for avoiding extra type conversion when using binary-encoded result sets obscured test in getObject() for pseudo bit type). (Bug #5032) You can now use URLs in LOAD DATA LOCAL INFILE statements, and the driver will use Java's built-in handlers for retreiving the data and sending it to the server. This feature is not enabled by default, you must set the allowUrlInLocalInfile connection property to true. The driver is more strict about truncation of numerics on ResultSet.get*(), and will throw an SQLException when truncation is detected. You can disable this by setting jdbcCompliantTruncation to false (it is enabled by default, as this functionality is required for JDBC compliance). Added three ways to deal with all-zero datetimes when reading them from a ResultSet: exception (the default), which throws an SQLException with an SQLState of S1009; convertToNull, which returns NULL instead of the date; and round, which rounds the date to the nearest closest value which is '0001-01-01'. Fixed ServerPreparedStatement to read prepared statement metadata off the wire, even though it's currently a placeholder instead of using MysqlIO.clearInputStream() which didn't work at various times because data wasn't available to read from the server yet. This fixes sporadic errors users were having with ServerPreparedStatements throwing ArrayIndexOutOfBoundExceptions. Use com.mysql.jdbc.Message's classloader when loading resource bundle, should fix sporadic issues when the caller's classloader can't locate the resource bundle.
1590
Use SQL Standard SQL states by default, unless useSqlStateCodes property is set to false. Added packet debuging code (see the enablePacketDebug property documentation). Added constants for MySQL error numbers (publicly accessible, see com.mysql.jdbc.MysqlErrorNumbers), and the ability to generate the mappings of vendor error codes to SQLStates that the driver uses (for documentation purposes). Externalized more messages (on-going effort). Error in retrieval of mediumint column with prepared statements and binary protocol. (Bug #4311) Support new time zone variables in MySQL-4.1.3 when useTimezone=true. Support for unsigned numerics as return types from prepared statements. This also causes a change in ResultSet.getObject() for the bigint unsigned type, which used to return BigDecimal instances, it now returns instances of java.lang.BigInteger.
1591
Fixed DatabaseMetaData.getProcedures() when run on MySQL-5.0.0 (output of SHOW PROCEDURE STATUS changed between 5.0.0 and 5.0.1. getWarnings() returns SQLWarning instead of DataTruncation. (Bug #3804) Don't enable server-side prepared statements for server version 5.0.0 or 5.0.1, as they aren't compatible with the '4.1.2+' style that the driver uses (the driver expects information to come back that isn't there, so it hangs).
1592
Fixed stack overflow in Connection.prepareCall() (bad merge). Fixed IllegalAccessError to Calendar.getTimeInMillis() in DateTimeValue (for JDK < 1.4). DatabaseMetaData.getColumns() is not returning correct column ordinal info for non-'%' column name patterns. (Bug #1673) Merged fix of datatype mapping from MySQL type FLOAT to java.sql.Types.REAL from 3.0 branch. Detect collation of column for RSMD.isCaseSensitive(). Fixed sending of queries larger than 16M. Added named and indexed input/output parameter support to CallableStatement. MySQL-5.0.x or newer. Fixed NullPointerException in ServerPreparedStatement.setTimestamp(), as well as year and month descrepencies in ServerPreparedStatement.setTimestamp(), setDate(). Added ability to have multiple database/JVM targets for compliance and regression/unit tests in build.xml. Fixed NPE and year/month bad conversions when accessing some datetime functionality in ServerPreparedStatements and their resultant result sets. Display where/why a connection was implicitly closed (to aid debugging). CommunicationsException implemented, that tries to determine why communications was lost with a server, and displays possible reasons when .getMessage() is called. NULL values for numeric types in binary encoded result sets causing NullPointerExceptions. (Bug #2359) Implemented Connection.prepareCall(), and DatabaseMetaData. getProcedures() and getProcedureColumns(). Reset long binary parameters in ServerPreparedStatement when clearParameters() is called, by sending COM_RESET_STMT to the server. Merged prepared statement caching, and .getMetaData() support from 3.0 branch. Fixed off-by-1900 error in some cases for years in TimeUtil.fastDate/TimeCreate() when unpacking results from server-side prepared statements. Fixed charset conversion issue in getTables(). (Bug #2502) Implemented multiple result sets returned from a statement or stored procedure. Server-side prepared statements were not returning datatype YEAR correctly. (Bug #2606) Enabled streaming of result sets from server-side prepared statements. Class-cast exception when using scrolling result sets and server-side prepared statements. (Bug #2623) Merged unbuffered input code from 3.0. Fixed ConnectionProperties that weren't properly exposed via accessors, cleaned up ConnectionProperties code. NULL fields were not being encoded correctly in all cases in server-side prepared statements. (Bug #2671)
1593
Fixed rare buffer underflow when writing numbers into buffers for sending prepared statement execution requests. Use DocBook version of docs for shipped versions of drivers.
1594
Which requires hex escaping of binary data when using multi-byte charsets with prepared statements. (Bug #8064) NON_UNIQUE column from DBMD.getIndexInfo() returned inverted value. (Bug #8812) Workaround for server Bug #9098: Default values of CURRENT_* for DATE, TIME, DATETIME, and TIMESTAMP columns can't be distinguished from string values, so UpdatableResultSet.moveToInsertRow() generates bad SQL for inserting default values. EUCKR charset is sent as SET NAMES euc_kr which MySQL-4.1 and newer doesn't understand. (Bug #8629) DatabaseMetaData.supportsSelectForUpdate() returns correct value based on server version. Use hex escapes for PreparedStatement.setBytes() for double-byte charsets including aliases Windows-31J, CP934, MS932. Added support for the EUC_JP_Solaris character encoding, which maps to a MySQL encoding of eucjpms (backported from 3.1 branch). This only works on servers that support eucjpms, namely 5.0.3 or later.
1595
Removed redundant calls to checkRowPos() in ResultSet. DOUBLE mapped twice in DBMD.getTypeInfo(). (Bug #4742) Added FLOSS license exemption. Calling .close() twice on a PooledConnection causes NPE. (Bug #4808) DBMD.getColumns() returns incorrect JDBC type for unsigned columns. This affects type mappings for all numeric types in the RSMD.getColumnType() and RSMD.getColumnTypeNames() methods as well, to ensure that like types from DBMD.getColumns() match up with what RSMD.getColumnType() and getColumnTypeNames() return. (Bug #4138, Bug #4860) Production is now GA (General Availability) in naming scheme of distributions. RSMD.getPrecision() returning 0 for non-numeric types (should return max length in chars for non-binary types, max length in bytes for binary types). This fix also fixes mapping of RSMD.getColumnType() and RSMD.getColumnTypeName() for the BLOB types based on the length sent from the server (the server doesn't distinguish between TINYBLOB, BLOB, MEDIUMBLOB or LONGBLOB at the network protocol level). (Bug #4880) ResultSet should release Field[] instance in .close(). (Bug #5022) ResultSet.getMetaData() should not return incorrectly initialized metadata if the result set has been closed, but should instead throw an SQLException. Also fixed for getRow() and getWarnings() and traversal methods by calling checkClosed() before operating on instancelevel fields that are nullified during .close(). (Bug #5069) Parse new time zone variables from 4.1.x servers. Use _binary introducer for PreparedStatement.setBytes() and set*Stream() when connected to MySQL-4.1.x or newer to avoid misinterpretation during character conversion.
1596
Map duplicate key and foreign key errors to SQLState of 23000. Backport documentation tooling from 3.1 branch. Return creating statement for ResultSets created by getGeneratedKeys(). (Bug #2957) Allow java.util.Date to be sent in as parameter to PreparedStatement.setObject(), converting it to a Timestamp to maintain full precision. (Bug #103). Don't truncate BLOB or CLOB values when using setBytes() and/or setBinary/ CharacterStream(). (Bug #2670). Dynamically configure character set mappings for field-level character sets on MySQL-4.1.0 and newer using SHOW COLLATION when connecting. Map binary character set to US-ASCII to support DATETIME charset recognition for servers >= 4.1.2. Use SET character_set_results during initialization to allow any charset to be returned to the driver for result sets. Use charsetnr returned during connect to encode queries before issuing SET NAMES on MySQL >= 4.1.0. Add helper methods to ResultSetMetaData (getColumnCharacterEncoding() and getColumnCharacterSet()) to allow end-users to see what charset the driver thinks it should be using for the column. Only set character_set_results for MySQL >= 4.1.0. StringUtils.escapeSJISByteStream() not covering all eastern double-byte charsets correctly. (Bug #3511) Renamed StringUtils.escapeSJISByteStream() to more appropriate escapeEasternUnicodeByteStream(). Not specifying database in URL caused MalformedURL exception. (Bug #3554) Auto-convert MySQL encoding names to Java encoding names if used for characterEncoding property. Added encoding names that are recognized on some JVMs to fix case where they were reversemapped to MySQL encoding names incorrectly. Use junit.textui.TestRunner for all unit tests (to allow them to be run from the command line outside of Ant or Eclipse). UpdatableResultSet not picking up default values for moveToInsertRow(). (Bug #3557) Inconsistent reporting of data type. The server still doesn't return all types for *BLOBs *TEXT correctly, so the driver won't return those correctly. (Bug #3570) DBMD.getSQLStateType() returns incorrect value. (Bug #3520) Fixed regression in PreparedStatement.setString() and eastern character encodings. Made StringRegressionTest 4.1-unicode aware.
1597
AutoReconnect time was growing faster than exponentially. (Bug #2447) Fixed failover always going to last host in list. (Bug #2578) Added useUnbufferedInput parameter, and now use it by default (due to JVM issue http:// developer.java.sun.com/developer/bugParade/bugs/4401235.html) Detect on/off or 1, 2, 3 form of lower_case_table_names value on server. Return java.lang.Integer for TINYINT and SMALLINT types from ResultSetMetaData.getColumnClassName(). (Bug #2852) Return java.lang.Double for FLOAT type from ResultSetMetaData.getColumnClassName(). (Bug #2855) Return [B instead of java.lang.Object for BINARY, VARBINARY and LONGVARBINARY types from ResultSetMetaData.getColumnClassName() (JDBC compliance). Issue connection events on all instances created from a ConnectionPoolDataSource.
1598
Implement ResultSet.updateClob(). ResultSetMetaData.isCaseSensitive() returned wrong value for CHAR/VARCHAR columns. Connection property maxRows not honored. (Bug #1933) Statements being created too many times in DBMD.extractForeignKeyFromCreateTable(). (Bug #1925) Support escape sequence {fn convert ... }. (Bug #1914) ArrayIndexOutOfBounds when parameter number == number of parameters + 1. (Bug #1958) ResultSet.findColumn() should use first matching column name when there are duplicate column names in SELECT query (JDBC-compliance). (Bug #2006) Removed static synchronization bottleneck from PreparedStatement.setTimestamp(). Removed static synchronization bottleneck from instance factory method of SingleByteCharsetConverter. Enable caching of the parsing stage of prepared statements via the cachePrepStmts, prepStmtCacheSize, and prepStmtCacheSqlLimit properties (disabled by default). Speed up parsing of PreparedStatements, try to use one-pass whenever possible. Fixed security exception when used in Applets (applets can't read the system property file.encoding which is needed for LOAD DATA LOCAL INFILE). Use constants for SQLStates. Map charset ko18_ru to ko18r when connected to MySQL-4.1.0 or newer. Ensure that Buffer.writeString() saves room for the \0. Fixed exception Unknown character set 'danish' on connect with JDK-1.4.0 Fixed mappings in SQLError to report deadlocks with SQLStates of 41000. maxRows property would affect internal statements, so check it for all statement creation internal to the driver, and set to 0 when it is not.
1599
Fix UpdatableResultSet to return values for getXXX() when on insert row. (Bug #675) The insertRow in an UpdatableResultSet is now loaded with the default column values when moveToInsertRow() is called. (Bug #688) DatabaseMetaData.getColumns() wasn't returning NULL for default values that are specified as NULL. Change default statement type/concurrency to TYPE_FORWARD_ONLY and CONCUR_READ_ONLY (spec compliance). Don't try and reset isolation level on reconnect if MySQL doesn't support them. Don't wrap SQLExceptions in RowDataDynamic. Don't change timestamp TZ twice if useTimezone==true. (Bug #774) Fixed regression in large split-packet handling. (Bug #848) Better diagnostic error messages in exceptions for streaming result sets. Issue exception on ResultSet.getXXX() on empty result set (wasn't caught in some cases). Don't hide messages from exceptions thrown in I/O layers. Don't fire connection closed events when closing pooled connections, or on PooledConnection.getConnection() with already open connections. (Bug #884) Clip +/- INF (to smallest and largest representative values for the type in MySQL) and NaN (to 0) for setDouble/setFloat(), and issue a warning on the statement when the server does not support +/- INF or NaN. Double-escaping of '\' when charset is SJIS or GBK and '\' appears in non-escaped input. (Bug #879) When emptying input stream of unused rows for streaming result sets, have the current thread yield() every 100 rows in order to not monopolize CPU time. DatabaseMetaData.getColumns() getting confused about the keyword set in character columns. (Bug #1099) Fixed deadlock issue with Statement.setMaxRows(). Fixed CLOB.truncate(). (Bug #1130) Optimized CLOB.setChracterStream(). (Bug #1131) Made databaseName, portNumber, and serverName optional parameters for MysqlDataSourceFactory. (Bug #1246) ResultSet.get/setString mashing char 127. (Bug #1247) Backported authentication changes for 4.1.1 and newer from 3.1 branch. Added com.mysql.jdbc.util.BaseBugReport to help creation of testcases for bug reports. Added property to clobber streaming results, by setting the clobberStreamingResults property to true (the default is false). This will cause a streaming ResultSet to be automatically closed, and any oustanding data still streaming from the server to be discarded if another query is executed before all the data has been read from the server.
1600
Return list of generated keys when using multi-value INSERTS with Statement.getGeneratedKeys(). Use JVM charset with filenames and LOAD DATA [LOCAL] INFILE. Fix infinite loop with Connection.cleanup(). Changed Ant target compile-core to compile-driver, and made testsuite compilation a separate target. Fixed result set not getting set for Statement.executeUpdate(), which affected getGeneratedKeys() and getUpdateCount() in some cases. Unicode character 0xFFFF in a string would cause the driver to throw an ArrayOutOfBoundsException. (Bug #378). Return correct number of generated keys when using REPLACE statements. Fix problem detecting server character set in some cases. Fix row data decoding error when using very large packets. Optimized row data decoding. Issue exception when operating on an already closed prepared statement. Fixed SJIS encoding bug, thanks to Naoto Sato. Optimized usage of EscapeProcessor. Allow multiple calls to Statement.close().
1601
Ensure that packet size from alignPacketSize() does not exceed max_allowed_packet (JVM bug) Don't reset Connection.isReadOnly() when autoReconnecting.
1602
Added support for quoted identifiers in PreparedStatement parser. Streamlined character conversion and byte[] handling in PreparedStatements for setByte(). Reduce memory footprint of PreparedStatements by sharing outbound packet with MysqlIO. Added strictUpdates property to allow control of amount of checking for correctness of updatable result sets. Set this to false if you want faster updatable result sets and you know that you create them from SELECT statements on tables with primary keys and that you have selected all primary keys in your query. Added support for 4.0.8-style large packets. Fixed PreparedStatement.executeBatch() parameter overwriting.
1603
Substitute '?' for unknown character conversions in single-byte character sets instead of '\0'. NamedPipeSocketFactory now works (only intended for Windows), see README for instructions.
1604
Fixed DBMD.supportsResultSetConcurrency() so that it returns true for ResultSet.TYPE_SCROLL_INSENSITIVE and ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE. Fixed ResultSet.isLast() for empty result sets (should return false). PreparedStatement now honors stream lengths in setBinary/Ascii/Character Stream() unless you set the connection property useStreamLengthsInPrepStmts to false. Removed some not-needed temporary object creation by smarter use of Strings in EscapeProcessor, Connection and DatabaseMetaData classes.
1605
Fix and sort primary key names in DBMetaData (SF bugs 582086 and 582086). Float types now reported as java.sql.Types.FLOAT (SF bug 579573). ResultSet.getTimestamp() now works for DATE types (SF bug 559134). ResultSet.getDate/Time/Timestamp now recognizes all forms of invalid values that have been set to all zeros by MySQL (SF bug 586058). Testsuite now uses Junit (which you can get from http://www.junit.org. The driver now only works with JDK-1.2 or newer. Added multi-host failover support (see README). General source-code cleanup. Overall speed improvements via controlling transient object creation in MysqlIO class when reading packets. Performance improvements in string handling and field metadata creation (lazily instantiated) contributed by Alex Twisleton-Wykeham-Fiennes.
1606
1607
Full synchronization on methods modifying instance and class-shared references, driver should be entirely thread-safe now (please let me know if you have problems). DataSource implementations moved to org.gjt.mm.mysql.jdbc2.optional package, and (initial) implementations of PooledConnectionDataSource and XADataSource are in place (thanks to Todd Wolff for the implementation and testing of PooledConnectionDataSource with IBM WebSphere 4). Added detection of network connection being closed when reading packets (thanks to Todd Lizambri). Fixed quoting error with escape processor (bug 486265). Report batch update support through DatabaseMetaData (bug 495101). Fixed off-by-one-hour error in PreparedStatement.setTimestamp() (bug 491577). Removed concatenation support from driver (the || operator), as older versions of VisualAge seem to be the only thing that use it, and it conflicts with the logical || operator. You will need to start mysqld with the --ansi flag to use the || operator as concatenation (bug 491680). Fixed casting bug in PreparedStatement (bug 488663).
1608
Captialize type names when captializeTypeNames=true is passed in URL or properties (for WebObjects. (thanks to Anjo Krank) Updatable result sets now correctly handle NULL values in fields. PreparedStatement.setDouble() now uses full-precision doubles (reverting a fix made earlier to truncate them). PreparedStatement.setBoolean() will use 1/0 for values if your MySQL version is 3.21.23 or higher.
1609
Cleaned up exception handling when driver connects. Columns that are of type TEXT now return as Strings when you use getObject(). DatabaseMetaData.getPrimaryKeys() now works correctly with respect to key_seq. Thanks to Brian Slesinsky. No escape processing is done on PreparedStatements anymore per JDBC spec. Fixed many JDBC-2.0 traversal, positioning bugs, especially with respect to empty result sets. Thanks to Ron Smits, Nick Brook, Cessar Garcia and Carlos Martinez. Fixed some issues with updatability support in ResultSet when using multiple primary keys.
1610
ResultSet.getDate(), getTime(), and getTimestamp() fixes. (contributed by Alan Wilken) EscapeProcessor now handles \{ \} and { or } inside quotes correctly. (thanks to Alik for some ideas on how to fix it) Fixes to properties handling in Connection. (contributed by Juho Tikkala) ResultSet.getObject() now returns null for NULL columns in the table, rather than bombing out. (thanks to Ben Grosman) ResultSet.getObject() now returns Strings for types from MySQL that it doesn't know about. (Suggested by Chris Perdue) Removed DataInput/Output streams, not needed, 1/2 number of method calls per IO operation. Use default character encoding if one is not specified. This is a work-around for broken JVMs, because according to spec, EVERY JVM must support "ISO8859_1", but they don't. Fixed Connection to use the platform character encoding instead of "ISO8859_1" if one isn't explicitly set. This fixes problems people were having loading the character- converter classes that didn't always exist (JVM bug). (thanks to Fritz Elfert for pointing out this problem) Changed MysqlIO to re-use packets where possible to reduce memory usage. Fixed escape-processor bugs pertaining to {} inside quotes.
1611
MysqlIO.quit() now closes the socket connection. Before, after many failed connections some OS's would run out of file descriptors. (thanks to Michael Brinkman) Fixed NullPointerException in Driver.getPropertyInfo. (thanks to Dave Potts) Fixes to MysqlDefs to allow all *text fields to be retrieved as Strings. (thanks to Chris at Leverage) Fixed setDouble in PreparedStatement for large numbers to avoid sending scientific notation to the database. (thanks to J.S. Ferguson) Fixed getScale() and getPrecision() in RSMD. (contrib'd by James Klicman) Fixed getObject() when field was DECIMAL or NUMERIC (thanks to Bert Hobbs) DBMD.getTables() bombed when passed a null table-name pattern. Fixed. (thanks to Richard Lobb) Added check for "client not authorized" errors during connect. (thanks to Hannes Wallnoefer)
1612
Util now has a static method readObject() which given a ResultSet and a column index will reinstantiate an object serialized in the above manner.
1613
Fixed a bug in ResultSet that would break some queries that only returned 1 row. Fixed bugs in DatabaseMetaData.getTables(), DatabaseMetaData.getColumns() and DatabaseMetaData.getCatalogs(). Added functionality to Statement that allows executeUpdate() to store values for IDs that are automatically generated for AUTO_INCREMENT fields. Basically, after an executeUpdate(), look at the SQLWarnings for warnings like "LAST_INSERTED_ID = 'some number', COMMAND = 'your SQL query'". If you are using AUTO_INCREMENT fields in your tables and are executing a lot of executeUpdate()s on one Statement, be sure to clearWarnings() every so often to save memory.
1614
This appendix helps you port MySQL to other operating systems. Do check the list of currently supported operating systems first. See Seccin 2.1.1, Sistemas operativos que MySQL soporta. If you have created a new port of MySQL, please let us know so that we can list it here and on our Web site (http://www.mysql.com/), recommending it to other users. Note: If you create a new port of MySQL, you are free to copy and distribute it under the GPL license, but it does not make you a copyright holder of MySQL. A working POSIX thread library is needed for the server. On Solaris 2.5 we use Sun PThreads (the native thread support in 2.4 and earlier versions is not good enough), on Linux we use LinuxThreads by Xavier Leroy, <Xavier.Leroy@inria.fr>. The hard part of porting to a new Unix variant without good native thread support is probably to port MIT-pthreads. See mit-pthreads/README and Programming POSIX Threads (http:// www.humanfactor.com/pthreads/). Up to MySQL 4.0.2, the MySQL distribution included a patched version of Chris Provenzano's Pthreads from MIT (see the MIT Pthreads Web page at http://www.mit.edu/afs/sipb/project/pthreads/ and a programming introduction at http://www.mit.edu:8001/people/proven/IAP_2000/). These can be used for some operating systems that do not have POSIX threads. See Seccin 2.8.5, Notas sobre MITpthreads. It is also possible to use another user level thread package named FSU Pthreads (see http:// moss.csc.ncsu.edu/~mueller/pthreads/). This implementation is being used for the SCO port. See the thr_lock.c and thr_alarm.c programs in the mysys directory for some tests/examples of these problems. Both the server and the client need a working C++ compiler. We use gcc on many platforms. Other compilers that are known to work are SPARCworks, Sun Forte, Irix cc, HP-UX aCC, IBM AIX xlC_r), Intel ecc/icc and Compaq cxx). To compile only the client use ./configure --without-server. There is currently no support for only compiling the server, nor is it likely to be added unless someone has a good reason for it. If you want/need to change any Makefile or the configure script you also need GNU Automake and Autoconf. See Seccin 2.8.3, Instalar desde el rbol de cdigo fuente de desarrollo.
1615
All steps needed to remake everything from the most basic files.
/bin/rm */.deps/*.P /bin/rm -f config.cache aclocal autoheader aclocal automake autoconf ./configure --with-debug=full --prefix='your installation directory' # The makefiles generated above need GNU make 3.75 or newer. # (called gmake below) gmake clean all install init-db
If you run into problems with a new port, you may have to do some debugging of MySQL! See Seccin D.1, Depurar un servidor MySQL. Note: Before you start debugging mysqld, first get the test programs mysys/thr_alarm and mysys/ thr_lock to work. This ensures that your thread installation has even a remote chance to work!
1616
This avoids problems with the libstdc++ library and with C++ exceptions (many compilers have problems with C++ exceptions in threaded code) and compile a MySQL version with support for all character sets. If you suspect a memory overrun error, you can configure MySQL with --with-debug=full, which installs a memory allocation (SAFEMALLOC) checker. However, running with SAFEMALLOC is quite slow, so if you get performance problems you should start mysqld with the --skip-safemalloc option. This disables the memory overrun checks for each call to malloc() and free(). If mysqld stops crashing when you compile it with --with-debug, you probably have found a compiler bug or a timing bug within MySQL. In this case, you can try to add -g to the CFLAGS and CXXFLAGS variables above and not use --with-debug. If mysqld dies, you can at least attach to it with gdb or use gdb on the core file to find out what happened. When you configure MySQL for debugging you automatically enable a lot of extra safety check functions that monitor the health of mysqld. If they find something unexpected, an entry is written to stderr, which safe_mysqld directs to the error log! This also means that if you are having some unexpected problems with MySQL and are using a source distribution, the first thing you should do is to configure MySQL for debugging! (The second thing is to send mail to a MySQL mailing list and ask for help. See Seccin 1.6.1.1, Las listas de correo de MySQL. Please use the mysqlbug script for all bug reports or questions regarding the MySQL version you are using! In the Windows MySQL distribution, mysqld.exe is by default compiled with support for trace files.
On Windows, you should also use the --standalone flag to not start mysqld as a service. In a console window, use this command:
C:\> mysqld-debug --debug --standalone
After this, you can use the mysql.exe command-line tool in a second console window to reproduce the problem. You can stop the mysqld server with mysqladmin shutdown. Note that the trace file become very big! If you want to generate a smaller trace file, you can use debugging options something like this: mysqld --debug=d,info,error,query,general,where:O,/tmp/mysqld.trace This only prints information with the most interesting tags to the trace file. If you make a bug report about this, please only send the lines from the trace file to the appropriate mailing list where something seems to go wrong! If you can't locate the wrong place, you can ftp the trace file, together with a full bug report, to ftp://ftp.mysql.com/pub/mysql/upload/ so that a MySQL developer can take a look a this. The trace file is made with the DBUG package by Fred Fish. See Seccin D.3, El paquete DBUG.
1617
When running mysqld under gdb, you should disable the stack trace with --skip-stack-trace to be able to catch segfaults within gdb. In MySQL 4.0.14 and above you should use the --gdb option to mysqld. This installs an interrupt handler for SIGINT (needed to stop mysqld with ^C to set breakpoints) and disable stack tracing and core file handling. It's very hard to debug MySQL under gdb if you do a lot of new connections the whole time as gdb doesn't free the memory for old threads. You can avoid this problem by starting mysqld with -O thread_cache_size= 'max_connections +1'. In most cases just using -O thread_cache_size=5' helps a lot! If you want to get a core dump on Linux if mysqld dies with a SIGSEGV signal, you can start mysqld with the --core-file option. This core file can be used to make a backtrace that may help you find out why mysqld died:
shell> gdb mysqld core gdb> backtrace full gdb> exit
See Seccin A.4.2, Qu hacer si MySQL sigue fallando (crashing). If you are using gdb 4.17.x or above on Linux, you should install a .gdb file, with the following information, in your current directory:
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
If you have problems debugging threads with gdb, you should download gdb 5.x and try this instead. The new gdb version has very improved thread handling! Here is an example how to debug mysqld:
shell> gdb /usr/local/libexec/mysqld gdb> run ... backtrace full # Do this when mysqld crashes
1618
Include the above output in a mail generated with mysqlbug and mail this to the general MySQL mailing list. See Seccin 1.6.1.1, Las listas de correo de MySQL. If mysqld hangs you can try to use some system tools like strace or /usr/proc/bin/pstack to examine where mysqld has hung.
strace /tmp/log libexec/mysqld
If you are using the Perl DBI interface, you can turn on debugging information by using the trace method or by setting the DBI_TRACE environment variable.
you can find where mysqld died by doing the following: 1. Copy the preceding numbers to a file, for example mysqld.stack. 2. Make a symbol file for the mysqld server:
nm -n libexec/mysqld > /tmp/mysqld.sym
Note that most MySQL binary distributions (except for the "debug" packages, where this information is included inside of the binaries themselves) ship with the above file, named mysqld.sym.gz. In this case, you can simply unpack it by doing:
gunzip < bin/mysqld.sym.gz > /tmp/mysqld.sym
3. Execute resolve_stack_dump -s /tmp/mysqld.sym -n mysqld.stack. This prints out where mysqld died. If this doesn't help you find out why mysqld died, you should make a bug report and include the output from the above command with the bug report. Note however that in most cases it does not help us to just have a stack trace to find the reason for the problem. To be able to locate the bug or provide a workaround, we would in most cases need to know the query that killed mysqld and preferable a test case so that we can repeat the problem! See Seccin 1.6.1.3, Cmo informar de bugs y problemas.
1619
D.1.6. Crear un caso de prueba tras haber encontrado una tabla corrupta
If you get corrupted tables or if mysqld always fails after some update commands, you can test whether this bug is reproducible by doing the following: Take down the MySQL daemon (with mysqladmin shutdown). Make a backup of the tables (to guard against the very unlikely case that the repair does something bad). Check all tables with myisamchk -s database/*.MYI. Repair any wrong tables with myisamchk -r database/table.MYI. Make a second backup of the tables. Remove (or move away) any old log files from the MySQL data directory if you need more space. Start mysqld with --log-bin. See Seccin 5.10.3, El registro binario (Binary Log). If you want to find a query that crashes mysqld, you should use --log --log-bin. When you have gotten a crashed table, stop the mysqld server.
1620
Restore the backup. Restart the mysqld server without --log-bin Re-execute the commands with mysqlbinlog update-log-file | mysql. The update log is saved in the MySQL database directory with the name hostname-bin.#. If the tables are corrupted again or you can get mysqld to die with the above command, you have found reproducible bug that should be easy to fix! FTP the tables and the binary log to ftp:// ftp.mysql.com/pub/mysql/upload/ and enter it into our bugs system at http://bugs.mysql.com/. If you are a support customer, you can use the MySQL Customer Support Center https:// support.mysql.com/ to alert the MySQL team about the problem and have it fixed as soon as possible. You can also use the script mysql_find_rows to just execute some of the update statements if you want to narrow down the problem.
This causes clients to generate a trace file in /tmp/client.trace. If you have problems with your own client code, you should attempt to connect to the server and run your query using a client that is known to work. Do this by running mysql in debugging mode (assuming that you have compiled MySQL with debugging on):
shell> mysql --debug=d:t:O,/tmp/client.trace
This provides useful information in case you mail a bug report. See Seccin 1.6.1.3, Cmo informar de bugs y problemas. If your client crashes at some 'legal' looking code, you should check that your mysql.h include file matches your MySQL library file. A very common mistake is to use an old mysql.h file from an old MySQL installation with new MySQL library.
1621
<field_1>:<field_2>:...:<field_N>
Each field consists of a mandatory flag character followed by an optional ',' and comma-separated list of modifiers:
flag[,modifier,modifier,...,modifier]
The currently recognized flag characters are: Flag Description d Enable output from DBUG_<N> macros for the current state. May be followed by a list of keywords which selects output only for the DBUG macros with that keyword. An empty list of keywords implies output for all macros. Delay after each debugger output line. The argument is the number of tenths of seconds to delay, subject to machine capabilities. For example, -#D,20 specifies a delay of two seconds. Limit debugging and/or tracing, and profiling to the list of named functions. Note that a null list disables all functions. The appropriate d or t flags must still be given; this flag only limits their actions if they are enabled. Identify the source file name for each line of debug or trace output. Identify the process with the PID or thread ID for each line of debug or trace output. Enable profiling. Create a file called dbugmon.out containing information that can be used to profile the program. May be followed by a list of keywords that select profiling only for the functions in that list. A null list implies that all functions are considered. Identify the source file line number for each line of debug or trace output. Print the current function nesting depth for each line of debug or trace output. Number each line of debug output. Redirect the debugger output stream to the specified file. The default output is stderr. Like o, but the file is really flushed between each write. When needed, the file is closed and reopened between each write. Limit debugger actions to specified processes. A process must be identified with the DBUG_PROCESS macro and match one in the list for debugger actions to occur. Print the current process name for each line of debug or trace output. When pushing a new state, do not inherit the previous state's function nesting level. Useful when the output is to start at the left margin. Do function _sanity(_file_,_line_) at each debugged function until _sanity() returns something that differs from 0. (Mostly used with safemalloc to find memory leaks) Enable function call/exit trace lines. May be followed by a list (containing only one modifier) giving a numeric maximum trace level, beyond which no output occurs for either debugging or tracing macros. The default is a compile time option.
D f
F i g
L n N o O p P r S t
Some examples of debug control strings that might appear on a shell command line (the -# is typically used to introduce a control string to an application program) are:
-#d:t -#d:f,main,subr1:F:L:t,20 -#d,input,output,files:n -#d:t:i:O,\\mysqld.trace
In MySQL, common tags to print (with the d option) are enter, exit, error, warning, info, and loop.
1622
They use old versions of many POSIX calls and it is very tedious to make wrappers for all functions. I am inclined to think that it would be easier to change the thread libraries to the newest POSIX specification. Some wrappers are currently written. See mysys/my_pthread.c for more info. At least the following should be changed: pthread_get_specific should use one argument. sigwait should take two arguments. A lot of functions (at least pthread_cond_wait, pthread_cond_timedwait()) should return the error code on error. Now they return -1 and set errno. Another problem is that user-level threads use the ALRM signal and this aborts a lot of functions (read, write, open...). MySQL should do a retry on interrupt on all of these but it is not that easy to verify it. The biggest unsolved problem is the following: To get thread-level alarms I changed mysys/thr_alarm.c to wait between alarms with pthread_cond_timedwait(), but this aborts with error EINTR. I tried to debug the thread library as to why this happens, but couldn't find any easy solution. If someone wants to try MySQL with RTS threads I suggest the following: Change functions MySQL uses from the thread library to POSIX. This shouldn't take that long. Compile all libraries with the -DHAVE_rts_threads. Compile thr_alarm. If there are some small differences in the implementation, they may be fixed by changing my_pthread.h and my_pthread.c. Run thr_alarm. If it runs without any warning, error, or aborted messages, you are on the right track. Here is a successful run on Solaris:
Main thread: 1 Thread 0 (5) started Thread: 5 Waiting process_alarm Thread 1 (6) started Thread: 6 Waiting 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
1623
process_alarm process_alarm ... thread_alarm Thread: 5 Slept for 0 (1) sec end
1624
1625
1626
. que concuerda con cualquier carcter (incluyendo el retorno de carro y la nueva lnea).
mysql> SELECT 'fofo' REGEXP '^f.*$'; mysql> SELECT 'fo\r\nfo' REGEXP '^f.*$'; -> 1 -> 1
1627
{1}, {2,3} La notacin {n} o {m,n} provee una manera ms general de escribir expresiones regulares que concuerden con varias instancias del tomo anterior (o pieza) del patrn. m y n son enteros. a* Puede escribirse como a{0,}. a+ Puede escribirse como a{1,}. a? Puede escribirse como a{0,1}. Para ser ms preciso, a{n} concuerda exactamente con n instancias de a. a{n,} concuerda con n o ms instancias de a. a{m,n} concuerda con entre m y n (inclusive) instancias de a. m y n deben estar en el rango desde 0 hasta RE_DUP_MAX (255 por defecto). Si se especifican tanto m como n, m debe ser menor o igual que n.
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] Concuerda con cualquier caracter que sea (o no sea, si se utiliza ^ ) uno de los siguientes: a, b, c, d o X. Un carcter - entre dos caracteres distintos forma un rango que concuerda con cualquier carcter entre el primero y el segundo. Por ejemplo, [0-9] concuerda con cualquier dgito decimal. Para incluir un carcter ] literal, debe estar precedido inmediatamente por un corchete abierto [. Para incluir un carcter - literal , debe estar al principio o al final. Cualquier carcter que no tenga un significado especial, concuerda slo consigo mismo si est dentro de un par de [].
mysql> SELECT 'aXbc' REGEXP '[a-dXYZ]'; mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]$'; -> 1 -> 0
1628
'aXbc' REGEXP '^[a-dXYZ]+$'; 'aXbc' REGEXP '^[^a-dXYZ]+$'; 'gheis' REGEXP '^[^a-dXYZ]+$'; 'gheisa' REGEXP '^[^a-dXYZ]+$';
1 0 1 0
[.characters.] Dentro de una expresin de corchetes (escrita usando [ y ]), concuerda con la sencuencia de caracteres expresada. characters es cualquier carcter simple o su nombre de carcter como newline. Se puede encontrar la lista completa de nombres de caracteres en el archivoregexp/ cname.h.
mysql> SELECT '~' REGEXP '[[.~.]]'; mysql> SELECT '~' REGEXP '[[.tilde.]]'; -> 1 -> 1
[=character_class=] Dentro de una expresin de corchetes (escrita usando [ y ]), [=character_class=] representa una clase de equivalencia. Concuerda con cualquier carcter con el mismo valor de comparacin. Por ejemplo, si o y (+) son miembros de una clase equivalente, entonces [[=o=]], [[=(+)=]], y [o(+)] son todos sinnimos. Una clase equivalente no puede utilizarse como el final de un rango. [:character_class:] Dentro de una expresin de corchetes (escrita usando [ y ]), [:character_class:] representa una clase de caracteres que concuerda con todos los caracteres pertenecientes a esa clase. Los nombres de clases estndar son:
alnum alpha blank cntrl digit graph lower print punct space upper
Caracteres alfanumericos Caracteres Alfabticos Caracteres espacios en blanco Caracteres de Control Caracteres Dgitos Caracteres grficos Caracteres alfabticos en minsculas Caracteres grficos o espacios Caracteres de puntacin Espacio, tabulador, nueva lnea y retorno de carro Caracteres alfabticos en maysculas
xdigit Caracteres dgitos en hexadecimal Estos nombres representan las clases de caracteres definidas en ctype(3). Una localizacin particular pudiera proveer otros nombres de clases. Una clase de caracteres no se puede utilizar como final de un rango.
mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+'; mysql> SELECT '!!' REGEXP '[[:alnum:]]+'; -> 1 -> 0
[[:<:]], [[:>:]] Estos marcadores representan limitadores de palabras. Concuerdan con el inicio y el final de palabras, respectivamente. Una palabra es una secuencia de caracteres de palabra que no son precedidos ni seguidos por caracteres de palabra. Un carcter de palabra es un carcter alfanumerico en la clase alnum o un guin bajo (_).
mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; -> 1 -> 0
1629
Para utilizar en una expresin regular un carcter especial literalmente, precdalo con dos barras invertidas (\). El parser de MySQL interpreta las barras invertidas, y la biblioteca de expresiones regulares interpreta el resto. Por ejemplo, para concordar con la cadena 1+2, que contiene el carcter especial +, slo la ltima de las siguientes expresiones regulares es correcta:
mysql> SELECT '1+2' REGEXP '1+2'; mysql> SELECT '1+2' REGEXP '1\+2'; mysql> SELECT '1+2' REGEXP '1\\+2'; -> 0 -> 0 -> 1
1630
1631
1632
Se expone a continuacin las restricciones en el uso de algunas caractersticas de MySQL, como las subconsultas o las vistas.
1633
La sentencia CALL no se puede preparar. Esto es cierto tanto para las sentencias preparadas del lado del servidor como para las sentencias SQL preparadas.
La razn por la que se soporta la comparacin entre registros con IN pero no con los otros es que IN fue implementado reescribindolo como una secuencia de comparaciones = y operaciones AND. Esto mismo no puede realizarse con ALL, ANY, o SOME. Los constructores de registros no estn bien optimizados. Las siguientes dos expresiones son equivalentes, pero slo la segunda puede ser optimizada:
1634
Restricciones en subconsultas
(col1, col2, ...) = (val1, val2, ...) col1 = val1 AND col2 = val2 AND ...
La optimizacin de subconsultas para los IN no es tan efectiva como para los =. Un caso tpico del pobre rendimiento del IN es cuando una subconsulta devuelve un nmero pequeo de registros, pero la consulta de afuera regresa un nmero grande de registros para ser comparados con el resultado de la subconsulta. Las subconsultas en la clusula FROM no pueden ser subconsultas correlacionadas. stas son materializadas (ejecutadas para producir un resultado) antes de que se evale la consulta exterior, as que no pueden ser evaluadas por registro de la consulta exterior. En general, no puede modificar una tabla y seleccionar de la misma en una subconsulta. Por ejemplo, esta limitacin se aplica a sentencias del siguiente tipo:
DELETE FROM t WHERE ... (SELECT ... FROM t ...); UPDATE t ... WHERE col = (SELECT ... FROM t ...); {INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
Excepcin: La prohibicin precedente no se aplica si se usa una subconsulta para la tabla modificada en la clusula FROM. Ejemplo:
UPDATE t ... WHERE col = (SELECT (SELECT ... FROM t...) AS _t ...);
Aqu la prohibicin no se aplica porque una subconsulta en la clusula FROM se materializa como una tabla temporal, as que los registros relevantes en t ya han sido seleccionados cuando la actualizacin de t ha tenido lugar. El optimizador es ms maduro para joins que para subconsultas, as que en la mayor parte de los casos las sentencias que usan subconsultas pueden ser ejecutadas ms eficientemente si se reescriben como joins. Una excepcin a esta norma es el caso en que una subconsulta IN puede ser reescrita como una join SELECT DISTINCT. Ejemplo:
SELECT col FROM t1 WHERE id_col IN (SELECT id_col2 FROM t2 WHERE condicin);
Pero en este caso el join requiere una operacin DISTINCT extra y no es ms eficiente que la subconsulta. Futura optimizacin posible: MySQL no reescribe el orden del join para la evaluacin de subconsultas. En algunos casos, una subconsulta puede ser ejecutada ms eficientemente si MySQL la reescribe como un join. Esto dara al optimizador mayor posibilidad de elegir entre varios planes de ejecucin. Por ejemplo, podra decidir si leer primero una tabla o la otra. Ejemplo:
SELECT a FROM outer_table AS ot WHERE a IN (SELECT a FROM inner_table AS it WHERE ot.b = it.b);
Para esra consulta, MySQL siempre busca outer_table primero y despus ejecuta la subconsulta en inner_table para cada registro. Si outer_table tiene muchos registros e inner_table tiene pocos, la consulta probablemente no ser tan rpida como pudiera ser. La consulta anterior podra reescribirse as:
SELECT a FROM outer_table AS ot, inner_table AS it WHERE ot.a = it.a AND ot.b = it.b;
1635
Restricciones en vistas
En este caso podemos explorar la tabla pequea (inner_table) y buscar registros en outer_table, lo cual sera ms rpido si existiera un ndice en (ot.a,ot.b). Futura optimizacin posible: Una subconsulta correlacionada se evala por cada registro de la consulta externa. Una mejor solucin sera que no se evaluara la subconsulta nuevamente si el valor del registro exterior fuese igual al de la lnea anterior. Se usara en este caso el resultado previo. Futura optimizacin posible: Una subconsulta en la clusula FROM se evala materializando el resultado dentro de una tabla temporal, y esta tabla no usa ndices. Esto no permite el uso de ndices en comparacin con otras tablas en la consulta, aunque pudiera ser til. Futura optimizacin posible: Si una subconsulta en la clusula FROM se asemeja a una vista a la que se puede aplicar el algoritmo MERGE, reescribir la consulta, aplicar el algoritmo MERGE, para que se puedan utilizar los ndices. La siguiente sentencia contiene una subconsulta de este tipo:
SELECT * FROM (SELECT * FROM t1 WHERE t1.t1_col) AS _t1, t2 WHERE t2.t2_col;
Este tipo de reescritura comportara dos beneficios 1. Evitar el uso de una tabla temporal, en la que no se puede utilizar ndices. En la consulta reescrita, el optimizador puede usar ndices en t1. 2. Da al optimizador ms libertad al elegir entre diferentes planes de ejecucin. Por ejemplo, reescribiendo la consulta como un join permite al optimizador usar t1 o t2 primero. Futura optimizacin posible: Para los IN, = ANY, <> ANY, = ALL, y <> ALL con subconsultas no correlacionadas, usar una tabla hash en memoria para un resultado o una tabla temporal con un ndice para los resultados ms grandes. Ejemplo:
SELECT a FROM big_table AS bt WHERE non_key_field IN (SELECT non_key_field FROM table WHERE condicion)
1636
Restricciones en vistas
CREATE VIEW v1 AS SELECT * FROM t2 WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.a = t2.a); UPDATE t1, v2 SET t1.a = 1 WHERE t1.b = v2.b;
Si la vista se evala usando una tabla temporal, se puede seleccionar de la tabla en la subconsulta de la vista y modificarla en la consulta exterior. En este caso la vista se almacenar en una tabla temporal y por ello no se est realmente seleccionando de una tabla en una subconsulta y modificndola al mismo tiempo. (Esta es otra razn por la que tal vez sea deseable forzar a MySQL para que use el algoritmo de tablas (temptable) temporales especificando las palabras ALGORITHM = TEMPTABLE en la definicin de la vista.) Se puede usar DROP TABLE o ALTER TABLE para eliminar o modificar una tabla utilizada en la definicin de una vista (lo cual invalida la vista) y no se obtendr ninguna alerta de las operaciones de elimiar o modificar. Sin embargo, se obtiene un error ms tarde, cuando se utiliza la vista. Algunas sentencias congelan una definicin de vista: Si una sentencia preparada por PREPARE se refiere a una vista, los contenidos de la vista que se ven cada vez que se ejecuta la sentencia, sern los contenidos de la vista en el momento en el que la sentencia fue preparada. Esto es cierto incluso si la definicin de la vista se cambia despus de preparar la sentencia y antes de que sta se ejecute. Ejemplo:
CREATE VIEW v AS SELECT 1; PREPARE s FROM 'SELECT * FROM v'; ALTER VIEW v AS SELECT 2; EXECUTE s;
El resultado devuelto por la sentencia EXECUTE es 1, y no 2. Si una sentencia en una rutina almacenada se refiere a una vista, los contenidos de la vista que ve la sentencia son sus contenidos de la primera ejecucin de la sentencia. Esto significa por ejemplo que si se ejecuta una sentencia en un bucle, en todas las iteraciones de la sentencia se ver el mismo contenido de la vista, aunque la definicin de la vista cambie durante el bucle. Ejemplo:
CREATE VIEW v AS SELECT 1; delimiter // CREATE PROCEDURE p () BEGIN DECLARE i INT DEFAULT 0; WHILE i < 5 DO SELECT * FROM v; SET i = i + 1; ALTER VIEW v AS SELECT 2; END WHILE; END; // delimiter ; CALL p();
Cuando se llama al procedimiento p(), el SELECT devuelve siempre 1 dentro del bucle, aunque dentro del mismo cambie la definicin de la vista. Con respecto a las actualizaciones en vistas, el objetivo es que cualquier vista que sea tericamente actualizable, tiene que serlo en la prctica. Esto incluye vistas que tienen UNION en su definicin. Actualmente, no todas las vistas tericamente actualizables se pueden actualizar. La implementacin inicial de vistas fue deliberadamente escrita de esta forma para obtener en MySQL vistas utilizables y actualizables lo antes posible. Muchas vistas tericamente actualizables pueden ser actualizadas actualmente, pero algunas limitaciones siguen existiendo: Las vistas actualizables con subconsultas en cualquier lugar que no sea en la clusula WHERE. Algunas vistas que tienen subconsultas en la lista SELECT podran ser actualizables. No se puede utilizar UPDATE para actualizar ms de una tabla incluida en una vista que sea definida como un join.
1637
Restricciones en vistas
No se puede usar una sentencia DELETE para actualizar una vista que est definida como un JOIN.
1638
Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software---to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 1. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The ``Program'', below, refers to any such program or work, and a ``work based on the Program'' means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term ``modification''.) Each licensee is addressed as ``you''. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program
1639
is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 2. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 3. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a. You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b. You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c. If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 4. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a. Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b. Accompany it with a written offer, valid for at least three years, to give any third-party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
1640
c. Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 5. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 6. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 7. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 8. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
1641
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 9. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 10. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and ``any later version'', you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 11. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 12. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 13. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found.
one line to give the program's name and a brief idea of what it does.
1642
name of author
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
The hypothetical commands 'show w' and 'show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than 'show w' and 'show c'; they could even be mouse-clicks or menu items---whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice
This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
1643
1644
1645
Jabber Open Source License MIT license Mozilla Public License (MPL) Open Software License OpenSSL license (with original SSLeay 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 1.0/1.1 2.0 "2003" ("1998") 3.0 2.1.1 "1999" "2001" "2001" 2.0
Due to the many variants of some of the above licenses, we require that any version follow the 2003 version of the Free Software Foundation's Free Software Definition (http://www.gnu.org/ philosophy/free-sw.html) or version 1.9 of the Open Source Definition by the Open Source Initiative (http://www.opensource.org/docs/definition.php). 3. Definitions a. Terms used, but not defined, herein shall have the meaning provided in the GPL. b. Derivative Work means a derivative work under copyright law. 4. Applicability This FLOSS Exception applies to all Programs that contain a notice placed by MySQL AB saying that the Program may be distributed under the terms of this FLOSS Exception. If you create or distribute a work which is a Derivative Work of both the Program and any other work licensed under the GPL, then this FLOSS Exception is not available for that work; thus, you must remove the FLOSS Exception notice from that work and comply with the GPL in all respects, including by retaining all GPL notices. You may choose to redistribute a copy of the Program exclusively under the terms of the GPL by removing the FLOSS Exception notice from that copy of the Program, provided that the copy has never been modified by you or any third party.
1646
ndice
Smbolos
! (NOT lgica), 561 != (diferente), 557 ", 491 % (carcter comodn), 488 % (mdulo), 581 & (AND bit a bit), 610 && (AND lgica), 561 () (parntesis), 556 (Control-Z) \Z, 488 * (multiplicacin), 577 + (suma), 576 - (menos unario), 577 - (resta), 577 .my.cnf file, 190, 192 / (divisin), 577 /etc/passwd, 270, 668 < (menor que), 558 <<, 179 << (desplazamiento a la izquierda), 610 <= (menor que o igual), 558 <=> (igual a), 557 <> (diferente), 557 = (igual), 557 > (mayor que), 558 >= (mayor que o igual), 558 >> (desplazamiento a la derecha), 610 \" (comilla doble), 488 \' (comilla simple), 488 \0 (ASCII 0), 488 \b (retroceso), 488 \n (salto de lnea), 488, 488 \r (retorno de carro), 488 \t (tabulacin), 488 \Z (Control-Z) ASCII 26, 488 \\ (escape), 488 ^ (XOR bit a bit), 610 _ (carcter comodn), 488 `, 491 | (OR bit a bit), 610 || (OR lgica), 562 ~, 611 Qu es un X509/Certificado?, 304
A
abiertas, 465 ABS(), 578 acceso control, 281 acceso de escritura tmp, 104 ACID, 25, 766 ACLs, 272 ACOS(), 578 Active Server Pages (ASP), 1152 ActiveState Perl, 148
actualizacin, 112 a 5.0, 113 de entregas de MySQL, 40 diferentes arquitecturas, 116 tablas de permisos, 115 actualizacin de tablas ISAM, 114, 114 actualizar tablas, 25 ADDDATE(), 584 ADDTIME(), 585 administracin servidor, 462 administracin del servidor, 462 Administrador de Paquetes RPM, 72 AES_DECRYPT(), 611 AES_ENCRYPT(), 611 age calculating, 165 agregando nuevos usuarios, 80, 84 agrupar expresiones, 556 Algoritmo de colacin Unicode, 521 alias, 1483 en clusulas GROUP BY, 628 en clusulas ORDER BY, 628 en expresiones, 666 nombres, 491 para expresiones, 628 para tablas, 666 alias de expresiones, 628, alias de tablas, 666 ALL, 669 ALLOW_INVALID_DATES SQL mode, 223 ALTER COLUMN, 632 ALTER DATABASE, 629 ALTER FUNCTION, 937 ALTER PROCEDURE, 937 ALTER SCHEMA, 629 ALTER TABLE, 630, 632, 1488 ALTER VIEW, 955 alterar base de datos, 629 esquema, 629 aadiendo nuevos privilegios de cuenta, 298 nuevos privilegios de usuario, 298 aadir funciones definidas por el usuario, 1447 funciones nativas, 1455 juegos de caracteres, 335 nuevas funciones, 1446 procedimientos, 1457 ANALYZE TABLE, 698 ancho de muestra, 527 anchos muestra, 527
1647
AND bit a bit, 610 lgica, 561 ANSI SQL mode, 222, 226 ANSI_QUOTES SQL mode, 223 Apache, 183 APIs, 987 lista de, 1506 Perl, 1076 rbol BitKeeper, 87 rbol de cdigo en desarrollo, 87 archivo .my.cnf, 280, 288, 303 archivos mensajes de error, 334 mensajes de no encontrado, 1473 permisos, 1473 registro, 345 registro binario, 340 registro de actualizaciones (obsoleto), 340 registro de consultas, 340 registro de consultas lentas, 344 reparar, 320 archivos de configuracin, 288 archivos de opciones, 288 archivos de registro mantenimiento, 345 nombres, 311 Archivos de registro, 339 Area(), 923, 924 aritmtica de punto fijo, 977 aritmtica decimal, 977 aritmtica entera, 977 AS, 666, 670 AsBinary(), 918 ASCII(), 564 ASIN(), 578 AsText(), 918 atacantes seguridad frente a, 268 ATAN(), 578 ATAN2(), 578 AUTO-INCREMENT ODBC, 1148 AUTO_INCREMENT, 180 y valores NULL, 1483 AVG(), 622 AVG(DISTINCT), 622 ayuda mysqld_multi opcin, 204
B
BACKUP TABLE, 699 barra invertida caracter de escape, 487 base de datos alterar, 629 borrar, 645 base de datos de bugs, 15
bases de datos copiado, 116 copias de seguridad, 311 crear, 634 definicin, 5 mostrar, 483 nombres, 491 replicar, 357 volcar, 473 bases de datos relacionales definicin, 5 batch mysql opcin, 451 batch mode, 174 BdMPolyFromText(), 913 BdMPolyFromWKB(), 914 BdPolyFromText(), 913 BdPolyFromWKB(), 915 BEGIN, 685, 938 BENCHMARK(), 614 BETWEEN ... AND, 559 biblioteca mysqlclient, 987 mysqld, 987 biblioteca mysqlclient, 987 biblioteca mysqld, 987 bibliotecas lista de, 1505 BIN(), 564 BINARY, 608 BIT_AND(), 622 BIT_COUNT, 179 BIT_COUNT(), 611 bit_functions example, 179 BIT_LENGTH(), 565 BIT_OR, 179 BIT_OR(), 622 BIT_XOR(), 622 BLOB insertar datos binarios, 489 tamao, 552 BLOB columnas valores por defecto, 547 BLOB columns indexing, 423 bloquear registros, Borland Builder 4, 1152 Borland C++ compiler, 1077 borrado mysql.sock, 1480 borrar base de datos, 645 clave primaria, claves foranas, esquema, 645 funciones, 1447
1648
ndice, 632, 646 registros, 1484 tabla, 646 usuario, 300, 690, 690 usuarios, 300, 690 Boundary(), 920 buffer sizes mysqld server, 432 Buffer(), 925 bugs reprotar, 15 bugs.mysql.com, 15 building client programs, 1068 bsqueda pgina web MySQL, 15 bsquedas full-text, 600 y la sensibilidad a maysculas, 1481 bsquedas full-text, 600
C
C API data types, 989 functions, 992 linking problems, 1068 C Prepared statement API functions, 1040 C++ APIs, 1076 C++ Builder, 1153 cach de claves asignar ndices a, 724 Cach de consultas, 352 CACHE INDEX, 724 cachs limpiar, 725 cadenas caracteres de escape, 487 definidas, 487 cadenas de caracteres no delimitadas, 540 cadenas de caracteres no delimintadas, 540 calculating dates, 165 calendario, 599 CALL, 938 cambiando el lugar del socket, 1480 cambiar campo, 632 columna, 632 orden de columnas, 1488 tabla, 630, 632, 1488 cambiar contraseas, 698 cambio de ubicacin del socket, 85 cambios de columna silenciosos, 644 cambios de privilegios, 287 campo cambiar, 632
Carcter comodn (%), 488 Carcter comodn (_), 488 caracteres multi-byte, 337 caracteres de escape, 487 caracteres multi-byte, 337 caractersticas de MySQL, 6 caractersticas de tablas dinmicas, 747 CASE, 562, 942 case-sensitivity de nombres de bases de datos, de nombres de tablas, en chequeos de acceso, 275 CAST, 608 CEILING(), 579 Centroid(), 924 CHANGE MASTER TO, 730 ChangeLog, 1510 changes log, 1510 version 5.0, 1510 CHAR(), 565 character-sets-dir mysql opcin, 452 CHARACTER_LENGTH(), 565 CHARACTER_SETS tabla INFORMATION_SCHEMA, 970 CHARSET(), 615 CHAR_LENGTH(), 565 CHECK TABLE, 699 CHECKSUM TABLE, 701 Chino, 1481 Cifrado de contraseas reversibilidad de, 614 clusula DEFAULT, clave fornea restriccin, 30 CLAVE PRIMARIA restriccin, 30 clave primaria borrar, claves forneas, 27 claves foranas, 632 borrar, claves forneas, 27 eliminacin, 783 client programs building, 1068 clientes de MySQL, 390 clientes abortados, 1468 clientes grficos MySQL Query Browser, 444 clients debugging, 1621 threaded, 1069 CLOSE, 942
1649
closing tables, 431 COALESCE(), 559 Codificacin de caracteres Big5 Chinese, 1481 COERCIBILITY(), 615 colacin cadenas de caracteres, 337 colacin de cadenas de caracteres, 337 ColdFusion, 1153 COLLATION(), 615 COLLATIONS tabla INFORMATION_SCHEMA, 970 COLLATION_CHARACTER_SET_APPLICABILITY tabla INFORMATION_SCHEMA, 970 Colummas BLOB indexar, 639 columna cambiar, 632 columnas cambiar, 1488 mostrar, 483 nombres, 491 otros tipos, 553 requerimientos de almacenamiento, 550 tipos, 527 columnas DATE problemas, 1481 Columnas TEXT indexar, 639 columns indexes, 422 selecting, 163 COLUMNS INFORMATION_SCHEMA table, 966 COLUMN_PRIVILEGES tabla INFORMATION_SCHEMA, 969 comando de estado resultados, 464 comando de estado de mysql, 458 comando GRANT, 298 comando INSERT otorgar permisos, 298 comando SET PASSWORD, 302 comandos esclavos de replicacin, 730 GRANT, 298 INSERT, 298 maestros de replicacin, 728 para distribucin binaria, 79 comandos mysql lista de, 457 comandos sin sincronizacin, 1470 comandos SQL esclavos de replicacin, 730 maestros de replicacin, 728 comentarios agregar, 498 empezar, 29
comentarios de columna, 638 comilla doble (\"), 488 comilla simple (\'), 488 comillas en cadenas, 488 COMMIT, 25, 685 comodines en la tabla mysql.columns_priv, 285 en la tabla mysql.db, 285 en la tabla mysql.host, 285 en la tabla mysql.tables_priv, 285 en la tabla mysql.user, 281 compaas contribuidoras lista de, 1507 comparaciones de cadenas sensibilidad a maysculas, 574 compatibilidad con el estndar SQL, 20 con mSQL, 576 con ODBC, 492, 529, , 559, 638, 670 con Oracle, 23, 624, 684 con PostgreSQL, 24 con Sybase, 684 entre versiones MySQL, 113 compatibilidad con ODBC, 670 Compatibilidad con Oracle, 23, 624, 684 Compatibilidad con PostgreSQL, 24 Compatibilidad con Sybase, 684 compatibilidad de estndares, 20 compatibilidad mSQL, 576 compatibilidad ODBC, 492, 529, 557, 559 Compatibilidad ODBC, 638 compilacin esttica, 85 funciones definidas por el usuario, 1453 problemas, 90 compilador compilador C++ gcc, 85, 85 compilador C++ no puede crear ejecutables, 91 compilando en Windows, 97 compiling optimizing, 432 speed, 436 compress mysql opcin, 452 COMPRESS(), 565 comprobacin de errores en tablas, 324 comprobando conexin al servidor, 281 CONCAT(), 565 CONCAT_WS(), 566 Conceptos bsicos de SSL y X509, 304 concurrent inserts, 418 Condiciones, 940 conectando
1650
al servidor, 280 remotamente con SSH, 310 verificacin, 281 Conectores MySQL, 1079 conexin abortada, 1468 conexin abortada, 1468 config-file mysqld_multi opcin, 204 config.cache, 90 configuracin pos-instalacin, 97 configure ejecutando luego de la primera ejecucin, 90 conformidad Y2K, 10 Conformidad ao 2000, 10 conjuntos de caracteres, 86 Conjuntos de caracteres, 503 connecting to the server, 153 CONNECTION_ID(), 616 Connector/JDBC, 1079 Connector/MXJ, 1079 Connector/NET, 1079, 1159 reporting problems, 1332 Connector/ODBC, 1079, 1080 Borland, 1152 Borland Database Engine, 1152 reporting problems, 1157, 1157 connect_timeout variable, 456, 467 constant table, 394, 401 CONSTRAINTS tabla INFORMATION_SCHEMA, 971 consultas la rapidez de, 392 consultas anidadas, 673 consultas lentas, 464 Contains(), 927 contrasea cambiar, 698 restablecer, 1474 usuario root, 109 contrasea root, 109 contraseas especificar, 302, 695 olvidadas, 1474 para usuarios, 296 perdidas, 1474 seguridad, 272 contribuidores lista de, 1500 control acceso, 281 CONV(), 566 convenciones tipogrficas, 2 convenciones tipogrficass, 2
conversin, 556 conversin de tipos, 608 conversiones de tipos, 556 CONVERT, 608 CONVERT TO, 632 CONVERT_TZ(), 585 ConvexHull(), 925 copia de seguridad base de datos, 699 bases de datos, 473 databases, 479 copia de tablas, 643 copiado de bases de datos, 116 copias de seguridad, 311 corchetes, 527, 527 COS(), 579 COT(), 579 COUNT(), 623 COUNT(DISTINCT), 623 counting table rows, 170 crash, 1616 crash-me, 391 CRC32(), 579 creacin de cuentas de usuario, 689 creando reportes bugs, 15 crear bases de datos, 634 esquemas, 634 CREATE DATABASE, 634 CREATE FUNCTION, 934, 1447 CREATE INDEX, 634 CREATE PROCEDURE, 934 CREATE SCHEMA, 634 CREATE TABLE, 636 CREATE USER, 689 CREATE VIEW, 955 creating databases, 157 default startup options, 189 tables, 159 CROSS JOIN, 670 Crosses(), 927 CR_SERVER_GONE_ERROR, 1465 CR_SERVER_LOST_ERROR, 1465 cuentas root, 109 usuario annimo, 109 cuentas de usuario creacin, 689 renombrar, 698 CURDATE(), 585 CURRENT_DATE, 585 CURRENT_TIME, 586 CURRENT_TIMESTAMP, 586 CURRENT_USER(), 616 Cursores, 941
1651
CURTIME(), 585
D
dar permisos, 690 data loading into tables, 160 retrieving, 161 size, 421 data types C API, 989 database mysql opcin, 452 database design, 421 DATABASE(), 616 databases creating, 157 information about, 173 selecting, 158 symbolic links, 440 using, 157 volcar, 479 DataJunction, 1153 DATE, 1481 date calculations, 165 DATE(), 586 DATEDIFF(), 586 DATE_ADD(), 586 DATE_FORMAT(), 588 DATE_SUB(), 586 datos importar, 481 juegos de caracteres, 333 datos invlidos restriccin, 30 DAY(), 589 DAYNAME(), 589 DAYOFMONTH(), 589 DAYOFWEEK(), 589 DAYOFYEAR(), 590 DB2 SQL mode, 226 DBI interface, 1076 DBI->quote, 489 DBI->trace, 1619 DBI/DBD interface, 1076 DBI_TRACE environment variable, 1619 DBUG package, 1621 DEALLOCATE PREPARE, 738 debug mysql opcin, 452 debug-info mysql opcin, 452 debugging client, 1621 server, 1616 DECLARE, 939 DECODE(), 612 decode_bits myisamchk variable, 318
DEFAULT restriccin, 30 default options, 189 DEFAULT(), 619 default-character-set mysql opcin, 452 defaults embedded, 1071 DEGREES(), 579 DELAYED, 655 delayed_insert_limit, 656 DELETE, 647 Delphi, 1152 denominacin entregas de MySQL, 37 desarrolladores lista de, 1495 Desarrollo futuro de MySQL Cluster, 884 DESC, 683 descarga, 47 DESCRIBE, 173, 683 design choices, 421 DES_DECRYPT(), 612 DES_ENCRYPT(), 612 deteniendo el servidor, 101, 104 diferente (!=), 557 diferente (<>), 557 Difference(), 925 dgitos, 527 Dimension(), 919 direcciones de correo para soporte a clientes, 19 direcciones listas de correo, 2 DISCARD TABLESPACE, 633, 786 disco lleno, 1478 disconnecting from the server, 153 diseo limitaciones, 388 problemas, 1489 Disjoint(), 928 disk full, 1478 disk issues, 439 disks splitting data across, 441 disparadores, 27, 721 disposicin de instalacin, 50, 50 Distance(), 928 DISTINCT, 163, 408, 622, 623, 624, 624, 669 DISTINCTROW, 669 distribucin binaria de MySQL, 37 distribucin de cdigo fuente instalacin, 81 distribucin de cdigo fuente de MySQL, 37 distribuciones binarias, 41 en Linux, 119
1652
instalacin, 78 distribuciones de cdigo fuente en Linux, 120 DIV, 577 divisin (/), 577 DNS, 438 DO, 650 Documentadores lista de, 1504 DROP DATABASE, 645 DROP FOREIGN KEY, 632, 783 DROP FUNCTION, 937, 1447 DROP INDEX, 632, 646 DROP PRIMARY KEY, 632 DROP PROCEDURE, 937 DROP SCHEMA, 645 DROP TABLE, 646 DROP USER, 690 DROP VIEW, 960 DUMPFILE, 669
E
Eiffel Wrapper, 1077 ejecucin modo ANSI, 21 ejecutando mltiples servidores, 345 mysqld, 1473 ejecutando configure luego de la primera ejecucin, 90 ejemplo mysqld_multi opcin, 204 ejemplos myisamchk salida, 328 tablas comprimidas, 447 Elegir una versin de MySQL, 37 elementos geoespaciales, 904 elementos geogrficos, 904 eligiendo tipos, 553 eliminacin claves forneas, 783 eliminar usuarios, 300 ELT(), 566 embedded MySQL server library, 1070 empezar comentarios, 29 emulacin de secuencia, 618 ENCODE(), 612 encomillado, 489 encomillado de identificadores, 491 encomillando datos binarios, 489 ENCRYPT(), 613 END, 938 EndPoint(), 921 entering queries, 154 enteros, 489
entregas actualizacin, 40 esquema de denominaciones, 37 prueba, 38 ENUM tamao, 553 Envelope(), 919 environment variable PATH, 186 Environment variable DBI_TRACE, 1619 MYSQL_DEBUG, 1621 environment variables, 193 Equals(), 928 Errcode, 485 errno, 485 errores acceso denegado, 1461 comprobando tablas en busca de, 324 comunes, 1459 conocidos, 1489 informar, 2 lista de, 1461 reportar, 13, 15 suma de verificacin de directorio, 126 tratamiento para UDFs, 1453 errores conocidos, 1489 errores de acceso denegado, 1461 errores de redondeo, 529 errores de suma de verificacin, 126 errores internos de compilador, 90 errors linking, 1472 ERROR_FOR_DIVISION_BY_ZERO SQL mode, 223 escala aritmtica, 977 escape (\\), 488 esclavos de replicacin comandos, 730 espacio clave MyISAM, 746 especificar contraseas, 302 esquema alterar, 629 borrar, 645 esquemas crear, 634 estabilidad, 8 estado tablas, 719 estndar SQL extensiones a, 20 esttica compilacin, 85 estimating query performance, 400 estructura de directorios
1653
defecto, 50 examples queries, 175 execute mysql opcin, 452 EXECUTE, 738 EXP(), 579 EXPLAIN, 392 EXPORT_SET(), 567 expresiones aritmticas, 576 expressions extended, 168 extensiones al estndar SQL, 20 Extensiones espaciales en MySQL, 904 extensiones SHOW, 975 ExteriorRing(), 923 EXTRACT(), 590 extracting dates, 165
F
fallos conocidos, 1489 recuperacin, 323 repetidos, 1476 FALSE, 489 testeando, 558 fatal signal 11, 90 FETCH, 942 fichero .my.cnf, 351 fichero .mysql_history, 457 fichero .pid (ID de proceso), 327 fichero C:\my.cnf, 351 fichero config.cache, 90 fichero histrico mysql, 457 fichero RPM, 72 fichero temporal acceso de escritura, 104 ficheros config.cache, 90 lmites de tamao, 9 my.cnf, 368 registro, 84 texto, 481 tmp, 104 ficheros de registro, 84 ficheros de texto importar, 481 FIELD(), 567 FILE, 568 files script, 174 filesort optimization, 410 FIND_IN_SET(), 567 FLOOR(), 580 flotantes, 489 flujos, 715, 1443
muestra, 715 FLUSH, 725 FOR UPDATE, 669 force mysql opcin, 452 FORCE INDEX, 666, 671, 1488 FORCE KEY, 666, 671 foreign keys, 177 FORMAT(), 619 Formato Well-Known Binary, 911 Formato Well-Known Text, 910 Formato WKB, 911 Formato WKT, 910 Foros, 20 FOUND_ROWS(), 616 FROM, 666 FROM_DAYS(), 590 FROM_UNIXTIME(), 590 ft_max_word_len myisamchk variable, 318 ft_min_word_len myisamchk variable, 318 ft_stopword_file myisamchk variable, 318 FULLTEXT, 600 fulltext lista de palabras de parada, 606 funciones, 555 agrupar, 556 aritmticas, 610 bit, 610 borrar, 1447 cadenas de caracteres, 564 cifrado, 611 comparacin de cadenas, 574 control de flujo, 562 conversin de tipos, 608 definidas por el usuario, 1446, 1447 aadir, 1447 diversas, 619 fecha y hora, 584 GROUP BY, 622 informacin, 614 matemticas, 578 nativas aadir, 1456 nueva, 1446 funciones aritmticas, 610 funciones de cadenas de caracteres, 564 funciones de cifrado, 611 funciones de comparacin de cadenas, 574 funciones de control de flujo, 562 funciones de conversin de tipos, 608 funciones de fecha Y2K conformidad, 10 funciones de fecha y hora, 584 funciones de informacin, 614 funciones definidas por el usuario, 1447 aadir, 1446, 1447 funciones diversas, 619 funciones GROUP BY, 622
1654
funciones matemticas, 578 funciones nativas aadir, 1456 funciones para clusulas SELECT y WHERE, 555 functions C API, 992 C Prepared statement API, 1040
G
gcc, 85 gdb using, 1618 General Public License, 5 generalidades de la instalacin, 81 GeomCollFromText(), 912 GeomCollFromWKB(), 914 geometra, 904 GeometryCollection(), 915 GeometryCollectionFromText(), 912 GeometryCollectionFromWKB(), 914 GeometryFromText(), 912 GeometryFromWKB(), 914 GeometryN(), 924 GeometryType(), 919 GeomFromText(), 912, 918 GeomFromWKB(), 914, 918 GET_FORMAT(), 590 GET_LOCK(), 620 GIS, 903, 904 GLength(), 921, 922 GPL General Public License, 1639 GNU General Public License, 1639 MySQL FLOSS License Exception, 1645 GRANT, 690 GRANTS, 712 GREATEST(), 559 GROUP BY, 410 alias en, 628 extensiones a SQL estndar, 627, 667 GROUP_CONCAT(), 623
herramientas grficas MySQL Migration Toolkit, 444 Herramientas GUI MySQL Administrator, 444 HEX(), 567 HIGH_NOT_PRECEDENCE SQL mode, 223 HIGH_PRIORITY, 669 historia de MySQL, 6, 6 histrico lnea de comandos mysql, 457 HOME variable de entorno, 457 host mysql opcin, 452 host.frm problemas para encontrar, 101 hostname caching, 438 HOUR(), 591 html mysql opcin, 452
I
ID unique, 1067 identificadores, 491 encomillado, 491 sensibilidad a maysculas, 492 IF, 942 IF(), 563 IFNULL(), 563 IGNORE INDEX, 666, 671 IGNORE KEY, 666, 671 ignore-space mysql opcin, 453 IGNORE_SPACE SQL mode, 223 igual (=), 557 IMPORT TABLESPACE, , 786 importar datos, 481 IN, 560 incrementar con la replicacin velocidad, 357 incremento rendimiento, 381 indexes and BLOB columns, 423 and IS NULL, 425 and LIKE, 425 and TEXT columns, 423 columns, 422 leftmost prefix of, 425 multi-column, 423 use of, 424 ndice borrar, 632, 646 ndices, 634 asignar a la cach de claves, 724 de partes mltiples, 634 nombres, 491
H
HANDLER, 650 Handlers, 940 HAVING, 667 help mysql opcin, 451 herramienta lnea de comandos, 451 herramienta de lnea de comandos, 451 herramientas lista de, 1507 mysqld_multi, 203 mysqld_safe, 200 safe_mysqld, 200 herramientas cliente, 987
1655
tamao de bloque, 239 y columnas TEXT, 639 y valores NULL, ndices de partes mltiples, 634 INET_ATON(), 620 INET_NTOA(), 620 Informacin de base de datos obtener, 707 informacin general, 1 informacin sobre privilegios localizacin, 277 informar errores, 2 INFORMATION_SCHEMA, 963, 964 nices y columnas BLOB, 639 inicializacin maestro/esclavo, 358 iniciando el servidor, 99 el servidor automticamente, 104 Iniciar mltiples servidores, 345 INNER JOIN, 670 InnoDB, 766 problemas en Solaris 10 x86_64, 126 INSERT, 413, 651 INSERT ... SELECT, 654 INSERT DELAYED, 655, 655 INSERT(), 568 inserting speed of, 413 instalacin distribucin binaria, 78 funciones definidas por el usuario, 1453 generalidades, 34 Perl, 147 Perl en Windows, 148 instalando distribucin de cdigo fuente, 81 paquetes PKG Mac OS X, 74 paquetes RPM de Linux, 72 INSTR(), 568 InteriorRingN(), 923 internal locking, 418 Internet Relay Chat, 20 internos, 1443 Intersection(), 925 Intersects(), 928 INTERVAL(), 560 introduccin, 1 introductor cadena de caracteres literal, 510 introductor cadena de caracteres literal, 510 IRC, 20 IS NOT NULL, 558 IS NOT valor booleano, 558 IS NULL, 407, 558 and indexes, 425 IS valor booleano, 558
IsClosed(), 921, 923 IsEmpty(), 920 ISNULL(), 560 ISOLATION LEVEL, 689 IsRing(), 922 IsSimple(), 920 IS_FREE_LOCK(), 621 IS_USED_LOCK(), 621 ITERATE, 943
J
JOIN, 670 juego de caracteres multi-byte, 1471 juegos de caracteres, 333 aadir, 335
K
Key cache MyISAM, 426 keys, 422 foreign, 177 multi-column, 423 searching on two, 179 key_buffer_size myisamchk variable, 318 KEY_COLUMN_USAGE tabla INFORMATION_SCHEMA, 971 KILL, 726
L
last row unique ID, 1067 LAST_DAY(), 592 LAST_INSERT_ID(), , 654 LAST_INSERT_ID([expr]), 617 LCASE(), 568 LD_LIBRARY_PATH variable de entorno, 149, 150 LD_RUN_PATH variable de entorno, 150 LEAST(), 561 LEAVE, 943 LEFT JOIN, 408, 670 LEFT OUTER JOIN, 670 LEFT(), 568 leftmost prefix of indexes, 425 LENGTH(), 568 libmysqld, 1070 options, 1071 License, 1645 LIKE, 574 and indexes, 425 and wildcards, 425 LIMIT, 412, 616, 667 limitaciones diseo, 388 replicacin, 368 limitaciones de replicacin, 368 lmites tamao de los ficheros, 9
1656
limites MySQL Limites, limites en MySQL, 1631 limpiar cachs, 725 LineFromText(), 913 LineFromWKB(), 914 LineString(), 915 LineStringFromText(), 913 LineStringFromWKB(), 914 linking, 1068 errors, 1472 problems, 1068 speed, 436 links symbolic, 440 Linux distribucin binaria, 119 distribucin de cdigo fuente, 120 lista de palabras de parada definida por el usuario, 606 listas de correo, 13 gua, 19 localizacin de archivos, 15 listas de correo electrnico, 13 literales, 487 literales de valores aproximados, 977 literales de valores exactos, 977 LN(), 580 LOAD DATA FROM MASTER, 732 LOAD DATA INFILE, 657, 1483 LOAD TABLE FROM MASTER, 732 loading tables, 160 LOAD_FILE(), 568 local-infile mysql opcin, 453 localizacin en lnea del manual, 2 LOCALTIME, 592 LOCALTIMESTAMP, 592 LOCATE(), 569 LOCK IN SHARE MODE, 669 LOCK TABLES, 686 locking, 432 page-level, 418 row-level, 418 table-level, 418 locking methods, 418 log changes, 1510 mysqld_multi opcin, 204 LOG(), 580 LOG10(), 580 LOG2(), 580 LOOP, 943 LOWER(), 569 LPAD(), 569 LTRIM(), 569
M
Mac OS X, 1080 instalacin, 74 maestros de replicacin comandos, 728 MAKEDATE(), 592 MAKETIME(), 592 make_binary_distribution, 197 MAKE_SET(), 569 mantenimiento archivos de registro, 345 tablas, 327 manual convenciones tipogrficas, 2 formatos disponibles, 2 localizacin en lnea, 2 MASTER_POS_WAIT(), 621, 733 MATCH ... AGAINST(), 600 matching patterns, 168 matemticas, 977 matemticas de precisin, 977 MAX(), 624 MAX(DISTINCT), 624 MAXDB SQL mode, 226 mxima memoria usada, 465 maximums Cantidad mxima de tablas por join, 1631 max_allowed_packet variable, 456 MAX_CONNECTIONS_PER_HOUR, 300 max_join_size variable, 456 MAX_QUERIES_PER_HOUR, 300 MAX_UPDATES_PER_HOUR, 300 MAX_USER_CONNECTIONS, 300 mayor que (>), 558 mayor que o igual (>=), 558 MBR, 926 MBRContains(), 926 MBRDisjoint(), 926 MBREqual(), 926 MBRIntersects(), 926 MBROverlaps(), 927 MBRTouches(), 927 MBRWithin(), 927 MD5(), 613 memoria virtual problemas durante compilacin, 90 memory use, 437 menor que (<), 558 menor que o igual (<=), 558 menos unario (-), 577 menos unario (-), 577 mensajes idiomas, 334 mensajes de error can't find file, 1473
1657
idiomas, 334 mostrar, 485 metadatos base de datos, 963 metadatos de la base de datos, 963 methods locking, 418 MICROSECOND(), 592 Microsoft Access, 1149 Microsoft ADO, 1151 Microsoft Excel, 1150 Microsoft Visual Basic, 1151 Microsoft Visual InterDev, 1151 MID(), 570 MIN(), 624 MIN(DISTINCT), 624 Minimum Bounding Rectangle, 926 MINUTE(), 592 MIT-pthreads, 93 MLineFromText(), 913 MLineFromWKB(), 914 MOD (mdulo), 581 MOD(), 581 modes batch, 174 modificando ubicacin de socket, 106 modo ANSI ejecucin, 21 mdulo (%), 581 mdulo (MOD), 581 mdulos listado de, 9 monitor terminal, 153 Mono, 1159 MONTH(), 593 MONTHNAME(), 593 mostrar estado de tabla, 719 informacin Collation, 712 SHOW, 707, 712, 713 informacin de la base de datos, 483, 483 mostrar disparadores, 721 mostrr informacin Cardinalidad, 712 SHOW, 720 motor de almacenamiento elegir, 741 motor de almacenamiento ARCHIVE, 741 Motor de almacenamiento ARCHIVE, 762 motor de almacenamiento BDB, 741 Motor de almacenamiento BDB, 755 motor de almacenamiento BerkeleyDB, 741 Motor de almacenamiento BerkeleyDB, 755 motor de almacenamiento CSV, 741 Motor de almacenamiento CSV, 763
motor de almacenamiento EXAMPLE, 741 Motor de almacenamiento EXAMPLE, 760 motor de almacenamiento FEDERATED, 741 Motor de almacenamiento FEDERATED, 760 motor de almacenamiento HEAP, 741 Motor de almacenamiento HEAP, 753 motor de almacenamiento InnoDB, 741, 765 motor de almacenamiento ISAM, 741 motor de almacenamiento MEMORY, 741 Motor de almacenamiento MEMORY, 753 motor de almacenamiento MERGE, 741 Motor de almacenamiento MERGE, 750 motor de almacenamiento MyISAM, 741, 743 motores de almacenamiento MySQL, 741 motrar informacin SHOW, 709 MPointFromText(), 913 MPointFromWKB(), 914 MPolyFromText(), 913 MPolyFromWKB(), 914 msql2mysql, 987 MSSQL SQL mode, 226 multi mysqld, 203 multi-column indexes, 423 MultiLineString(), 915 MultiLineStringFromText(), 913 MultiLineStringFromWKB(), 914 mltiples servidores, 345 multiplicacin (*), 577 MultiPoint(), 915 MultiPointFromText(), 913 MultiPointFromWKB(), 914 MultiPolygon(), 915 MultiPolygonFromText(), 913 MultiPolygonFromWKB(), 914 My derivacin, 6 my.cnf fichero, 368 MyISAM tablas comprimidas, 445, 748 tamao, 551 MyISAM key cache, 426 myisamchk, 86, 197 ejemplo salida, 328 opciones, 317 myisampack, 443, 445, 645, 748 myisam_block_size myisamchk variable, 318 MyODBC, 1080 MySQL definicin, 4 introduccin, 4 pronunciacin, 5 mysql, 443, 451 MySQL AB definicin, 4 MYSQL C type, 989 MySQL C type, 1038
1658
MySQL Cluster en MySQL 5.0 y 5.1, 884 MySQL Dolphin name, 6 MySQL listas de correo, 13 mysql opciones de lnea de comandos, 451 MySQL++, 1076 mysql.server, 197 mysql.sock cambio de ubicacin de, 85 proteccin, 1480 MYSQL323 SQL mode, 226 MYSQL40 SQL mode, 226 mysqlaccess, 443 mysqladmin, 443, 462, 634, 646, 718, 721, 725, 726 mysqld_multi opcin, 204 mysqladmin opciones de lnea de comandos, 465 mysqlbinlog, 444, 467 mysqlbug, 197 mysqlbug script, 15 localizacin, 2 mysqlcheck, 444 mysqld, 196 ejecutando, 1473 mysqld_multi opcin, 204 mysqld opcines, 212 mysqld options, 432 mysqld server buffer sizes, 432 mysqld-max, 196, 197 mysqldump, 117, 444, 473 mysqld_multi, 197, 203 mysqld_safe, 196, 200 mysqlhotcopy, 444 mysqlimport, 117, 444, 481, 657 mysqlshow, 444 mysqltest MySQL Test Suite, 1444 mysql_affected_rows(), 996 mysql_autocommit()., 1035 MYSQL_BIND C type, 1037 mysql_change_user(), 997 mysql_character_set_name(), 998 mysql_close(), 998 mysql_commit()., 1034 mysql_config, 988 mysql_connect(), 999 mysql_create_db(), 999 mysql_data_seek(), 1000 MYSQL_DEBUG environment variable, 1621 MYSQL_DEBUG variable de entorno, 445 mysql_debug(), 1000 mysql_drop_db(), 1001 mysql_dump_debug_info(), 1001 mysql_eof(), 1002 mysql_errno(), 1003 mysql_error(), 1003 mysql_escape_string(), 1004 mysql_fetch_field(), 1004 mysql_fetch_fields(), 1005
mysql_fetch_field_direct(), 1005 mysql_fetch_lengths(), 1005 mysql_fetch_row(), 1006 MYSQL_FIELD C type, 990 mysql_field_count(), 1007, 1017 MYSQL_FIELD_OFFSET C type, 990 mysql_field_seek(), 1008 mysql_field_tell(), 1008 mysql_fix_privilege_tables, 197, 288 mysql_free_result(), 1009 mysql_get_character_set_info(), 1009 mysql_get_client_info(), 1009 mysql_get_client_version(), 1009 mysql_get_host_info(), 1010 mysql_get_proto_info(), 1010 mysql_get_server_info(), 1010 mysql_get_server_version(), 1011 mysql_hex_string(), 1011 MYSQL_HISTFILE variable de entorno, 457 MYSQL_HOST variable de ambiente, 281 mysql_info(), 633, 654, 664, 683, 1012 mysql_init(), 1012 mysql_insert_id(), 27, 654, 1013 mysql_install_db, 197 mysql_install_db script, 103 mysql_kill(), 1014 mysql_library_end(), 1014 mysql_library_init(), 1014 mysql_list_dbs(), 1015 mysql_list_fields(), 1015 mysql_list_processes(), 1016 mysql_list_tables(), 1016 mysql_more_results()., 1035 mysql_next_result()., 1035 mysql_num_fields(), 1017 mysql_num_rows(), 1018 mysql_options(), 1018 mysql_ping(), 1021 MYSQL_PWD variable de ambiente, 281 MYSQL_PWD variable de entorno, 445 mysql_query(), 1022, 1067 mysql_real_connect(), 1022 mysql_real_escape_string(), 489, 1025 mysql_real_query(), 1026 mysql_reload(), 1026 MYSQL_RES C type, 990 mysql_rollback()., 1034 MYSQL_ROW C type, 990 mysql_row_seek(), 1027 mysql_row_tell(), 1027 mysql_select_db(), 1028 mysql_server_end(), 1066 mysql_server_init(), 1066 mysql_set_character_set(), 1028 mysql_set_server_option(), 1029 mysql_shutdown(), 1029 mysql_sqlstate(), 1030 mysql_ssl_set(), 1030
1659
mysql_stat(), 1031 MYSQL_STMT C type, 1037 mysql_stmt_affected_rows(), 1042 mysql_stmt_attr_get(), 1043 mysql_stmt_attr_set(), 1043 mysql_stmt_bind_param(), 1044 mysql_stmt_bind_result(), 1045 mysql_stmt_close(), 1045 mysql_stmt_data_seek(), 1046 mysql_stmt_errno(), 1046 mysql_stmt_error()., 1047 mysql_stmt_execute(), 1047 mysql_stmt_fetch(), 1051 mysql_stmt_fetch_column(), 1055 mysql_stmt_field_count(), 1055 mysql_stmt_free_result(), 1050 mysql_stmt_init(), 1055 mysql_stmt_insert_id(), 1050 mysql_stmt_num_rows(), 1056 mysql_stmt_param_count(), 1056 mysql_stmt_param_metadata(), 1056 mysql_stmt_prepare(), 1057 mysql_stmt_reset(), 1058 mysql_stmt_result_metadata., 1058 mysql_stmt_row_seek(), 1059 mysql_stmt_row_tell(), 1059 mysql_stmt_send_long_data()., 1060 mysql_stmt_sqlstate(), 1061 mysql_stmt_store_result(), 1062 mysql_store_result(), 1031, 1067 MYSQL_TCP_PORT variable de entorno, 350, 351, 445 mysql_thread_end(), 1065 mysql_thread_id(), 1033 mysql_thread_init(), 1065 mysql_thread_safe(), 1065 MYSQL_UNIX_PORT variable de entorno, 350, 351, 445 mysql_use_result(), 1033 mysql_warning_count()., 1034 my_init(), 1064 my_ulonglong C type, 990 my_ulonglong values printing, 990
N
named pipes, 62, 67 named-commands mysql opcin, 453 NATURAL LEFT JOIN, 670 NATURAL LEFT OUTER JOIN, 670 NATURAL RIGHT JOIN, 670 NATURAL RIGHT OUTER JOIN, 670 net etiquette, 15, 19 NetWare, 76 net_buffer_length variable, 456 no se puede crear/escribir archivo, 1469 no-auto-rehash
mysql opcin, 453 no-beep mysql opcin, 453 no-log mysqld_multi opcin, 205 no-named-commands mysql opcin, 453 no-pager mysql opcin, 453 no-tee mysql opcin, 453 nombre de mquina por defecto, 280 nombre de mquina por defecto, 280 nombre MySQL, 6 nombres, 491 sensibilidad a maysculas, 492 variables, 494 nombres de alias sensibilidad a maysculas, 492 nombres de base de datos case-sensitivity, 22 nombres de bases de datos sensibilidad a maysculas, 492 nombres de columnas sensibilidad a maysculas, 492 nombres de tabla sensibilidad a maysculas, 492 nombres de tablas case-sensitivity, nombres de usuarios y contraseas, 296 nombres legales, 491 NOT lgica, 561 NOT BETWEEN, 559 NOT IN, 560 NOT LIKE, 575 NOT NULL restriccin, 30 NOT REGEXP, 575 notacin de mscara de red en la tabla mysql.user, 281 Novell NetWare, 76 NOW(), 593 NO_AUTO_CREATE_USER SQL mode, 223 NO_AUTO_VALUE_ON_ZERO SQL mode, 223 NO_BACKSLASH_ESCAPES SQL mode, 224 NO_DIR_IN_CREATE SQL mode, 224 NO_FIELD_OPTIONS SQL mode, 224 NO_KEY_OPTIONS SQL mode, 224 NO_TABLE_OPTIONS SQL mode, 224 NO_UNSIGNED_SUBTRACTION SQL mode, 224 NO_ZERO_DATE SQL mode, 224 NO_ZERO_IN_DATE SQL mode, 224 Nuevas caractersticas en MySQL Cluster, 884 nuevos procedimientos aadir, 1457
1660
nuevos usuarios agregado, 80, 84 NUL, 488 NULL, 167, 1482 testeando valores nulos, 558, 559 testeo de null, 563 testeo de valores nulos, 557 NULL value, 167 NULLIF(), 564 nmeros, 489 nmeros de coma flotante, 529 nmeros de entregas, 37 nmeros vlidos ejemplos, 489 NumGeometries(), 925 NumInteriorRings(), 924 NumPoints(), 922
O
objetivos de MySQL, 5 obtencin de MySQL, 47 OCT(), 570 OCTET_LENGTH(), 570 ODBC, 1080 OLAP, 625 OLD_PASSWORD(), 613 ON DUPLICATE KEY, 651 one-database mysql opcin, 453 ONLY_FULL_GROUP_BY SQL mode, 225 opcin --password, 303 opcin -p, 303 opcin de configure --with-charset, 86 --with-collation, 86 --with-extra-charsets, 86 --with-low-memory, 90 Opcin REQUIRE GRANT, 308, 696 opcin with-big-tables, 84 opcin without-server, 84 opciones configure, 84 lnea de comandos, 212 mysql, 451 mysqladmin, 465 myisamchk, 317 replicacin, 368 opciones de comprobacin myisamchk, 319 opciones de configuracin, 84 Opciones de lnea de comando de SSL, 309 opciones de lnea de comandos, 212 mysql, 451 mysqladmin, 465 opciones de reparacin myisamchk, 320 opciones de replicacin, 368 Opciones relacionadas con SSL, 696
Opciones relativas a SSL, 308 OPEN, 942 Open Source definicin, 5 open tables, 430 OpenGIS, 904 opening tables, 431 OpenSSL, 304 open_files_limit variable, 469 operaciones aritmticas, 576 operadores, 555 conversin de tipos, 576, 608 lgicos, 561 operadores de comparacin, 556 operadores de conversin de tipos, 608 operadores lgicos, 561 optimizacin tablas, 327 optimization tips, 415 optimizations, 401, 405 OPTIMIZE TABLE, 701 optimizer controlling, 435 optimizing DISTINCT, 408 filesort, 410 GROUP BY, 411 LEFT JOIN, 408 LIMIT, 412 option files, 189 options embedded server, 1071 libmysqld, 1071 provided by MySQL, 153 OR, 179, 405 bit a bit, 610 lgica, 562 OR Index Merge optimization, 405 ORACLE SQL mode, 226 ORD(), 570 ordenacin juegos de caracteres, 333 tablas grant, 283, 285 ORDER BY, 164, , 666 alias en, 628 OUTFILE, 668 Overlaps(), 928
P
pack_isam, 445 page-level locking, 418 pager mysql opcin, 454 palabras clave, 499 palabras reservadas
1661
excepciones, 499 paquete de pruebas de rendimiento, 390 paquetes lista de, 1506 parameters server, 432 parmetros de arranque mysql, 451 mysqladmin, 465 parntesis ( y ), 556 parte indicativa literal cadena, 487 parte indicativa literal cadena, 487 password mysql opcin, 454 mysqld_multi opcin, 205 PASSWORD(), 282, 302, 614, 1470 PATH environment variable, 186 pattern matching, 168 performance disk issues, 439 estimating, 400 improving, 421 PERIOD_ADD(), 593 PERIOD_DIFF(), 593 Perl instalacin, 147 instalacin en Windows, 148 Perl API, 1076 Perl DBI/DBD problemas de instalacin, 149 permisos borrar, 690 dar, 690 eliminar, 690 mostrar, 712 predeterminados, 109 quitar, 690 permisos de usuario borrar, 690, 690 permisos globales, 690 perror, 445, 485 PHP API, 1075 PI(), 581 PIPES_AS_CONCAT SQL mode, 225 Plugin para Visual Studio, 1079 Point(), 915 PointFromText(), 913 PointFromWKB(), 914 PointN(), 922 PointOnSurface(), 924 PolyFromText(), 913 PolyFromWKB(), 914 Polygon(), 916 PolygonFromText(), 913 PolygonFromWKB(), 914 port mysql opcin, 454
portabilidad, 389 tipos, 553 porting to other systems, 1615 pos-instalacin configuracin y prueba, 97 POSITION(), 570 post-instalacin servidores mltiples, 345 POSTGRESQL SQL mode, 226 POW(), 581 POWER(), 581 precisin aritmtica, 977 predeterminados permisos, 109 preguntas, 464 respuestas, 19 PREPARE, 738 PRIMARY KEY, , 638 principales caractersticas de MySQL, 6 privilegio cambios, 287 privilegios acceso, 272 aadiendo, 298 borrar, 300 eliminar, 300 privilegios de acceso, 272 privilegios de cuenta aadiendo, 298 privilegios de usuario aadiendo, 298 borrar, 300 eliminar, 300 problemas columnas DATE, 1481 compilacin, 90 errores comunes, 1459 errores de acceso denegado, 1461 franja horaria, 1480 iniciando el servidor, 106 instalacin de Perl, 149 instalacin en Solaris, 126 instalando en IBM-AIX, 134 reportar, 15 valores temporales, 541 problemas con cc1plus, 90 Problemas de instalacin en Solaris, 126 problemas franja horaria, 1480 problems linking, 1472 ODBC, 1157 table locking, 420 procedimientos almacenados, 27, 933 aadir, 1457 procedimientos almacenados, 933
1662
procedimientos almacenados y disparadores definicin, 27 PROCEDURE, 669 procesamiento argumentos, 1451 procesamiento de argumentos, 1451 procesos muestra, 715 PROCESSLIST, 715 program variables setting, 194 programa crash-me, 389, 390 programas crash-me, 389 lista de, 196 programs client, 1068 prompt mysql opcin, 454 prompt de comando en mysql, 459 prompts meanings, 156 pronunciacin MySQL, 5 protocol mysql opcin, 454 prueba de entregas MySQL, 38 instalacin, 99 pos-instalacin, 97 pruebas de rendimiento, 391 punto decimal, 527 PURGE MASTER LOGS, 728 Python API, 1077
Q
QUARTER(), 593 Qu es el cifrado, 304 queries entering, 154 estimating performance, 400 examples, 175 Twin Studies project, 181 quick mysql opcin, 454 quitar permisos, 690 QUOTE(), 570
R
RADIANS(), 581 RAID tipo de tabla, 643 RAND(), 581 raw mysql opcin, 454 read_buffer_size myisamchk variable, 318
REAL_AS_FLOAT SQL mode, 225 reconfiguracin, 90, 90 reconnect mysql opcin, 454 recuperacin de fallos, 323 redondeo, 977 reducing data size, 421 reemplazar cadenas de caracteres utilidad replace, 485 referencias, ref_or_null, 407 regenerar tablas de permisos, 100 regex, 1627 REGEXP, 576 registro binario, 340 registro de consultas, 340 registro de consultas lentas, 344 registros bloquear, borrar, 1484 problemas de concordancia, 1485 registros no concordantes, 1485 reiniciando el servidor, 101 Related(), 928 RELEASE_LOCK(), 621 RENAME TABLE, 647 RENAME USER, 698 rendimiento incremento, 381 pruebas de rendimiento, 391 renombrar cuentas de usuario, 698 reordenar columnas, 1488 REPAIR TABLE, 702 reparar tablas, 324 REPEAT, 943 REPEAT(), 571 replace, 445 REPLACE, 664 REPLACE ... SELECT, 654 REPLACE(), 571 replicacin, 357 reportar bugs, 15 errores, 13 reportar bugs criterio para, 17 reporting Connector/NET problems, 1332 Connector/ODBC problems, 1157, 1157 requerimientos de almacenamiento tipo de columna, 550 RESET MASTER, 729
1663
RESET SLAVE, 733 Respecto al ao 2000, 544 responder preguntas etiqueta, 19 resta (-), 577 RESTORE TABLE, 703 restricciones, 29 cursores del lado del servidor, 1634 disparadores(triggers), 1633 rutinas almacenadas, 1633 subconsultas, 1634 vistas, 1636 restricciones en cursores del lado del servidor, 1634 restricciones en disparadores(triggers), 1633 restricciones en rutinas almacenadas, 1633 restricciones en subconsultas, 1634 restricciones en vistas, 1636 retorno (\r), 488 retorno de carro (\r), 488 retrieving data from tables, 161 retroceso (\b), 488 REVERSE(), 571 REVOKE, 690 RIGHT JOIN, 670 RIGHT OUTER JOIN, 670 RIGHT(), 571 RLIKE, 576 ROLLBACK, 25, 685 ROLLBACK TO SAVEPOINT, 686 ROLLUP, 625 ROUND(), 582 ROUTINES tabla INFORMATION_SCHEMA, 972 row-level locking, 418 rows counting, 170 selecting, 162 sorting, 164 ROW_COUNT(), 618 RPAD(), 571 RTRIM(), 572 RTS-threads, 1622 running batch mode, 174 queries, 154
S
safe-updates mysql opcin, 455 safe-updates opcin, 461 safe_mysqld, 200 Sakila, 6 salto de lnea (\n), 488, 488 SAVEPOINT, 686 SCHEMATA tabla INFORMATION_SCHEMA, 965 SCHEMA_PRIVILEGES
tabla INFORMATION_SCHEMA, 968 script configure, 84 script files, 174 scripts, 200, 203 mysqlbug, 15 mysql_install_db, 103 SQL, 451 searching two keys, 179 SECOND(), 594 secuencias de llamadas para funciones agregadas UDF, 1450 secuencias de llamadas para funciones simples UDF, 1449 secure-auth mysql opcin, 455 SEC_TO_TIME(), 594 seguridad frente a atacantes, 268 SELECT Cach de consultas, 352 LIMIT, 665 Optimizacin, 392 SELECT INTO, 939 SELECT INTO TABLE, 25 SELECT speed, 400 selecting databases, 158 select_limit variable, 456 sensibilidad a maysculas en bsquedas, 1481 en comparaciones de cadenas, 574 en identificadores, 492 en nombres, 492 Sentencia GRANT, 308 SEQUENCE, 180 sequences, 180 server connecting, 153 debugging, 1616 disconnecting, 153 servidor conectando, 280 detener, 101 iniciando y deteniendo, 104 inicio, 99 problemas al inicio, 106 reiniciar, 101 servidores mltiples, 345 SESSION_USER(), 618 SET, 703, 939 tamao, 553 SET GLOBAL SQL_SLAVE_SKIP_COUNTER, 733 SET OPTION, 703 SET PASSWORD, 698 SET SQL_LOG_BIN, 729 SET TRANSACTION, 689
1664
setting program variables, 194 SHA(), 614 SHA1(), 614 SHOW BINARY LOGS, 729 SHOW BINLOG EVENTS, 708, 729 SHOW CHARACTER SET, 708 SHOW COLLATION, 708 SHOW COLUMNS, 707, 709 SHOW con WHERE, 963, 975 SHOW CREATE DATABASE, 707, 709 SHOW CREATE FUNCTION, 938 SHOW CREATE PROCEDURE, 938 SHOW CREATE SCHEMA, 707, 709 SHOW CREATE TABLE, 707, 709 SHOW CREATE VIEW, 960 SHOW DATABASES, 707, 709 SHOW ENGINE, 707, 710 SHOW ENGINES, 707, 710 SHOW ERRORS, 707, 711 SHOW FIELDS, 707 SHOW FUNCTION STATUS, 938 SHOW GRANTS, 707, 712 SHOW INDEX, 707, 712 SHOW INNODB STATUS, 707 SHOW KEYS, 707, 712 SHOW MASTER LOGS, 708, 729 SHOW MASTER STATUS, 708, 730 SHOW OPEN TABLES, 707, 713 SHOW PRIVILEGES, 707, 714 SHOW PROCEDURE STATUS, 938 SHOW PROCESSLIST, 707, 715 SHOW SCHEMAS, 707, 709 SHOW SLAVE HOSTS, 708, 730 SHOW SLAVE STATUS, 708, 733 SHOW STATUS, 707 SHOW STORAGE ENGINES, 710 SHOW TABLE STATUS, 707 SHOW TABLE TYPES, 707, 710 SHOW TABLES, 707, 720 SHOW TRIGGERS, 707, 721 SHOW VARIABLES, 707 SHOW WARNINGS, 707, 722 show-warnings mysql opcin, 455 shutdown_timeout variable, 467 sigint-ignore mysql opcin, 455 SIGN(), 583 silent mysql opcin, 455 mysqld_multi opcin, 205 SIN(), 583 sintaxis expresiones regulares, 1627 sintaxis de comandos, 4 Sintaxis de comentarios, 498 sintaxis de expresiones regulares descripcin, 1627
sintaxis del shell, 4 sistema privilegios, 272 seguridad, 265 sistema de seguridad, 272 sistema privilegios, 272 descripcin, 272 sistemas operativos lmites en el tamao de los ficheros, 9 soportados, 35 Windows versus Unix, 70 sitios espejo, 47 skip-column-names mysql opcin, 455 skip-line-numbers mysql opcin, 455 socket mysql opcin, 455 Solaris x86_64 issues, 799 Solucin de problemas FreeBSD, 91 Solaris, 91 Solucin de problemas en FreeBSD, 91 Solucin de problemas en Solaris, 91 soporte direcciones de correo, 19 para sistemas operativos, 35 soporte a clientes direcciones de correo, 19 soporte de idiomas, 334 soporte de procesos, 35 soporte de subprocesos, 35 no nativo, 93 soporte de subprocesos nativo, 35 soporte tcnico direcciones de correo, 19 sorting data, 164 table rows, 164 sort_buffer_size myisamchk variable, 318 sort_key_blocks myisamchk variable, 318 SOUNDEX(), 572 SOUNDS LIKE, 572 SPACE(), 572 speed compiling, 436 inserting, 413 linking, 436 of queries, 400 SQL definicin, 5 SQL estndar diferencias con, 697 SQL scripts, 451 SQL-92 extensiones a, 20 SQL_BIG_RESULT, 669 SQL_BUFFER_RESULT, 669
1665
SQL_CACHE, 354, 670 SQL_CALC_FOUND_ROWS, 670 SQL_NO_CACHE, 354, 670 SQL_SMALL_RESULT, 669 sql_yacc.cc problems, 90 SQRT(), 583 SRID(), 920 SSH, 310 START SLAVE, 737 START TRANSACTION, 684 StartPoint(), 922 startup options default, 189 startup parameters, 432 tuning, 432 STATISTICS tabla INFORMATION_SCHEMA, 967 STD(), 624 STDDEV(), 624 STDDEV_POP(), 624 STDDEV_SAMP(), 624 STOP SLAVE, 737 storage of data, 421 storage space minimising, 421 STRAIGHT_JOIN, 669, 670 STRCMP(), 576 STRICT SQL mode, 222 STRICT_ALL_TABLES SQL mode, 225 STRICT_TRANS_TABLES SQL mode, 222, 225 striping defined, 439 STR_TO_DATE(), 594 subconsulta, 673 subconsultas, 673 SUBDATE(), 594 subselects, 673 SUBSTR(), 572 SUBSTRING(), 572 SUBSTRING_INDEX(), 573 SUBTIME(), 595 SUM(), 624 SUM(DISTINCT), 624 suma (+), 576 superusuario, 109 supresin valores por defecto, 30 symbolic links, 440, 441 SymDifference(), 926 SYSDATE(), 595 system optimization, 432 system table, 394 SYSTEM_USER(), 619
T
tabla borrar, 646 cambiar, 630, 632, 1488
tabla db ordenacin, 285 tabla host, 286 ordenacin, 285 tabla llena, 705 Tabla llena, 1469 tabla user ordenacin, 283 tablas actualizar, 25 ARCHIVE, 762 BDB, 755 Berkeley DB, 755 borrar registros, 1484 cambiar orden de columnas, 1488 comprimidas, 445 comprobacin de errores, 324 copiar, 643 CSV, 763 defragmentar, 327, 701, 747 dinmicas, 747 EXAMPLE, 760 FEDERATED, 760 formato comprimido, 748 fragmentacin, 701 grant, 287 HEAP, 753 host, 286 informacin, 328 InnoDB, 765 MEMORY, 753 MERGE, 750 mezcla, 750 mostrar, 483 mostrar estado, 719 MyISAM, 743 nombres, 491 optimizacin, 327 particionamiento, 750 RAID, 643 rgimen de mantenimiento, 327 reparar, 324 tamao mximo, 9 volcadas, 465 volcar, 473 tablas abiertas, 465 Tablas BDB, 25 tablas comprimidas, 445, 748 tablas de permisos actualizacin, 115 regenerar, 100 tablas derivadas, 678 tablas grant, 287 ordenacin, 283, 285 Tablas InnoDB, 25 Tablas MERGE definicin, 750 Tablas no transaccionales, 1484
1666
tablas transacciones seguras, 766 tablas transaction-safe, 25 tablas volcadas, 465 table mysql opcin, 455 table cache, 431 Table scans avoiding, 413 table-level locking, 418 tables closing, 431 comprobacin, 319 constant, 394, counting rows, 170 creating, 159 improving performance, 421 information about, 173 loading data, 160 multiple, 172 open, 430 opening, 431 retrieving data, 161 selecting columns, 163 selecting rows, 162 sorting rows, 164 symbolic links, 440 system, 394 too many, 432 unique ID for last row, 1067 volcar, 479 TABLES tabla INFORMATION_SCHEMA, 965 table_cache, 431 TABLE_PRIVILEGES tabla INFORMATION_SCHEMA, 969 tabulacin (\t), 488 tamao de muestra, 527 tamao de tablas, 9 tamaos muestra, 527 tamaos de buffer cliente, 987 TAN(), 583 tar problemas en Solaris, 126 Tcl API, 1077 tcp-ip mysqld_multi opcin, 205 TCP/IP, 62, 67 tee mysql opcin, 456 temporary tables problemas, 1489 terminal monitor defined, 153 testeando mysqld mysqltest, 1444 Texinfo, 2
TEXT tamao, 552 TEXT columnas valores por defecto, 547 TEXT columns indexing, 423 thread packages differences between, 1624 threaded clients, 1069 threads, 464 RTS, 1622 tiempo activo, 464 TIME(), 595 TIMEDIFF(), 595 timeout, 235, 620, 656 connect_timeout variable, 456, 467 shutdown_timeout variable, 467 TIMESTAMP y valores NULL, 1483 TIMESTAMP(), 595 TIMESTAMPADD(), 596 TIMESTAMPDIFF(), 596 TIME_FORMAT(), 596 TIME_TO_SEC(), 596 tipo de datos BIGINT, 529 BIT, 528 BOOL, 528, 553 BOOLEAN, 528, 553 CHAR, 545 DATE, 531 DATETIME, 531 DEC, 531 DECIMAL, 530, 977 DOUBLE, 530 DOUBLE PRECISION, 530 ENUM, 535 FIXED, 531 FLOAT, 529, 530, 530 GEOMETRY, 912 GEOMETRYCOLLECTION, 912 INT, 529 INTEGER, 529 LINESTRING, 912 MEDIUMINT, 528 MULTILINESTRING, 912 MULTIPOINT, 912 MULTIPOLYGON, 912 NUMERIC, 531 POINT, 912 POLYGON, 912 REAL, 530 SET, 535 SMALLINT, 528 TIME, 531, 543 TIMESTAMP, 531 TINYINT, 528 VARCHAR, 545
1667
YEAR, 532 Tipo de datos BINARY, 546 BLOB, 547 DATE, 539 DATETIME, 539 ENUM, 548 LONG, 547 SET, 549 TEXT, 547 TIMESTAMP, 539 VARBINARY, 546 YEAR, 544 tipo de datos BIGINT, 529 Tipo de datos BINARY, 546 tipo de datos BIT, 528 Tipo de datos BLOB, 547 tipo de datos BOOL, 528 tipo de datos BOOLEAN, 528 tipo de datos CHAR, 545 tipo de datos DATE, 531 Tipo de datos DATE, 539 tipo de datos DATETIME, 531 Tipo de datos DATETIME, 539 tipo de datos DEC, 531 tipo de datos DECIMAL, 530, 977 tipo de datos DOUBLE, 530 tipo de datos DOUBLE PRECISION, 530 tipo de datos ENUM, 535 Tipo de datos ENUM, 548 tipo de datos FIXED, 531 tipo de datos FLOAT, 529, 530, 530 Tipo de datos GEOMETRY, 912 Tipo de datos GEOMETRYCOLLECTION, 912 tipo de datos INT, 529 tipo de datos INTEGER, 529 Tipo de datos LINESTRING, 912 Tipo de datos LONG, 547 tipo de datos MEDIUMINT, 528 Tipo de datos MULTILINESTRING, 912 Tipo de datos MULTIPOINT, 912 Tipo de datos MULTIPOLYGON, 912 tipo de datos NUMERIC, 531 Tipo de datos POINT, 912 Tipo de datos POLYGON, 912 tipo de datos REAL, 530 tipo de datos SET, 535 Tipo de datos SET, 549 tipo de datos SMALLINT, 528 Tipo de datos TEXT, 547 tipo de datos TIME, 531, 543 tipo de datos TIMESTAMP, 531 Tipo de datos TIMESTAMP, 539 tipo de datos TINYINT, 528 Tipo de datos VARBINARY, 546 tipo de datos VARCHAR, 545 tipo de datos YEAR, 532 Tipo de datos YEAR, 544
tipo de tabla ARCHIVE, 741 Tipo de tabla ARCHIVE, 762 tipo de tabla BDB, 741 Tipo de tabla BDB, 755 tipo de tabla BerkeleyDB, 741 Tipo de tabla BerkeleyDB, 755 tipo de tabla CSV, 741 Tipo de tabla CSV, 763 tipo de tabla EXAMPLE, 741 Tipo de tabla EXAMPLE, 760 tipo de tabla FEDERATED, 741 Tipo de tabla FEDERATED, 760 tipo de tabla HEAP, 741 Tipo de tabla HEAP, 753 tipo de tabla InnoDB, 741, 765 tipo de tabla ISAM, 741 tipo de tabla MEMORY, 741 Tipo de tabla MEMORY, 753 tipo de tabla MERGE, 741 tipo de tabla MyISAM, 741, 743 Tipo de tablas MERGE, 750 tipos cadenas de caracteres, 545 columnas, 527, 553 datos, 527 de tablas, 741 fecha, 551 Fecha y Hora, 538 hora, 551 numricos, 551 portabilidad, 553 Tipos, 527 tipos de cadenas de caracteres, 545 tipos de datos, 527, 551 BINARY, 534 BLOB, 534 CHAR, 532 CHAR VARYING, 533 CHARACTER, 532 CHARACTER VARYING, 533 LONGBLOB, 535 LONGTEXT, 535 MEDIUMBLOB, 534 MEDIUMTEXT, 534 NATIONAL CHAR, 532 NCHAR, 532 TEXT, 534 TINYBLOB, 534 TINYTEXT, 534 VARBINARY, 534 VARCHAR, 533 VARCHARACTER, 533 Tipos de datos Respecto a Y2K, 545 tipos de datos BINARY, 534 tipos de datos BLOB, 534 tipos de datos CHAR, 532 tipos de datos CHAR VARYING, 533
1668
tipos de datos CHARACTER, 532 tipos de datos CHARACTER VARYING, 533 tipos de datos LONGBLOB, 535 tipos de datos LONGTEXT, 535 tipos de datos MEDIUMBLOB, 534 tipos de datos MEDIUMTEXT, 534 tipos de datos NATIONAL CHAR, 532 tipos de datos NCHAR, 532 tipos de datos TEXT, 534 tipos de datos TINYBLOB, 534 tipos de datos TINYTEXT, 534 tipos de datos VARBINARY, 534 tipos de datos VARCHAR, 533 tipos de datos VARCHARACTER, 533 Tipos de Fecha y Hora, 538 tipos de tabla MySQL, 741 tipos de tablas elegir, 741 tipos numricos, 551 tipos temporales, 551 tips optimization, 415 TODO embedded server, 1071 symlinks, 441 Touches(), 928 TO_DAYS(), 597 trace DBI method, 1619 TRADITIONAL SQL mode, 222, 226 Traductores lista de, 1504 transacciones soporte, 25, 766 tratar errores, 1453 triggers, 949 TRIGGERS tabla INFORMATION_SCHEMA, 973 TRIM(), 573 trucos, 22, 669, 671, 671 ndices, 666, 671 trucos de ndices, 666, 671 TRUE, 489 testeando, 558 TRUNCATE, 681 TRUNCATE(), 584 tutorial, 153 Twin Studies queries, 181
U
ubicacin de instalacin por defecto, 50 ubicacin del socket cambio, 85 UCASE(), 573 UCS-2, 503 UDFs, 1447 compilacin, 1453
definidas, 1446 valores de retorno, 1453 ulimit, 1471 unbuffered mysql opcin, 456 UNCOMPRESS(), 573 UNCOMPRESSED_LENGTH(), 574 UNHEX(), 574 Unicode, 503 UNION, 179, 671 Union(), 926 UNIQUE, restriccin, 30 unique ID, 1067 Unix, 1080, 1159 UNIX_TIMESTAMP(), 597 UNKNOWN testeando, 558 unloading tables, 161 UNLOCK TABLES, 686 UNTIL, 943 UPDATE, 682 UPPER(), 574 URLs para descargar MySQL, 47 USE, 684 USE INDEX, 666, 671 USE KEY, 666, 671 user mysql opcin, 456 mysqld_multi opcin, 205 USER variable de ambiente, 281 USER(), 619 USER_PRIVILEGES tabla INFORMATION_SCHEMA, 968 using multiple disks to start data, 441 uso de memoria, 465 myisamchk, 322 usos de MySQL, 390 usuario annimo, 109, 109, 282, 285 usuario root restablecer contrasea, 1474 usuarios agregado, 80, 84 borrar, 300, 690 root, 109 UTC_DATE(), 597 UTC_TIME(), 597 UTC_TIMESTAMP(), 598 UTF-8, 503 UTF8, 503 utilidad replace, 486 UUID(), 621
V
valor NULL, 490 valor por defecto
1669
supresin, 30 valores de retorno UDFs, 1453 valores hexadecimales, 490 valores negativos, 489 Valores NULL e ndices, 639 valores NULL contra valores vacos, 1482 y columnas AUTO_INCREMENT, 1483 valores NULL values y columnas TIMESTAMP, 1483 valores por defecto, 388, 638, 652 BLOB y TEXT columnas, 547 implcitos, valores por defecto implcitos, valores temporales problemas, 541 VARCHAR tamao, 552 variable de ambiente MYSQL_HOST, 281 MYSQL_PWD, 281 USER, 281 variable de entorno CC, 85, 85 CFLAGS, 85 CXX, 85, 85 CXXFLAGS, 85 HOME, 457 LD_LIBRARY_PATH, 150 LD_RUN_PATH, 121, 128, 150 MYSQL_DEBUG, 445 MYSQL_HISTFILE, 457 MYSQL_PWD, 445 MYSQL_TCP_PORT, 350, 351, 445 MYSQL_UNIX_PORT, 104, 350, 351, 445 PATH, 80 TMPDIR, 104 Variable de entorno CC, 91, 1625 CFLAGS, 91, 1625 CXX, 91, 91, 1625 CXXFLAGS, 91, 1625 DBI_TRACE, 1625 DBI_USER, 1625 HOME, 1625 LD_LIBRARY_PATH, 149 LD_RUN_PATH, 149, 1625 MYSQL_DEBUG, 1625 MYSQL_HISTFILE, 1625 MYSQL_HOST, 1625 MYSQL_PS1, 1625 MYSQL_PWD, 1625 MYSQL_TCP_PORT, 1625 MYSQL_UNIX_PORT, 1625 PATH, 1625 TMPDIR, 1625
TZ, 1480, 1625 UMASK, 1473, 1625 UMASK_DIR, 1474, 1625 USER, 1625 variable de entorno CC, 85, 85 Variable de entorno CC, 91, 1625 variable de entorno CFLAGS, 85 Variable de entorno CFLAGS, 91, 1625 variable de entorno CXX, 85, 85, 91, 1625 Variable de entorno CXX, 91, 91 variable de entorno CXXFLAGS, 85 Variable de entorno CXXFLAGS, 91, 1625 Variable de entorno DBI_TRACE, 1625 Variable de entorno DBI_USER, 1625 Variable de entorno HOME, 1625 Variable de entorno LD_RUN_PATH, 121, 149, 1625 variable de entorno LD_RUN_PATH, 128 Variable de entorno MYSQL_DEBUG, 1625 Variable de entorno MYSQL_HISTFILE, 1625 Variable de entorno MYSQL_HOST, 1625 Variable de entorno MYSQL_PS1, 1625 Variable de entorno MYSQL_PWD, 1625 Variable de entorno MYSQL_TCP_PORT, 1625 variable de entorno MYSQL_UNIX_PORT, 104 Variable de entorno MYSQL_UNIX_PORT, 1625 variable de entorno PATH, 80 Variable de entorno PATH, 1625 variable de entorno TMPDIR, 104 Variable de entorno TMPDIR, 1625 variable de entorno TZ, 1480 Variable de entorno TZ, 1625 variable de entorno UMASK, 1473 Variable de entorno UMASK, 1625 variable de entorno UMASK_DIR, 1474 Variable de entorno UMASK_DIR, 1625 Variable de entorno USER, 1625 variables de estado, 718 de sistema, 495 estado, 255 mysqld, 433 servidor, 226, 721 sistema, 226, 721 usuario, 494 valores, 230 Variables de entorno CXX, 91 variables de entorno, 288, 445 lista de, 1625 variables de estado, 255, 718 variables de servidor, 226, 495, 721 variables de sistema, 226, 495, 721 variables de usuario, 494 VARIANCE(), 625 VAR_POP(), 625 VAR_SAMP(), 625 velocidad de las consultas, 392
1670
incrementar con replicacin, 357 verbose mysql opcin, 456 mysqld_multi opcin, 205 verificacin de permisos efectos sobre la velocidad, 392 versin elegir, 37 ltima, 47 version mysql opcin, 456 mysqld_multi opcin, 205 versin de MySQL, 47 VERSION(), 619 vertical mysql opcin, 456 VIEWS tabla INFORMATION_SCHEMA, 973 Vision, 1153 vistas, 28, 955, 955 actualizable, 955 actualizables, 28 vistas sin nombre, 678 Visual Objects, 1151 volcar bases de datos, 473 databases, 479 volver a versin anterior, 117
Y
Y(), 921 YEAR(), 599 YEARWEEK(), 599
W
wait mysql opcin, 456 WEEK(), 598 WEEKDAY(), 599 WEEKOFYEAR(), 599 WHERE, 401 con SHOW, 963, 975 WHILE, 944 wildcards and LIKE, 425 Windows, 1080, 1159 actualizacin, 69 compilacin en, 97 temas pendientes, 72 versus Unix, 70 Within(), 929 wrappers Eiffel, 1077 write_buffer_size myisamchk variable, 318
X
X(), 920 xml mysql opcin, 456 XOR bit a bit, 610 lgica, 562
1671
1672