Estoy usando MySQL en localhost como una "herramienta de consulta" para realizar estadísticas en R, es decir, cada vez que ejecuto un script R, creo una nueva base de datos (A), creo una nueva tabla (B), importo los datos a B , enviar una consulta para obtener lo que necesito, y luego soltar B y soltar A.
Me está funcionando bien, pero me doy cuenta de que el tamaño del archivo ibdata está aumentando rápidamente, no almacené nada en MySQL, pero el archivo ibdata1 ya excedió los 100 MB.
Estoy usando más o menos la configuración predeterminada de MySQL para la configuración, ¿hay alguna manera de que pueda reducir / purgar automáticamente el archivo ibdata1 después de un período de tiempo fijo?

Respuestas:
Eso
ibdata1no se está reduciendo es una característica particularmente molesta de MySQL. Elibdata1archivo no puede reducirse a menos que elimine todas las bases de datos, elimine los archivos y vuelva a cargar un volcado.Pero puede configurar MySQL para que cada tabla, incluidos sus índices, se almacene como un archivo separado. De esa manera
ibdata1no crecerá tanto. Según el comentario de Bill Karwin, esto está habilitado de forma predeterminada a partir de la versión 5.6.6 de MySQL.Hace un tiempo hice esto. Sin embargo, para configurar su servidor para usar archivos separados para cada tabla, necesita cambiar
my.cnfpara habilitar esto:http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html
Como desea recuperar el espacio
ibdata1, debe eliminar el archivo:mysqldumpde todas las bases de datos, procedimientos, disparadores, etc., excepto las bases de datosmysqlyperformance_schemaibdata1yib_logarchivosCuando inicie MySQL en el paso 5 , se volverán a crear los archivos
ibdata1yib_log.Ahora estás listo para ir. Cuando crea una nueva base de datos para análisis, las tablas se ubicarán en
ibd*archivos separados , no enibdata1. Como suele soltar la base de datos poco después, losibd*archivos se eliminarán.http://dev.mysql.com/doc/refman/5.1/en/drop-database.html
Probablemente has visto esto:
http://bugs.mysql.com/bug.php?id=1341
Al usar el comando
ALTER TABLE <tablename> ENGINE=innodboOPTIMIZE TABLE <tablename>uno puede extraer datos e páginas de índice de ibdata1 para separar archivos. Sin embargo, ibdata1 no se reducirá a menos que realice los pasos anteriores.En cuanto a
information_schemaeso, eso no es necesario ni posible abandonar. De hecho, es solo un montón de vistas de solo lectura, no tablas. Y no hay archivos asociados con ellos, ni siquiera un directorio de base de datos. Elinformations_schemaes el uso de la memoria db-motor y se deja caer y regenerados en parada / reinicio de mysqld. Ver https://dev.mysql.com/doc/refman/5.7/en/information-schema.html .fuente
innodb_file_per_tablepor defecto.Agregando a la respuesta de John P ,
Para un sistema Linux, los pasos 1-6 se pueden lograr con estos comandos:
mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sqlDROP DATABASE [database_name];sudo /etc/init.d/mysqld stopsudo rm /var/lib/mysql/ibdata1sudo rm /var/lib/mysql/ib_logfile(y elimine cualquier otro ib_logfile que pueda nombrarseib_logfile0,ib_logfile1etc.)sudo /etc/init.d/mysqld startcreate database [database_name];mysql -u [username]-p[root_password] [database_name] < dumpfilename.sqlAdvertencia: estas instrucciones harán que pierda otras bases de datos si tiene otras bases de datos en esta instancia de mysql. Asegúrese de que los pasos 1,2 y 6,7 se modifiquen para cubrir todas las bases de datos que desea conservar.
fuente
create database database_name;y luegogrant all privileges on database_name.* to 'username'@'localhost' identified by 'password';Password:indicador (que es una práctica más segura), simplemente colóquela-psin ninguna contraseña real.Cuando elimina las tablas innodb, MySQL no libera el espacio dentro del archivo ibdata, es por eso que sigue creciendo. Estos archivos casi nunca se reducen.
Cómo reducir un archivo ibdata existente:
http://dev.mysql.com/doc/refman/5.5/en/innodb-resize-system-tablespace.html
Puede hacer un script para esto y programar el script para que se ejecute después de un período de tiempo fijo, pero para la configuración descrita anteriormente parece que múltiples espacios de tabla son una solución más fácil.
Si usa la opción de configuración
innodb_file_per_table, crea múltiples espacios de tabla. Es decir, MySQL crea archivos separados para cada tabla en lugar de un archivo compartido. Estos archivos separados se almacenan en el directorio de la base de datos y se eliminan cuando elimina esta base de datos. Esto debería eliminar la necesidad de reducir / purgar archivos ibdata en su caso.Más información sobre múltiples espacios de tabla:
http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html
fuente
Creo que puede encontrar una buena explicación y solución allí:
http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/
fuente
Rápidamente escribió el procedimiento de respuesta aceptado en bash:
Guardar como
purge_binlogs.shy ejecutar comoroot.Excluye
mysql,information_schema,performance_schema(ybinlogdirectorio).Asume que tiene credenciales de administrador
/root/.my.cnfy que su base de datos vive en el/var/lib/mysqldirectorio predeterminado .También puede purgar registros binarios después de ejecutar este script para recuperar más espacio en disco con:
fuente
alldatabases.sqlantes de verificar si todas las tablas están en buen estado. En cuanto a algunas mejoras: configurarinnodb_fast_shutdown=0antes de apagar, configurarautocommit=0antes de importar el archivo SQL, ejecutarCOMMITy configurarautocommit=1después de importar el archivo SQL, usarmysqlcheck --all-databasesantes de eliminar la copia de seguridad.Si su objetivo es monitorear el espacio libre de MySQL y no puede evitar que MySQL reduzca su archivo ibdata, hágalo mediante comandos de estado de la tabla. Ejemplo:
MySQL> 5.1.24:
MySQL <5.1.24:
Luego compare este valor con su archivo ibdata:
Fuente: http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html
fuente
En una nueva versión de mysql-server, las recetas anteriores destruirán la base de datos "mysql". En la versión anterior funciona. En las nuevas tablas, algunas tablas cambian al tipo de tabla INNODB, y al hacerlo las dañará. La forma más fácil es:
fuente
Como ya se señaló, no puede reducir ibdata1 (para hacerlo, debe volcar y reconstruir), pero a menudo tampoco es necesario.
Usando autoextend (probablemente la configuración de tamaño más común) ibdata1 preasigna el almacenamiento, creciendo cada vez que está casi lleno. Eso hace que las escrituras sean más rápidas ya que el espacio ya está asignado.
Cuando elimina datos, no se reduce, pero el espacio dentro del archivo se marca como no utilizado. Ahora, cuando inserte datos nuevos, reutilizará el espacio vacío en el archivo antes de seguir creciendo.
Por lo tanto, solo seguirá creciendo si realmente necesita esos datos. A menos que realmente necesite el espacio para otra aplicación, probablemente no haya razón para reducirlo.
fuente
storage leak.