Mysql – Reducir fichero ibdata1 en multiples tablespaces

con No hay comentarios

Si tenemos un servidor configurado para que haga uso del espacio de tablas compartidos ibdata1 y lo queremos pasar a que use un espacio de tablas individual *.ibd, no podemos habilitar directamente la opción innodb_file_per_table (podemos, pero no se reduciría el ibdata1 por lo que no nos interesa).

 

Los pasos para poder desechar totalmente la configuración de un ibdata1 y usar ficheros individuales *.ibd son:

Sacar las bbdd Innodb (Solo para Mysql5):

Ponemos un wait_timeout=2000 por si acaso.

Paramos procesos web y de correo, porque el comandito siguiente se come la RAM.

# mysql -uadmin -p$(cat /etc/psa/.psa.shadow) -s -N INFORMATION_SCHEMA -e “SELECT CONCAT(table_schema,’.’,table_name) FROM TABLES WHERE engine = ‘innodb’;” > /root/tablas_InnoDB.txt

Las tablas InnoDB no es necesario reparalas ni optimizarlas. Las tablas InnoDB se recuperan bien de las roturas. MySQL analizará los ficheros de log para asegurar que los datos están limpios así que no es necesario repararlas.

# mkdir dumps_InnoDB

# cd dumps_InnoDB/

 

Creamos un dump por cada tabla:

# for i in `cat /root/tablas_InnoDB.txt`; do bbdd=`echo $i|cut -d. -f1`;tabla=`echo $i|cut -d. -f2`;mysqldump -uadmin -p$(cat /etc/psa/.psa.shadow) $bbdd $tabla > $i; done

 

Si alguna tabla tiene espacios en el nombre (muy listos), la eliminamos del fichero /root/tablas_InnoDB.txt, le hacemos un backup individual a la bbdd y la restauramos al final del proceso

 

Paramos MySQL

Añadir innodb_file_per_table a my.conf

DEBEMOS COMENTAR LA LÍNEA “innodb_data_file_path=ibdata1:10M:autoextend”, es incompatible con el fichero por tabla.

Renombrar los ficheros ibdata1, ibd_log0 y ibd_log1

 

Borramos los frm y los ibd que existan:

# for i in `cat /root/tablas_InnoDB.txt`; do bbdd=`echo $i|cut -d. -f1`;tabla=`echo $i|cut -d. -f2`;rm -f /var/lib/mysql/$bbdd/$tabla.frm /var/lib/mysql/$bbdd/$tabla.ibd; done

 

Arrancar Mysql

Creamos y Copiamos un frm válido:

create database oscarin;

use oscarin;

CREATE TABLE `MiTabla` (`test` int(11)) ENGINE=InnoDB;

 

# for i in `cat /root/tablas_InnoDB.txt`; do bbdd=`echo $i|cut -d. -f1`;tabla=`echo $i|cut -d. -f2`;cp -p /var/lib/mysql/oscarin/MiTabla.frm /var/lib/mysql/$bbdd/$tabla.frm; done

 

Restaurar las tablas InnoDB:

# for i in `cat /root/tablas_InnoDB.txt`; do bbdd=`echo $i|cut -d. -f1`;tabla=`echo $i|cut -d. -f2`;mysql -uadmin -p$(cat /etc/psa/.psa.shadow) $bbdd < $i; done

 

Pintará errores en el log del siguiente tipo, pero no preocuparse, pues se recrea bien la tabla.:

130302 0:24:42 InnoDB: Error: table `zaragoza/meses` does not exist in the InnoDB internal

InnoDB: data dictionary though MySQL is trying to drop it.

InnoDB: Have you copied the .frm file of the table to the

InnoDB: MySQL database directory from another database?

 

mysql ibdata shared tablespace percona cluster 5.5 innodb mysam

Dejar un comentario