J'utilise MySQL dans localhost comme un "outil de requête" pour effectuer des statistiques dans R, c'est-à-dire que chaque fois que j'exécute un script R, je crée une nouvelle base de données (A), crée une nouvelle table (B), importe les données dans B , soumettre une requête pour obtenir ce dont j'ai besoin, puis je laisse tomber B et je laisse tomber A.
Cela fonctionne bien pour moi, mais je me rends compte que la taille du fichier ibdata augmente rapidement, je n'ai rien stocké dans MySQL, mais le fichier ibdata1 dépassait déjà 100 Mo.
J'utilise plus ou moins le paramètre MySQL par défaut pour la configuration, est-il possible de réduire / purger automatiquement le fichier ibdata1 après une période de temps fixe?
Réponses:
Cela
ibdata1
ne rétrécit pas est une fonctionnalité particulièrement ennuyeuse de MySQL. Leibdata1
fichier ne peut en fait être réduit que si vous supprimez toutes les bases de données, supprimez les fichiers et rechargez un vidage.Mais vous pouvez configurer MySQL pour que chaque table, y compris ses index, soit stockée dans un fichier distinct. De cette façon
ibdata1
, ne grandira pas autant. Selon le commentaire de Bill Karwin, cela est activé par défaut à partir de la version 5.6.6 de MySQL.Il y a quelque temps, je l'ai fait. Cependant, pour configurer votre serveur pour utiliser des fichiers distincts pour chaque table, vous devez modifier
my.cnf
afin d'activer ceci:http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html
Comme vous voulez récupérer de l'espace,
ibdata1
vous devez supprimer le fichier:mysqldump
de toutes les bases de données, procédures, déclencheurs, etc., à l'exception des bases de donnéesmysql
etperformance_schema
ibdata1
etib_log
fichiersLorsque vous démarrez MySQL à l'étape 5, les fichiers
ibdata1
etib_log
seront recréés.Vous êtes maintenant prêt à partir. Lorsque vous créez une nouvelle base de données pour analyse, les tables seront situées dans des
ibd*
fichiers séparés , pas dansibdata1
. Comme vous déposez généralement la base de données peu de temps après, lesibd*
fichiers seront supprimés.http://dev.mysql.com/doc/refman/5.1/en/drop-database.html
Vous l'avez probablement vu:
http://bugs.mysql.com/bug.php?id=1341
En utilisant la commande
ALTER TABLE <tablename> ENGINE=innodb
ouOPTIMIZE TABLE <tablename>
on peut extraire les données et les pages d'index d'ibdata1 pour séparer les fichiers. Cependant, ibdata1 ne rétrécira que si vous effectuez les étapes ci-dessus.En ce
information_schema
qui concerne le , ce n'est pas nécessaire ni possible de laisser tomber. Il s'agit en fait d'un tas de vues en lecture seule, pas de tableaux. Et aucun fichier ne leur est associé, pas même un répertoire de base de données. Leinformations_schema
utilise le moteur db de mémoire et est supprimé et régénéré lors de l'arrêt / redémarrage de mysqld. Voir https://dev.mysql.com/doc/refman/5.7/en/information-schema.html .la source
innodb_file_per_table
par défaut.Ajoutant à la réponse de John P ,
Pour un système Linux, les étapes 1 à 6 peuvent être accomplies avec ces commandes:
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
(et supprimez tout autre ib_logfile qui pourrait être nomméib_logfile0
,ib_logfile1
etc ...)sudo /etc/init.d/mysqld start
create database [database_name];
mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql
Attention: ces instructions vous feront perdre d'autres bases de données si vous avez d'autres bases de données sur cette instance mysql. Assurez-vous que les étapes 1, 2 et 6, 7 sont modifiées pour couvrir toutes les bases de données que vous souhaitez conserver.
la source
create database database_name;
, puisgrant all privileges on database_name.* to 'username'@'localhost' identified by 'password';
Password:
invite (ce qui est une pratique plus sûre), il suffit de le mettre-p
sans mot de passe réel.Lorsque vous supprimez des tables innodb, MySQL ne libère pas l'espace à l'intérieur du fichier ibdata, c'est pourquoi il continue de croître. Ces fichiers ne diminuent presque jamais.
Comment réduire un fichier ibdata existant:
http://dev.mysql.com/doc/refman/5.5/en/innodb-resize-system-tablespace.html
Vous pouvez créer un script et planifier l'exécution du script après une période de temps fixe, mais pour la configuration décrite ci-dessus, il semble que plusieurs espaces disque logiques soient une solution plus simple.
Si vous utilisez l'option de configuration
innodb_file_per_table
, vous créez plusieurs espaces de table. Autrement dit, MySQL crée des fichiers séparés pour chaque table au lieu d'un fichier partagé. Ces fichiers séparés sont stockés dans le répertoire de la base de données et ils sont supprimés lorsque vous supprimez cette base de données. Cela devrait supprimer la nécessité de réduire / purger les fichiers ibdata dans votre cas.Plus d'informations sur plusieurs espaces de table:
http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html
la source
Je pense que vous pouvez y trouver de bonnes explications et solutions:
http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/
la source
Scripté rapidement la procédure de réponse acceptée dans bash:
Enregistrez sous
purge_binlogs.sh
et exécutez sousroot
.A l' exclusion
mysql
,information_schema
,performance_schema
(etbinlog
répertoire).Suppose que vous possédez des informations d'identification d'administrateur
/root/.my.cnf
et que votre base de données réside dans le/var/lib/mysql
répertoire par défaut .Vous pouvez également purger les journaux binaires après avoir exécuté ce script pour regagner plus d'espace disque avec:
la source
alldatabases.sql
avant de vérifier si toutes les tables sont saines. En ce qui concerne certaines améliorations: définirinnodb_fast_shutdown=0
avant l'arrêt, définirautocommit=0
avant d'importer le fichier SQL, exécuterCOMMIT
et définirautocommit=1
après l'importation du fichier SQL, utilisermysqlcheck --all-databases
avant de supprimer la sauvegarde.Si votre objectif est de surveiller l'espace libre de MySQL et que vous ne pouvez pas empêcher MySQL de réduire votre fichier ibdata, alors obtenez-le via les commandes d'état de la table. Exemple:
MySQL> 5.1.24:
MySQL <5.1.24:
Comparez ensuite cette valeur à votre fichier ibdata:
Source: http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html
la source
Dans une nouvelle version des recettes de mysql-server ci-dessus écrasera la base de données "mysql". Dans l'ancienne version, cela fonctionne. Dans de nouvelles tables, certains commutent vers le type de table INNODB et, ce faisant, vous les endommagerez. Le moyen le plus simple consiste à:
la source
Comme déjà indiqué, vous ne pouvez pas réduire ibdata1 (pour ce faire, vous devez vider et reconstruire), mais il n'y a souvent pas vraiment de besoin.
L'utilisation de l'extension automatique (probablement le paramètre de taille le plus courant) ibdata1 préalloue le stockage, augmentant chaque fois qu'il est presque plein. Cela accélère les écritures car l'espace est déjà alloué.
Lorsque vous supprimez des données, elles ne diminuent pas, mais l'espace à l'intérieur du fichier est marqué comme inutilisé. Maintenant, lorsque vous insérez de nouvelles données, il réutilisera l'espace vide dans le fichier avant de l'agrandir davantage.
Donc, cela ne continuera de croître que si vous avez réellement besoin de ces données. À moins que vous n'ayez réellement besoin d'espace pour une autre application, il n'y a probablement aucune raison de la réduire.
la source
storage leak
.