web-dev-qa-db-fra.com

Usage et recommandations Ibdata?

J'ai un serveur de production

Le 5 novembre 2011, la taille Ibdata était de 100g. En environ 3 mois, il est augmenté à 200g.so il vient de doubler sa taille.So C'est une énorme donnée.

J'ai approximativement toutes les tables avec Innodb.Je n'utilise pas d'innoDB par table. J'ai mes idbata sur lvm.so combien je devrais l'augmenter pour une utilisation future ..?

Ou tout autre meilleur moyen de gérer le scénario.

5
Abdul Manaf

Vous devez arrêter d'utiliser innoDB (avec innodb_file_per_ttable OFF) et des instantanés LVM dès que possible. Voici pourquoi:

J'ai un système de surveillance qui utilise MySQL comme base de données. Il a également innodb_file_per_ttable. Dans un espace de 6 mois, il a augmenté de 1,3 To.

La société de mon employeur ne peut avoir de temps d'arrêt pour ce système de surveillance.

J'ai tenté de créer un esclave pour cette base de données Monster. J'ai couru un RSYNC de/var/lib/mysql sur le serveur esclave. Son premier passage a pris 42 heures (ce n'est pas une faute de frappe, 1 jour 18 heures). Le deuxième passage a pris 84 heures (3 jours 12 heures) et seulement 15% (220 Go copiés). Comme vous pouvez le constater, j'ai abandonné le deuxième RSYNC.

Le problème découle de ibdata1 étant 1.3TB.

Qu'est-ce qui est à l'intérieur ibdata1 quand innodb_file_per_table est désactivé?

  • Pages de données de table
  • Pages d'index de table
  • Métadonnées de table (gestion des espaces de table)
  • Données MVCC (pour l'isolement des transactions, la conformité acide)

Dans un environnement lourde en écriture, tous les enregistrements de ces quatre types sont en cours de lecture et/ou écrits. Le RSYNC a connu un cauchemar qui tente d'obtenir suffisamment l'Ibdata1 Coalescée pour écrire des modifications sur le serveur esclave. Selon mes homologues d'ingénieur Linux senior, un instantané LVM ne tiendrait plus mieux.

Votre seul recours est de commencer à utiliser innodb_file_per_table.

Pour que vous puissiez voir cela besoin plus loin, veuillez exécuter cette requête (devrait prendre 5-10 min pour vous)

SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM
(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM
information_schema.tables WHERE table_schema NOT IN
('mysql','information_schema','performance_schema') AND
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;

Utilisation des totaux pour Innodb, comparez-la à la taille d'Ibdata1. Vous constaterez qu'il peut y avoir une différence de 30 Go de moins. J'ai couru que la requête contre Ibdata1 dans mon système de surveillance et n'avait que 27 Go pour les métadonnées de table et les nouvelles informations MVCC. La croissance constante se produirait toujours sur ce fichier.

Voici ce que vous pouvez faire: Convertir tout votre innodb pour utiliser innodb_file_per_table. J'ai écrit un post dans Stackoverflow sur la façon de faire cela . Non seulement vous serez en mesure d'avoir une table Easch exister dans un fichier séparé, vous pourrez conserver un taux de croissance ibdata1 jusqu'à un minimum.

MISE À JOUR 2012-02-22 13:00 HNE

Lors de l'exécution du nettoyage d'InnoDB, assurez-vous d'éliminer la prise de fichiers ibdata multiples. Votre paramètre devrait être la valeur par défaut:

[mysqld]
innodb_data_file_path=ibdata1:10M:autoextend
6
RolandoMySQLDBA

En plus de ce que Rolando a déclaré, passer à la configuration par fichier peut vous permettre de reprendre un espace disque grâce à une maintenance périodique.

Optimiser la table ne fait pas grand chose pour vous avec tout dans un seul fichier ibdata. Cependant, dans une configuration par fichier, vous pouvez souvent retrouver un espace espace disque en faisant cela. L'optimisation de la table reconstituera efficacement la totalité de la table, éliminant ainsi l'espace inutilisé laissé de la fragmentation pendant les suppressions.

Vous pouvez voir quelles tables bénéficieront de ceci en exécutant l'état de la table Afficher. Alternativement courir

select table_name, data_length, data_free from information_schema.tables
where engine='innodb' order by 3

Optimiser les tables avec le plus de données_FREE vous donnera la plus grande économie dans l'espace disque.

Cependant, il y a des mises en garde:

  • Chaque table sera entièrement verrouillée pendant l'optimisation. Si une table individuelle est de 10 à 100 points de concerts, cela ne sera pas rapide
  • Vous ne devriez pas vous attendre à ce que les données_free tombent complètement à 0 après une optimisation. Il y aura toujours un peu de place inutilisé en raison du chemin InnoDB allouant de l'espace dans des pages de 16 km.
2
atxdba