web-dev-qa-db-fra.com

Emplacement de la table temporaire InnoDB

J'ai une table InnoDB occupée qui dilate et se contracte régulièrement en taille sur une base quotidienne en fonction de la charge de lui. En règle générale, nous verrions la table croître à 80Go taille (50/50 données et index), puis rétrécir à environ 30GB. Malheureusement, InnoDB ne aime pas libérer de l'espace, il ne l'utilise plus ce qui ne présage rien de bon pour notre SSD de 120 Go.

En règle générale, un optimize (ou Recréer pour les tables InnoDB) nous donnerait un peu plus d'espace de respiration. Mais parfois, il n'y a pas assez de place pour la table temporaire à créer.

En dépit de la fixation d'un emplacement différent pour la variable de table temporaire dans la my.cnf, la base de données InnoDB insiste encore dans la création de tables temporaires dans ce répertoire de données, dans le dossier de base de données. Est-il possible que je peux pointer MySQL vers un autre lecteur lors de la création de tables InnoDB temporaires?

Je suis sûr que cela ferait plus de mal que de bien, mais il a été suggéré ici que nous pourrions potentiellement créer un lien symbolique pour la base de données sur un disque plus gros, puis les tables des liens symboliques au SSD. De cette façon, toutes les opérations standard se déroulera sur les tâches de maintenance beaucoup plus rapide SSD et de routine se déroulera sur le plus grand, conduire plus lentement.

EDIT: Je dois préciser. innodb_file_per_table est réglé et est donc tmpdir (à disque plus gros), mais tmpdir semble ne rien faire pour moi.

4
MrNorm

Symlinking Innodb n'est définitivement pas une bonne idée de maintenance régulière d'innoDB.

J'ai écrit des messages sur pourquoi ne pas faire cela:

Cependant, si cela est strictement dans le but de rétrécir une grande table, je suppose que vous pouvez symboliser l'ensemble du répertoire de données où la table TEMP est à partir, mais vous devrez scripter personnellement le retrait.

Par exemple

  • Supposons que la table soit rétrécie est mydata.mytable
  • datsdir est /var/lib/mysql

Votre procédure serait

Étape 01 : Vous devez créer une base de données appelée mydatatemp. Ne mettez aucune donnée dedans à ce jour.

Étape 02 : Déplacez le /var/lib/mysql/mydatatemp sur un autre disque.

Étape 03 : Créez un Symlink /var/lib/mysql/mydatatemp sur le dossier sur l'autre disque

Étape 04 : chown -R mysql:mysql Contactez le dossier externe et contre le lien symbolique.

Étape 05 : Effectuez maintenant la rétrécissement des données comme suit:

CREATE TABLE mydatatemp.mytable LIKE mydata.mytable;
INSERT INTO mydatatemp.mytable SELECT * FROM mydata.mytable;
DROP TABLE mydata.mytable;
ALTER TABLE mydatatemp.mytable RENAME mydata.mytable;

Pour récapituler, procédez comme suit (en supposant /tmpdata est le disque externe)

Étapes 01-04

chown mysql:mysql /tmpdata
ln -s /tmpdata /var/lib/mysql/mydatatemp
chown -R mysql:mysql /var/lib/mysql/mydatatemp

puis exécutez l'étape 05

CAVEAT

Ce serait plutôt élevé, mais cela devrait fonctionner. Veuillez tester cela avec une table vide d'abord comme ceci:

USE mydatatemp
CREATE TABLE mrnorm (id int not null, name varchar(20) primary key (id));
INSERT INTO mrnorm (name) VALUES ('one'),('two'),('three');
SELECT * FROM mrnorm;

Si ces commandes SQL fonctionnaient, allez au système d'exploitation et faites ceci:

cd /tmpdata
ls -l

Vous devriez voir deux fichiers:

  • mrnorm.frm
  • mrnorm.ibd

En outre, testez si MRNorm peut être déplacé

CREATE DATABASE helloworld;
ALTER TABLE mydatatemp.mrnorm RENAME helloworld.mrnorm;

Aller au système d'exploitation et courir

cd /tmpdata
ls -l

La table devrait être partie. Maintenant, faites ceci:

cd /var/lib/mysql/helloworld
ls -l

La table devrait être là

Fin de test

N'oubliez pas que la renommée de la table serait essentiellement une copie contrôlée de la table d'un disque à un autre disque avec un ajustement correct de la section Dictionnaire de données de l'espace de table du système dans ibdata1. Cela pourrait prendre du temps.

2
RolandoMySQLDBA