Esta sección describe las opciones de servidor relacionadas con
      InnoDB. En MySQL 5.0, todas son especificadas
      con la forma
      --
      en la línea de comandos o en ficheros de opciones.
    opt_name=value
          innodb_additional_mem_pool_size
        
          El tamaño del pool de memoria que InnoDB
          utiliza para almacenar información del diccionario de datos y
          otras estructuras de datos internas. Mientras más tablas se
          tengan en la aplicación, mayor será este tamaño. Si
          InnoDB se queda sin memoria en este pool,
          comenzará a tomar memoria del sistema operativo, y dejará
          mensajes de advertencia en el log de errores de MySQL. El
          valor por defecto es 1MB.
        
          innodb_autoextend_increment
        
El tamaño a incrementar (en megabytes) cuando se extiende el tamaño de un espacio de tablas autoextensible, luego de llenarse. El valor por defecto es 8. Esta opción puede cambiarse en tiempo de ejecución como una variable de sistema global.
          innodb_buffer_pool_awe_mem_mb
        
          El tamaño (en MB) del pool de buffer, si está ubicado en la
          memoria AWE en Windows de 32 bits, y sólo relevante en este
          tipo de sistemas operativos. Si el sistema operativo Windows
          de 32 bits en uso soporta más de 4GB de memoria, usualmente
          llamado “Address Windowing Extensions”, se puede
          ubicar el pool del buffer de InnoDB dentro
          de la memoria física AWE utilizando este parámetro. El
          máximo valor posible es de 64000. Si se especifica este
          parámetro, innodb_buffer_pool_size es la
          ventana en el espacio de direcciones de 32 bits de
          mysqld donde InnoDB
          direcciona la memoria AWE. Un valor adecuado para
          innodb_buffer_pool_size son 500MB.
        
          innodb_buffer_pool_size
        
          El tamaño del buffer de memoria que InnoDB
          emplea para el almacenamiento intermedio de los datos e
          índices de sus tablas. Mientras más grande sea este valor,
          menores operaciones de E/S en disco serán necesarias para
          acceder a los datos de las tablas. En un servidor de bases de
          datos dedicado, se puede establecer este valor en hasta el 80%
          de la memoria física del ordenador. Sin embargo, no debe
          establecerse en un valor demasiado grande porque la pugna por
          la memoria física podría causar que el sistema operativo
          comience a paginar.
        
          innodb_checksums
        
          InnoDB emplea validación por sumas de
          verificación (checksums) en todas las páginas leídas desde
          el disco, para asegurar una tolerancia extra contra fallas
          frente a hardware averiado o ficheros corruptos. Sin embargo,
          bajo ciertas circunstancias inusuales (por ejemplo al ejecutar
          pruebas de rendimiento) esta característica extra de
          seguridad es innecesaria. En tales casos, esta opción (que
          está habilitada por defecto) puede deshabilitarse con
          --skip-innodb-checksums. Esta opción fue
          agregada en MySQL 5.0.3.
        
          innodb_data_file_path
        
          Las rutas a los ficheros individuales de datos y sus tamaños.
          La ruta de directorio completa a cada fichero de datos se
          obtiene concatenando innodb_data_home_dir
          con cada ruta especificada aquí. Los tamaños de fichero se
          especifican en megabytes o gigabytes (1024MB) agregando
          M o G al valor que
          representa el tamaño. La sumatoria de los tamaños 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 tamaño de fichero en más de 4GB.
          También pueden utilizarse como ficheros de datos particiones
          de dispositivos en bruto. Consulte
          Sección 15.14.2, “Usar dispositivos en bruto (raw devices) para espacios de tablas”.
        
          innodb_data_home_dir
        
          La porción común 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. También puede especificarse como una cadena vacía, en
          cuyo caso se podrán 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
          opción puede emplearse para desactivar dicha funcionalidad.
          Al igual que innodb_checksums, esta opción
          está habilitada por defecto; puede desactivarse con
          --skip-innodb-doublewrite en pruebas de
          rendimiento o casos en que el máximo desempeño prevalezca
          sobre la preocupacion por la integridad de los datos o las
          posibles fallas. Esta opción se agregó en MySQL 5.0.3.
        
          innodb_fast_shutdown
        
          Si se establece a 0, InnoDB efectúa una
          descarga completa y vuelca los buffers de inserción 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 (opción que está disponible desde MySQL
          5.0.5, excepto en Netware), InnoDB simplemente vuelca a disco
          sus registros (logs) y se cierra en frío, como si hubiera
          ocurrido una caída; ninguna transacción confirmada se
          perderá, pero en el siguiente inicio se ejecutará una
          recuperación ante caídas.
        
          innodb_file_io_threads
        
          El número de subprocesos (threads) de E/S de fichero en
          InnoDB. Normalmente esto debería ser
          dejado en el valor predeterminado de 4, pero la E/S de disco
          en Windows puede beneficiarse con un número mayor. En Unix,
          incrementar el número no tiene efecto;
          InnoDB siempre utiliza el valor
          predeterminado.
        
          innodb_file_per_table
        
          Esta opción 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 Sección 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 transacción.
          Cuando este valor es 1 (predeterminado), cada vez que se
          confirma una transacción 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 también 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 programación (scheduling) de procesos. Se puede
          alcanzar un mayor rendimiento estableciendo un valor diferente
          de 1, pero en caso de caída se puede perder un segundo de
          transacciones. Si se establece el valor en 0, cualquier caída
          en un proceso de mysqld puede borrar el
          último segundo de transacciones. Si se establece el valor en
          2, entonces únicamente una caída del sistema operativo o una
          interrupción de energía pueden borrar el último segundo de
          transacciones. Hay que notar que muchos sistemas operativos y
          algunos tipos de discos puedne ser engañosos en las
          operaciones de volcado a disco. Podrían 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 aún con el valor 1, y
          en el peor de los casos una interrupción de energía puede
          incluso corromper la base de datos InnoDB. Utilizar un caché
          de disco apoyado por baterías en el controlador de disco SCSI
          o en el propio disco, acelera los volcados a disco, y hace
          más segura la operación. También 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 algún otro comando específico
          del fabricante del hardware. El valor por defecto de esta
          opción es 1
        
          innodb_flush_method
        
          Esta opción 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. Nótese 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 opción debería ser definida solamente en
          una situación 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 Sección 15.8.1, “Forzar una recuperación”. Como una medida de
          seguridad, InnoDB impide que un usuario
          modifique datos cuando esta opción tiene un valor mayor a 0.
        
          innodb_lock_wait_timeout
        
          El límite de tiempo, en segundos, que una transacción
          InnoDB puede esperar por un bloqueo antes
          de ser cancelada. InnoDB automáticamente
          detecta bloqueos mutuos (deadlocks) en su propia tabla de
          bloqueos, y cancela la transacción. 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 configuración de replicación, se debería 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 opción desactiva el bloqueo de la clave siguiente en
          búsquedas y exploraciones de índices
          InnoDB. El valor por defecto de esta
          opción es falso.
        
          Normalmente, InnoDB utiliza un algoritmo
          denominado bloqueo de clave siguiente
          (next-key). InnoDB efectúa 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 también afecta al
          “vacío” 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
          opción provoca que InnoDB no utilice el
          bloqueo de clave siguiente en búsquedas o exploraciones de
          índices. El bloqueo de clave siguiente es todavía utilizado
          para asegurar las restricciones de claves foráneas y la
          verificación de claves duplicadas. Nótese que el uso de esta
          opción puede provocar problemas secundarios: suponiendo que
          se deseen leer y bloquear todos los 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;
          Supóngase 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 vacíos, en la tabla se insertará un nuevo registro.
          Si se ejecuta el mismo SELECT dentro de la
          misma transacción, se verá un nuevo registro en el conjunto
          de resultados devuelto por la consulta. Esto también
          significa que si se agregan nuevos elementos a la base de
          datos, InnoDB no garantiza la serialización; sin embargo, los
          conflictos de serialización aún están garantizados. Por lo
          tanto, si esta opción se utiliza, InnoDB garantiza como mucho
          el nivel de aislamiento READ COMMITTED.
        
          A partir de MySQL 5.0.2 esta opción es aún más 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 aún pueden
          ocurrir. Nótese que esta opción todavía no le permite a
          operaciones como UPDATE predominar sobre
          otras operaciones similares (como otro
          UPDATE) aún en el caso en que actúen
          sobre registros diferentes. Considérese 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;
