Réparez toutes les tables en une seule fois


112

Comment vérifier toutes les tables de la base de données en une seule fois?

Plutôt que de taper la requête check table ''tablename'';pour toutes les tables une par une.

Y a-t-il une commande simple comme ça check allou quelque chose comme ça?

Réponses:



108

La commande est la suivante:

mysqlcheck -u root -p --auto-repair --check --all-databases

Vous devez fournir le mot de passe lorsque vous y êtes invité,

ou vous pouvez exécuter celui-ci mais ce n'est pas recommandé car le mot de passe est écrit en texte clair:

mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases

7
mysqlcheck -u root -p --auto-repair --check --optimize --all-databases Erreur: mysqlcheck ne prend pas en charge plusieurs commandes contradictoires
Alekc

11
Si vous obtenez l'erreur de commande contradictoire, supprimez l'option --optimize.
Sarcastron

Je suppose que vous devez utiliser une et une seule de ces options: réparation automatique, vérification ou optimisation. J'ai utilisé la réparation automatique uniquement et j'ai travaillé
Packet Tracer

J'ai essayé ce que vous avez dit mais j'obtiens: mysqlcheck: Erreur obtenue: 1045: Accès refusé pour l'utilisateur 'root' @ 'localhost' (en utilisant le mot de passe: OUI) lors de la tentative de connexion et je sais que j'utilise le mot de passe correct.
Doug

24

Utilisez la requête suivante pour imprimer des REPAIRinstructions SQL pour toutes les tables d'une base de données:

select concat('REPAIR TABLE ', table_name, ';') from information_schema.tables 
where table_schema='mydatabase'; 

Après cela, copiez toutes les requêtes et exécutez-les mydatabase.

Remarque: remplacez mydatabasepar le nom de base de données souhaité


9

Pas besoin de taper le mot de passe, utilisez simplement l'une de ces commandes (explicite):

mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize

8

La commande suivante a fonctionné pour moi en utilisant l'invite de commande (en tant qu'administrateur) dans Windows:

mysqlcheck -u root -p -A --auto-repair

Exécutez mysqlcheck avec l'utilisateur root, demandez un mot de passe, vérifiez toutes les bases de données et réparez automatiquement les tables corrompues.


3

Il n'y a pas de commande par défaut pour ce faire, mais vous pouvez créer une procédure pour faire le travail. Il parcourt les lignes de information_schemaet appelle REPAIR TABLE 'tablename';chaque ligne. CHECK TABLEn'est pas encore pris en charge pour les instructions préparées. Voici l'exemple (remplacez MYDATABASE par le nom de votre base de données):

CREATE DEFINER = 'root'@'localhost'
PROCEDURE MYDATABASE.repair_all()
BEGIN
  DECLARE endloop INT DEFAULT 0;
  DECLARE tableName char(100);
  DECLARE rCursor CURSOR FOR SELECT `TABLE_NAME` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA`=DATABASE();
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET endloop=1;

  OPEN rCursor;
  FETCH rCursor INTO tableName;

  WHILE endloop = 0 DO
    SET @sql = CONCAT("REPAIR TABLE `", tableName, "`");
    PREPARE statement FROM @sql;
    EXECUTE statement;

    FETCH rCursor INTO tableName;
  END WHILE;

  CLOSE rCursor;
END

1

J'aime ceci pour une simple vérification depuis le shell:

mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>

1
vous pouvez utiliser mysql -sspour faire omettre les noms de colonnes de la sortie - cela permettrait de supprimer NR != 1de votre code
Fluffy

1

pour les hôtes plesk, l'un de ceux-ci devrait faire: (les deux font de même)

mysqlrepair -uadmin -p$(cat /etc/psa/.psa.shadow) -A
# or
mysqlcheck -uadmin -p$(cat /etc/psa/.psa.shadow) --repair -A

1

Vous aurez peut-être besoin d'un nom d'utilisateur et d'un mot de passe:

mysqlcheck -A --auto-repair -uroot -p

Vous serez invité à entrer le mot de passe.

mysqlcheck -A --auto-repair -uroot -p{{password here}}

Si vous souhaitez mettre en cron, MAIS votre mot de passe sera visible en texte brut!


1

Si des tables corrompues restent après

mysqlcheck -A --auto-repair

essayer

mysqlcheck -A --auto-repair --use-frm

que fait le -use-frm?
davidman77 le

--use-frm Pour les opérations de réparation sur les tables MyISAM, récupérez la structure de la table dans le dictionnaire de données afin que la table puisse être réparée même si l'en-tête .MYI est corrompu. (cf. dev.mysql.com/doc/refman/8.0/en/… )
Laloi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.