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
para la salida períodica de <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
para almacenar periódicamente la salida de <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.