Si una conexión realiza una consulta:
SET AUTOCOMMIT = 0; UPDATE A SET B = 5 WHERE B = 3;
y la otra conexión ejecuta otra consulta a continuación de la primera:
SET AUTOCOMMIT = 0; UPDATE A SET B = 4 WHERE B = 2;
          La consulta dos tendrá que esperar la confirmación o la
          cancelación de la consulta uno, porque ésta tiene un bloqueo
          exclusivo en el registro (2,3), y la consulta dos, mientras
          explora los registros, también 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 opción
          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)
entonces la consulta dos se ejecuta así:
x-lock(1,2) update(1,2) to (1,4) x-lock(2,3) - wait for query one to commit or rollback
          innodb_log_arch_dir
        
          El directorio donde los ficheros de registro (logs) terminados
          se archivarán si se utiliza el archivo de ficheros de
          registro. Si se utiliza, el valor de este parámetro debería
          ser el mismo que innodb_log_group_home_dir.
          Sin embargo, no es requerido.
        
          innodb_log_archive
        
          Este valor generalmente debería establecerse a 0. Debido a
          que la recuperación 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 opción es 0.
        
          innodb_log_buffer_size
        
          El tamaño 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 transacción se confirme. Por lo tanto, si se manejan
          grandes transacciones, incrementar el tamaño del buffer de
          ficheros de registro ahorra operaciones de E/S en disco.
        
          innodb_log_file_size
        
          El tamaño de cada fichero de registro (log) en un grupo de
          ficheros de registro. El tamaño 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
          tamaño 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 verificación que se necesitan en el pool de buffer,
          ahorrando operaciones de E/S en disco. Pero tener ficheros de
          registro más grandes también significa que la recuperación
          es más lenta en caso de caídas.
        
          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
          parámetros de ficheros de registro InnoDB,
          la acción 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 páginas desde el pool de buffer de modo que a
          lo sumo este porcentaje de las páginas aún sin volcar sea
          volcado en un momento determinado. Si se tiene el privilegio
          SUPER, este porcentaje pude cambiarse
          mientras el servidor está en ejecución:
        
