¿Por qué InnoDB almacena todas las bases de datos en un archivo?

51

Era conveniente que MyISAM usara para almacenar cada tabla en un archivo correspondiente. InnoDB ha realizado avances en muchos aspectos, pero me pregunto por qué InnoDB almacena todas las bases de datos en un archivo ( ibdata1de forma predeterminada).

Entiendo que InnoDB asignará la ubicación de los datos en el archivo por archivos de índice individuales para tablas, pero no entiendo por qué combina todos los datos en un archivo. Y lo más importante, ¿por qué mezclar los datos de todas las bases de datos en el servidor?

Una característica interesante de MyISAM es que se puede copiar / pegar una carpeta de base de datos en otra máquina y luego usar la base de datos (sin volcar).

Googlebot
fuente

Respuestas:

67

La arquitectura de InnoDB exige el uso de cuatro tipos básicos de páginas de información

  • Páginas de datos de tabla
  • Páginas de índice de tabla
  • Tabla MetaData
  • Datos MVCC (para soportar el aislamiento de transacciones y el cumplimiento de ACID )
    • Segmentos de reversión
    • Deshacer espacio
    • Memoria intermedia de doble escritura (escritura en segundo plano para evitar la dependencia del almacenamiento en caché del sistema operativo)
    • Insert Buffer (gestión de cambios en índices secundarios no únicos)

Vea la representación pictórica de ibdata1

Por defecto, innodb_file_per_table está deshabilitado. Esto hace que los cuatro tipos de páginas de información obtengan un solo archivo llamado ibdata1. Muchas personas intentan distribuir los datos creando múltiples archivos ibdata. Esto podría conducir a la fragmentación de datos y páginas de índice.

Es por eso que a menudo recomiendo limpiar la infraestructura de InnoDB, usando el archivo ibdata1 predeterminado y nada más .

Copiar es muy peligroso debido a la infraestructura bajo la cual trabaja InnoDB. Hay dos infraestructuras básicas.

  • innodb_file_per_table deshabilitado
  • innodb_file_per_table habilitado

InnoDB ( innodb_file_per_table deshabilitado)

Con innodb_file_per_table deshabilitado, todos estos tipos de información de InnoDB viven dentro de ibdata1. La única manifestación de cualquier tabla InnoDB fuera de ibdata1 es el archivo .frm de la tabla InnoDB. Copiar todos los datos de InnoDB a la vez requiere copiar todos / var / lib / mysql.

Copiar una tabla InnoDB individual es totalmente imposible. Debe volcar MySQL para extraer un volcado de la tabla como una representación lógica de los datos y sus definiciones de índice correspondientes. Luego cargaría ese volcado en otra base de datos en el mismo servidor u otro servidor.

InnoDB ( innodb_file_per_table habilitado)

Con innodb_file_per_table habilitado, los datos de la tabla y sus índices viven en la carpeta de la base de datos al lado del archivo .frm. Por ejemplo, para la tabla db1.mytable, la manifestación de esa tabla InnoDB fuera de ibdata1 sería:

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.ibd

Sistema de tablas ibdata1

Todos los metadatos para db1.mytable todavía residen en ibdata1 y no hay absolutamente nada de eso . Los registros de rehacer y los datos de MVCC también viven con ibdata1.

Cuando se trata de la fragmentación de la tabla, esto es lo que le sucede a ibdata1:

  • innodb_file_per_table habilitado : puede reducir db1.mytables conALTER TABLE db1.mytable ENGINE=InnoDB;oOPTIMIZE TABLE db1.mytable;. Esto hace que /var/lib/mysql/db1/mytable.ibd sea físicamente más pequeño sin fragmentación.
  • innodb_file_per_table deshabilitado : no puede reducir db1.mytables conALTER TABLE db1.mytable ENGINE=InnoDB;oOPTIMIZE TABLE db1.mytable;porque reside con ibdata1. Al ejecutar cualquiera de los comandos, haga que la tabla sea contigua y más rápida para leer y escribir. Desafortunadamente, eso ocurre al final de ibdata1. Esto hace que ibdata1 crezca rápidamente. Esto se aborda completamente en mi publicación de limpieza de InnoDB .

ADVERTENCIA (o PELIGRO como diría el Robot en Lost in Space )

Si está pensando en copiar el archivo .frm y .ibd, está en línea para el mundo de los daños. Copiar el archivo .frm y .ibd de una tabla InnoDB solo es bueno si y solo si puede garantizar que el id del espacio de tabla del archivo .ibd coincida exactamente con la entrada de id del espacio de tabla en los metadatos del archivo ibdata1 .

Escribí dos publicaciones en DBA StackExchange sobre este concepto de id de espacio de tabla

Aquí hay un excelente enlace sobre cómo volver a conectar cualquier archivo .ibd a ibdata1 en caso de id. De espacio de tabla no coincidentes: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file . Después de leer esto, debe darse cuenta de inmediato de que copiar archivos .ibd es simplemente una locura.

Para InnoDB, solo necesita algo para moverse

CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;

hacer una copia de una tabla InnoDB.

Si lo está migrando a otro servidor de base de datos, use mysqldump.

