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
ibdata1
no se está reduciendo es una característica particularmente molesta de MySQL. Elibdata1
archivo 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
ibdata1
no 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.cnf
para 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:mysqldump
de todas las bases de datos, procedimientos, disparadores, etc., excepto las bases de datosmysql
yperformance_schema
ibdata1
yib_log
archivosCuando inicie MySQL en el paso 5 , se volverán a crear los archivos
ibdata1
yib_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=innodb
oOPTIMIZE 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_schema
eso, 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_schema
es 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_table
por 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.sql
DROP DATABASE [database_name];
sudo /etc/init.d/mysqld stop
sudo rm /var/lib/mysql/ibdata1
sudo rm /var/lib/mysql/ib_logfile
(y elimine cualquier otro ib_logfile que pueda nombrarseib_logfile0
,ib_logfile1
etc.)sudo /etc/init.d/mysqld start
create database [database_name];
mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql
Advertencia: 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-p
sin 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.sh
y ejecutar comoroot
.Excluye
mysql
,information_schema
,performance_schema
(ybinlog
directorio).Asume que tiene credenciales de administrador
/root/.my.cnf
y que su base de datos vive en el/var/lib/mysql
directorio predeterminado .También puede purgar registros binarios después de ejecutar este script para recuperar más espacio en disco con:
fuente
alldatabases.sql
antes de verificar si todas las tablas están en buen estado. En cuanto a algunas mejoras: configurarinnodb_fast_shutdown=0
antes de apagar, configurarautocommit=0
antes de importar el archivo SQL, ejecutarCOMMIT
y configurarautocommit=1
después de importar el archivo SQL, usarmysqlcheck --all-databases
antes 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
.