Anuncios

Bienvenidos sean a este post, hoy veremos una forma de almacenar nuestras tablas en el disco.

Anuncios

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)
Anuncios
Nota: 
En versiones anteriores mariadb solo usaba el espacio de tabla llamado espacio de tabla del sistema
Anuncios
Anuncios

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:~$
Anuncios

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;
Anuncios

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)]>
Anuncios

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;
Anuncios

Con esto creamos la primera tabla, pasemos a desactivar al metodo:

MariaDB [base3]> set @@global.innodb_file_per_table = OFF;
Anuncios

Ahora vamos a crear una nueva tabla mediante el siguiente comando:

MariaDB [base3]> create table t2 (
    -> col int NOT NULL PRIMARY KEY)
    -> engine = innodb;
Anuncios

Ahora volvemos a activar el metodo:

MariaDB [base3]> set @@global.innodb_file_per_table = ON;
Anuncios

Y volvemos a crear una nueva tabla:

MariaDB [base3]> create table t3 (
    -> col int NOT NULL PRIMARY KEY)
    -> engine = innodb;
Anuncios

Con nuestras tres tablas nuevas creadas vamos a ver si se crearon los archivos de ibd:

Anuncios
Nota: 
Sino saben donde esta el directorio de datos pueden usar el archivo de configuracion y ver el path en la variable datadir.
Anuncios
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:~$
Anuncios

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
Anuncios

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
Anuncios

En cambio el segundo no solamente soporta estos dos formatos sino que tambien soporta los siguientes:

  • DYNAMIC
  • COMPRESSED
Anuncios
Anuncios

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.

Anuncios

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.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50

Anuncio publicitario