Con respecto a mezclar todas las tablas de InnoDB de todas las bases de datos, puedo ver la sabiduría al hacerlo. En la empresa de alojamiento web / DB de mi empleador, tengo un cliente MySQL que tiene una tabla en una base de datos cuyas restricciones se asignan a otra tabla en otra base de datos dentro de la misma instancia de MySQL. Con un repositorio de metadatos común, hace posible el soporte transaccional y la operatividad MVCC en múltiples bases de datos.

RolandoMySQLDBA
fuente
¿Significa que cuando uso el archivo innodb por tabla habilitada y si necesito importar mis datos de un servidor a otro, tendré que usar solo mysqldump y no otras herramientas como Percona xtrabackup?
tesla747
14

Puede alternar InnoDB para almacenar tablas por archivo agregando innodb-file-per-table a su cnf.

Innodb realmente se preocupa por las páginas de datos en un nivel básico. De hecho, puede configurar InnoDB para usar solo un dispositivo de bloque sin formato sin ningún sistema de archivos. http://dev.mysql.com/doc/refman/5.5/en/innodb-raw-devices.html

Hay conveniencias para almacenar tablas para archivos, como poder recuperar más fácilmente el espacio utilizado a través de optimizar.

Incluso con archivos por tabla, no puede copiar los archivos ibd tan fácilmente, ya que InnoDB es transaccional y almacena información sobre su estado en los archivos ibdata / log compartidos globalmente.

Eso no quiere decir que no se puede hacer. Si la tabla está fuera de línea, puede descartar / importar los espacios de tabla y copiar los .idbs en http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html

atxdba
fuente
No hay duda de que InnoDB es un motor flexible, pero no entiendo cómo es beneficioso almacenar todos los datos en un archivo (ya que esta nueva estructura se ha implementado en InnoDB en comparación con MyISAM).
Googlebot
Creo que es más una de esas retrospectivas que son las 20/20 cosas. La opción de archivo por tabla se agregó después de que innodb salió por primera vez de los estantes. Fuera de darle su propio dispositivo de bloque para evitar la sobrecarga del sistema de archivos, no puedo proporcionar una razón por la cual deshacerse de todos ellos es mejor (y todo lo relacionado con el dispositivo de bloque es su propio debate). Todas mis configuraciones de innodb tienen el archivo por tabla habilitado.
atxdba
Ese es el punto, no depender del sistema de archivos puede ser un valor incalculable, pero no está activo por defecto. Por lo tanto, algunos usuarios lo usarán.
Googlebot
1
Una opción de archivo por tabla puede causar daños si tiene muchas tablas y poca RAM (una tienda de Magento, por ejemplo, puede tener aproximadamente 1000 tablas). Y la configuración de los archivos abiertos también debe optimizarse (teniendo en cuenta las limitaciones del sistema operativo). Por lo tanto, use con precaución.
ypercubeᵀᴹ
Ciertamente puede poner un freno a los esfuerzos de recuperación. Sí, debe tener una copia de seguridad, pero si no lo hace, InnoDB hace las cosas más difíciles debido a esta estructura.
mikato
10

Este es el comportamiento predeterminado pero no obligatorio. Desde documentos de MySQL, usando espacios de tabla por tabla :

Por defecto, todas las tablas e índices de InnoDB se almacenan en el espacio de tabla del sistema. Como alternativa, puede almacenar cada tabla InnoDB y sus índices en su propio archivo . Esta característica se denomina “espacios de tabla múltiples” porque cada tabla que se crea cuando esta configuración está vigente tiene su propio espacio de tabla.

En cuanto a por qué, la razón es probablemente las diferentes arquitecturas de los dos motores (MyISAM e InnoDB). Por ejemplo, en InnoDB, no puede simplemente copiar el archivo .ibd a otra base de datos o instalación. Explicación (de la misma página):

Consideraciones de portabilidad para archivos .ibd

No puede mover libremente archivos .ibd entre los directorios de la base de datos como puede hacerlo con los archivos de tabla MyISAM. La definición de tabla almacenada en el espacio de tabla compartido InnoDB incluye el nombre de la base de datos. Los ID de transacción y los números de secuencia de registro almacenados en los archivos de espacio de tabla también difieren entre las bases de datos.

ypercubeᵀᴹ
fuente
Respuesta muy informativa y aclaró el problema, pero aún tengo curiosidad por saber cómo un archivo grande que contiene todas las bases de datos puede mejorar el rendimiento (si lo hace).
Googlebot
El rendimiento no es mejor por tener un archivo para todos. Varias características, como el bloqueo a nivel de fila, en lugar del nivel de tabla, ayudan al rendimiento. Y, por supuesto, la principal ventaja son las transacciones y las restricciones de FK (y, por lo tanto, la integridad de la base de datos).
ypercubeᵀᴹ
1
¡Tienes toda la razón sobre la integridad! Entiendo por qué es mejor poner todas las tablas de una base de datos en un solo archivo; pero no entiendo por qué poner todas las bases de datos (que son completamente independientes) en el mismo archivo. InnoDB por defecto usa solo un archivo para almacenar datos.
Googlebot