Bienvenidos sean a este post, hoy veremos una forma de almacenar nuestras tablas en el disco.
Las tablas de InnoDB son almacenadas en areas de almacenamiento llamadas espacios de tablas (tablespaces), las cuales contienen tanto los datos como los indices, esta contiene los siguientes elementos:
- Buffer de cambio
- Buffer de dobleescritura
- Log de Undo (predeterminado)
Nota: En versiones anteriores mariadb solo usaba el espacio de tabla llamado espacio de tabla del sistema
Este espacio de tabla esta almacenado fisicamente en el archivo ibdata dentro del directorio de datos de mariadb, si bien el espacio de tabla del sistema todavia existe y se puede usar para almacenar dichas tablas ahora tenemos la posibilidad de almacenarlas individualmente en cada espacio de tabla, estos archivos llevan la extension .ibd y estan ubicados en subdirectorios de la base de datos, todo este metodo es el llamado modo de archivo por tabla, y viene activo de manera predeterminada desde la version 10.0, les dejo un ejemplo:
tinchicus@dbn001vrt:~$ sudo ls -l /var/lib/mysql/base1/
total 512
-rw-rw---- 1 mysql mysql 67 jun 4 19:09 db.opt
-rw-rw---- 1 mysql mysql 1216 jul 21 13:33 empresaA.frm
-rw-rw---- 1 mysql mysql 98304 jul 21 13:58 empresaA.ibd
-rw-rw---- 1 mysql mysql 1216 jul 21 13:34 empresaB.frm
-rw-rw---- 1 mysql mysql 98304 jul 21 14:19 empresaB.ibd
-rw-rw---- 1 mysql mysql 454 jun 9 17:33 tabla1.frm
-rw-rw---- 1 mysql mysql 98304 jul 21 10:41 tabla1.ibd
-rw-rw---- 1 mysql mysql 546 jun 9 17:34 tabla2.frm
-rw-rw---- 1 mysql mysql 98304 jun 9 17:56 tabla2.ibd
-rw-rw---- 1 mysql mysql 1152 jun 7 20:18 tabla3.frm
-rw-rw---- 1 mysql mysql 98304 jul 10 16:59 tabla3.ibd
-rw-rw---- 1 mysql mysql 432 sep 4 08:49 tabla4.frm
-rw-rw---- 1 mysql mysql 0 sep 4 08:49 tabla4.MYD
-rw-rw---- 1 mysql mysql 1024 sep 4 08:49 tabla4.MYI
tinchicus@dbn001vrt:~$
Para activarlo o desactivarlo debemos usar la variable innodb_file_per_table, al momento de crearlo en base al valor de la variable utilizara espacios de tablas individuales o del sistema, para saber el valor de esta podemos usar el siguiente comando:
MariaDB [(none)]> select @@global.innodb_file_per_table;
Y nos devolvera lo siguiente:
MariaDB [(none)]> select @@global.innodb_file_per_table;
+--------------------------------+
| @@global.innodb_file_per_table |
+--------------------------------+
| 1 |
+--------------------------------+
1 row in set (0.001 sec)
MariaDB [(none)]>
Para entender el concepto vamos a analizar un par de ejemplos y ver que sucede con los archivos, para ello dentro de una base cualquiera vamos a crear unas nuevas tablas, primero ejecutemos el siguiente comando:
MariaDB [base3]> create table t1 (
-> col int NOT NULL PRIMARY KEY)
-> engine = InnoDB;
Con esto creamos la primera tabla, pasemos a desactivar al metodo:
MariaDB [base3]> set @@global.innodb_file_per_table = OFF;
Ahora vamos a crear una nueva tabla mediante el siguiente comando:
MariaDB [base3]> create table t2 (
-> col int NOT NULL PRIMARY KEY)
-> engine = innodb;
Ahora volvemos a activar el metodo:
MariaDB [base3]> set @@global.innodb_file_per_table = ON;
Y volvemos a crear una nueva tabla:
MariaDB [base3]> create table t3 (
-> col int NOT NULL PRIMARY KEY)
-> engine = innodb;
Con nuestras tres tablas nuevas creadas vamos a ver si se crearon los archivos de ibd:
Nota: Sino saben donde esta el directorio de datos pueden usar el archivo de configuracion y ver el path en la variable datadir.
tinchicus@dbn001vrt:~$ sudo ls -l /var/lib/mysql/base3/
total 308
-rw-rw---- 1 mysql mysql 67 jun 4 19:12 db.opt
-rw-rw---- 1 mysql mysql 923 sep 6 03:19 t1.frm
-rw-rw---- 1 mysql mysql 98304 sep 6 03:19 t1.ibd
-rw-rw---- 1 mysql mysql 923 sep 6 03:23 t2.frm
-rw-rw---- 1 mysql mysql 923 sep 6 03:29 t3.frm
-rw-rw---- 1 mysql mysql 98304 sep 6 03:29 t3.ibd
tinchicus@dbn001vrt:~$
Observen como tenemos los archivos con la extension .ibd para cuando habilitamos al metodo y en la tabla que no lo utilizamos no se genero el archivo, veamos la descripcion de las extensiones de los archivos en el directorio:
- .opt, el archivo de opciones de la base de datos
- .frm, contiene todas las definiciones de las tablas no importa el motor utilizado
- .ibd, solo un espacio de tabla
Por ultimo en el post anterior mencionamos que existen dos formatos para los archivos de InnoDB, el original llamado Antilope y Barracude que es el formato mas nuevo, el primero solo soporta dos formatos:
- COMPACT
- REDUNDANT
En cambio el segundo no solamente soporta estos dos formatos sino que tambien soporta los siguientes:
- DYNAMIC
- COMPRESSED
Por esta razon se desecho el primero y se utiliza el segundo, aunque por un tema de compatibilidad se sigue manteniendo a ambos formatos pero tengan en cuenta que Antilope solo funcionara como predeterminado en versiones anteriores 10.2.2 de mariadb y en la version 5.5 de mysql, por ultimo para obtener mas informacion sobre el formato y algunos datos mas podemos hacer un query sobre la tabla INNODB_SYS_TABLES e INNODB_SYS_TABLESPACES de la base information_schema, en ambos casos tenemos una columna llamada Row Format la cual nos informara el tipo de formato.
En resumne, hoy hemos visto al metodo llamado mddo archivo por tabla, que es, para que sirve, como se implementa, como trabajaba anteriormente y como lo hace ahora, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
