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?

AMD
la source

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
Constantin Galbenu
la source
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é

SenthilKumar
la source
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
Serbe fou
la source
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.

contactmatt
la source
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
Saint-woland
la source
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>
jerrygarciuh
la source
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
sjas
la source
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!

Mike Zriel
la source
1

Si des tables corrompues restent après

mysqlcheck -A --auto-repair

essayer

mysqlcheck -A --auto-repair --use-frm
Laloi
la source
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