TooManySecrets HeadQuarters
MySQL%3A crear nuevos datafiles IBDATA repartidos.

Es probable que en alguna ocasión hayais tenido una base de datos mysql con tablas InnoDB y, por una u otra razón, hayais deseado que el fichero IBDATAx (donde “x” suele ser 1) se pudiese particionar y/o repartir no ya en otros directorios, sino en otros discos (mejora importante del IO, algo que pueden hacer sin pestañear oracle o postgresql, por citar dos).
Particionar no se puede (ententiéndose como tal, el repartir la carga/contenido del fichero IBDATAx entre varios de ellos de forma aleatoria). Lo que si se pueden hacer son varias cosas:
- crear al inicio de creación de la BD varios ficheros IBDATAx con tamaño fijo, y conforme los vaya “rellenando” que vaya automáticamente usando los otros.
- hacer un backup y, posterior al paso anterior, restaurar el contenido.
- migrar el tipo de tabla a otro, para borrar los ficheros innodb y volver a recrearlos posteriormente pero basándose en una configuración como la del primer punto.
- etc, etc, etc.
Evidentemente, todas las opciones anteriores tienen los fallos de tener una fiabilidad muy por debajo de lo recomendable en un entorno en producción.
Luego también está la opción de crear un fichero por tabla, bastante útil por el hecho de poder recuperar espacio en disco rapidamente si borras alguna tabla.

En cualquier caso, voy a presentar el siguiente escenario:
- una BD con tablas en innodb que están ocupando mucho espacio (pongamos simplemente que necesitais, bien restaurar la BD en otra máquina con otro disco duro más grande, o copiar los ficheros mysql en otro disco más grande dentro de la misma máquina).
- queremos poner un segundo disco donde continue almacenándose la BD, y aprovechar la división de IO entre dos discos para mejorar el rendimiento. De esta forma (como acabo de mencionar) se pretende repartir la carga entre dos discos, de manera que en el fichero IBDATA1 (el original) pueda haber algún movimiento, pero básicamente sería de lectura, y en el nuevo IBDATA2 se vayan produciendo los nuevos INSERTS y SELECTS sobre ellos.

¿Cómo hago esto?

Partiendo de una configuración inicial:

innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:10M:autoextend

Y suponiendo que el fichero “ibdata1” ha crecido hasta los 700 Gb, tenemos que hacer que:
a) no crezca más.
b) crear otro datafile/tablespace IBDATA en otro disco que tenemos (montado en /disk2), para que continue ahí su “crecimiento”, y además pondremos el datafile con un auto-crecimiento de 50 Mb.
Para ello, pararemos el servicio mysql, y editaremos el fichero /etc/my.cnf, modificando las líneas anteriores referentes a “innodb” de la siguiente forma:


innodb_data_home_dir =
innodb_data_file_path = /var/lib/mysql/ibdata1:700G;/disk2/ibdata2:50M:autoextend

La primera línea sigue igual. La segunda línea es donde está lo interesante:
- le indicamos primero que el anterior fichero “ibdata2” quede tal y como está, no crezca más, y
- a continuación le indicamos que hay otro fichero IBDATA, y dónde está ubicado y su nombre, así como también que es de crecimiento automático cada 50 Mb.

En el sitio http://dev.mysql.com/ podreis encontrar más información relativa a la creación de un datafile por tabla (comentado al principio), así como otras muy interesantes.

Have a nice day ;-)
TooManySecrets

Blog comments powered by Disqus