En MySQL 5.0, se puede almacenar cada tabla
InnoDB
y sus índices en su propio fichero.
Esta característica se llama “multiple
tablespaces” (espacios de tablas múltiples) porque, en
efecto, cada tabla tiene su propio espacio de tablas.
El uso de múltiples espacios de tablas puede ser beneficioso para usuarios que desean mover tablas específicas a discos físicos separados o quienes deseen restaurar respaldos de tablas sin interrumpir el uso de las demás tablas InnoDB.
Se pueden habilitar múltiples espacios de tablas agregando esta
línea a la sección [mysqld]
de
my.cnf
:
[mysqld] innodb_file_per_table
Luego de reiniciar el servidor, InnoDB
almacenará cada nueva tabla creada en su propio fichero
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
nombre_tabla
.ibdMyISAM
, pero MyISAM
divide
la tabla en un fichero de datos
y
el fichero de índice
tbl_name
.MYD
.
Para tbl_name
.MYIInnoDB
, los datos y los índices se
almacenan juntos en el fichero .ibd
. El
fichero
se
sigue creando como es usual.
tbl_name
.frm
Si se quita la línea 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.
innodb_file_per_table
afecta solamente la
creación de tablas. Si se inicia el servidor con esta opción,
las tablas nuevas se crearán empleando ficheros
.ibd
, pero aún se puede acceder a las
tablas existentes en el espacio de tablas compartido. Si se
remueve la opción, las nuevas tablas se crearán en el espacio
compartido, pero aún se podrá acceder a las tablas creadas en
espacios de tablas múltiples.
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 definición de
las tablas se almacena en el espacio de tablas compartido de
InnoDB
, y también porque
InnoDB
debe preservar la consistencia de los
identificadores de transacciones y los números de secuencia de
registros (log).
Dentro de una determinada instalación 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 TABLEnombre_bd_anterior.nombre_tabla
TOnombre_bd_nuevo.nombre_tabla
;
Si se tiene un respaldo “limpio” de un fichero
.ibd
, se lo puede restaurar dentro de la
instalación MySQL de donde proviene del siguiente modo:
Utilizando esta sentencia ALTER TABLE
:
ALTER TABLE nombre_tabla
DISCARD TABLESPACE;
Precaución: Esto
eliminará el actual fichero .ibd
.
Colocando el fichero .ibd
nuevamente en
el directorio de la base de datos adecuada.
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
eliminación en el fichero .ibd
.
mysqld ha descargado todas las páginas
modificadas del fichero .ibd
desde el
buffer pool hacia el fichero.
Se puede realizar un respaldo limpio del fichero
.ibd
con el siguiente método:
Detener toda actividad del servidor mysqld y confirmar todas las transacciones.
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 método para hacer una copia limpia de un fichero
.ibd
es utilizar la herramienta comercial
InnoDB Hot Backup:
Utilizar InnoDB Hot Backup para respaldar
la instalación InnoDB
.
Iniciar un segundo servidor mysqld sobre
el respaldo y permitirle limpiar los ficheros
.ibd
del mismo.
Figura en la lista de pendientes (TODO) para permitir mover
ficheros .ibd
limpios a otra instalación
MySQL. Esto necesita que se inicialicen los IDs
(identificadores) de transacciones y los números de secuencia
de registros (log) en el fichero .ibd
.
É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.