SET GLOBAL innodb_max_dirty_pages_pct = value;
          innodb_max_purge_lag
        
          Esta opción controla la forma de retrasar las operaciones
          INSERT, UPDATE y
          DELETE cuando las operaciones de descarga
          (ver Sección 15.12, “Implementación de multiversión”) están
          sufiendo demoras. TEl valor por defecto de este parámetro es
          cero, lo que significa que no se retrasarán. Esta opción
          puede modificarse en tiempo de ejecución 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
          innodb_max_purge_lag, cada operación 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 depuración, cada diez segundos. Las operaciones no se
          retrasan si no puede ejecutarse la depuración debido a una
          vista de lectura consistente (consistent read) anterior que
          contenga los registros a ser depurados.
        
Un escenario típico para una carga de trabajo problemática podría ser 1 millón, asumiendo que las transacciones son pequeñas, sólo 100 bytes de tamaño, y se pueden permitir 100 MB de registros sin descargar en las tablas.
          innodb_mirrored_log_groups
        
El número de copias idénticas de grupos de ficheros de registro que se mantienen para la base de datos. Actualmente debería establecerse en 1.
          innodb_open_files
        
          Esta opción sólo es relevante si se emplean múltiples
          espacios de tablas en InnoDB. Especifica el
          número máximo de ficheros .ibd que
          InnoDB puede mantener abiertos al mismo
          tiempo. El mínimo 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 opción de servidor
          --open-files-limit, y no afectan la
          operación 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 Sección 5.10.3, “El registro binario (Binary Log)”.
        
          innodb_status_file
        
          Esta opción provoca que InnoDB cree un
          fichero
          <datadir>/innodb_status.<pid>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 número de
          flujos (threads) del sistema operativo que concurren dentro de
          InnoDB en un valor menor o igual al límite
          especificado por este parámetro. 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 semáforos, se
          podrían tener subprocesos pugnando por recursos, y se
          debería establecer este parámetro en un número 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 número de procesadores y discos que tiene el
          sistema. Un valor de 500 o mayor deshabilitará la
          verificación de concurrencia. A partir de MySQL 5.0.8, el
          valor por defecto es 20, y la verificación de concurrencia se
          deshabilita si se establece en 20 o más.
        
          innodb_status_file
        
          Esta opción provoca que InnoDB cree un
          fichero
          <datadir>/innodb_status.<pid>SHOW
          INNODB STATUS.
        
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.

