« MySQL/Débogage » : différence entre les versions

Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Ligne 29 :
{{attention|S'il y a plusieurs COMMIT avant un ROLLBACK (par exemple dans une boucle), ce dernier n'annulera que les opérations consécutives au dernier COMMIT.}}
 
== Erreurs MySQL ==
=== A new statement was found, but no delimiter between it and the previous one ===
=== General error: 1 Can't create/write to file 'mon_dossier/mon_fichier.csv' ===
Ajouter un ";".
Lors d'un SELECT INTO OUTFILE, si le compte du SGBD utilisé a les droits d'exportation (<code>GRANT FILE ON .* TO 'mon_compte'@'%';</code>), le problème est lié au compte MySQL de l'OS qui n'a pas accès au système de fichier. Comme généralement le compte "mysql" sur Linux n'a pas de shell, cela peut se confirmer ainsi :
<source lang=bash>
su - -s /bin/bash mysql
touch mon_dossier/mon_fichier.csv
</source>
 
Sinon avec "DELIMITER" : sans espace avant (donc consécutivement au retour chariot).
Si les droits manquent :
 
=== Access denied for user mon_compte@mon_hôte ===
* Vérifier le mot de passe du compte.
* Vérifier que l'hôte du compte n'a pas été changé par une règle réseau.
*:Si c'est le cas, tester en shell :
<source lang=bash>
sudo chownmysql -Rh mysqlmon_hôte1 -u mon_dossiermon_compte
sudo mysql -h mon_hôte2 -u mon_compte
</source>
* Sinon, recréer le droit avec :
<source lang=mysql>
GRANT ALL PRIVILEGES ON *.* TO 'mon_compte'@'mon_hôte2' IDENTIFIED BY PASSWORD 'mon_mot_de_passe_hashé';
</source>
 
=== SQLSTATE[42S02]: Base table or view not found: 1146 Table 'xxx' doesn't exist" is not defined, use one of: 100, 200, 250, 300, 400, 500, 550, 600 ===
Une table temporaire n'est pas accessible, elle a peut-être été créée dans un autre thread : il faut la déplacer dans le même fichier.
 
=== TimeoutsBIGINT systématiquesUNSIGNED ouvalue erreuris "Tooout manyof tables"range ===
Se produit sur les opérations sur les grands nombres. On peut alors manipuler des nombres plus petits, par exemple en convertissant les octets en gigas dans le select.
Si des requêtes sont systématiquement en timeout, c'est peut-être que la limite de 61 jointures a été atteinte.
Pour pallier cela, il est possible d'en remplacer certaines par des SELECT<ref>https://www.quora.com/How-do-I-override-a-max-limit-of-61-joins-in-a-MySQL-query</ref>.
 
=== 1005. Can't create table 'xxx' (errno: 150) ===
Clé primaire invalide. Dans ce cas il vaut mieux séparer la création de la table puis l'ajout des contraintes en deux requêtes. Cela peut permettre par exemple de voir que les tables vers lesquelles pointent les contraintes doivent être crées avant ces dernières.
 
=== Can't connect to MySQL server ===
=== 1093 - You can't specify target table '...' for update in FROM clause ===
Changer le paramètre "host".
Cela se produit quand on essaie de mettre à jour ou supprimer des lignes selon une sélection de ces mêmes lignes. En effet, il est impossible de mettre à jour une table pendant en même temps qu'elle une subit sous-requête. Par exemple, pour réinitialiser un mot de passe {{w|Système de publication pour l'Internet|SPIP}} :
mysql> UPDATE spip_auteurs SET pass =
(SELECT pass FROM spip_auteurs WHERE login='paul') where login='admin';
ERROR 1093 (HY000): You can't specify target table 'spip_auteurs' for update in FROM clause
 
=== Can't create federated table ===
* Passer par des <code>CREATE TEMPORARY TABLE</code> (voire <code>DECLARE</code> si cela rentre dans une {{wt|variable scalaire}}).
Le schéma de la table distante doit être le même que celui de la table locale.
* Sinon, il est possible de sélectionner les enregistrements à mettre à jour automatiquement en enveloppant la sous-requête dans une autre, grâce aux tables temporaires générées par les <code>FROM</code><ref>({{en}}) http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/</ref>.
 
Sinon, activer les logs sur le serveur distant pour voir le compte qui se connecte.
=== 1130: Host 'example.com' is not allowed to connect to this MySQL server ===
Dans le cas d'une [[MySQL/Sécurité#Ouverture_.C3.A0_un_PC_distant|connexion depuis un PC distant]], le compte utilisé n'est pas autorisé. Il faut donc le configurer avec :
GRANT ALL PRIVILEGES ON *.* TO 'utilisateur'@'%' WITH GRANT OPTION;
au lieu ou en plus de :
GRANT ALL PRIVILEGES ON *.* TO 'utilisateur'@'localhost' WITH GRANT OPTION;
 
=== Can't create/write to file 'mon_dossier/mon_fichier.csv' ===
=== 1205 Lock wait timeout exceeded; try restarting transaction ===
Lors d'un SELECT INTO OUTFILE, si le compte du SGBD utilisé a les droits d'exportation (<code>GRANT FILE ON .* TO 'mon_compte'@'%';</code>), le problème est lié au compte MySQL de l'OS qui n'a pas accès au système de fichier. Comme généralement le compte "mysql" sur Linux n'a pas de shell, cela peut se confirmer ainsi :
Le serveur SQL est surchargé : exécuter les instructions une par une.
<source lang=bash>
Sinon :
su - -s /bin/bash mysql
<source lang=mysq>
touch mon_dossier/mon_fichier.csv
SET innodb_lock_wait_timeout = 120;
</source>
 
Si les droits manquent :
=== 1553: Cannot drop index 'UNIQ_XXX': needed in a foreign key constraint ===
<source lang=bash>
sudo chown -R mysql mon_dossier
</source>
 
=== Cannot add foreign key constraint ===
Survient lors d'un "CREATE TABLE", et ce n'est pas lié à la valeur de ''foreign_key_checks''.
 
En fait il ne faut pas créer de contrainte d'intégrité entre deux tables de moteur différent (ex : InnoDB vs MyISAM).
 
=== Cannot drop index 'UNIQ_XXX': needed in a foreign key constraint ===
Il faut supprimer la clé étrangère avant l'index duquel elle dépend :
<source lang=mysql>
Ligne 80 ⟶ 88 :
ALTER TABLE `maTable` DROP INDEX `UNIQ_XXX`;
</source>
 
=== 1690. BIGINT UNSIGNED value is out of range ===
Se produit sur les opérations sur les grands nombres. On peut alors manipuler des nombres plus petits, par exemple en convertissant les octets en gigas dans le select.
 
=== 2003: Can't connect to MySQL server ===
Changer le paramètre "host".
 
=== A new statement was found, but no delimiter between it and the previous one ===
Ajouter un ";".
 
Sinon avec "DELIMITER" : sans espace avant (donc consécutivement au retour chariot).
 
=== Data too long for column ===
Ligne 100 ⟶ 97 :
SET NAMES 'utf8';
</source>
 
=== Errcode: 150 "Foreign key constraint is incorrectly formed" ===
Une clé étrangère n'est pas au même format que la colonne à laquelle elle fait référence. Par exemple si cette dernière n'existe pas ou si elle n'a pas le même type.
 
=== Erreur : fonctionnalités relationnelles désactivées ! ===
Se produit dans le concepteur de diagramme de phpMyAdmin, il faut l'activer dans <u>config.inc.php</u>.
 
=== Foreign data src error ===
Lors du <code>create server</code>, le compte renseigné n'existe pas.
 
=== Foreign key constraint is incorrectly formed ===
=== General error: 1215 Cannot add foreign key constraint ===
Une clé étrangère n'est pas au même format que la colonne à laquelle elle fait référence. Par exemple si cette dernière n'existe pas ou si elle n'a pas le même type.
Survient lors d'un "CREATE TABLE", et ce n'est pas lié à la valeur de ''foreign_key_checks''.
 
=== Host 'example.com' is not allowed to connect to this MySQL server ===
En fait il ne faut pas créer de contrainte d'intégrité entre deux tables de moteur différent (ex : InnoDB vs MyISAM).
Dans le cas d'une [[MySQL/Sécurité#Ouverture_.C3.A0_un_PC_distant|connexion depuis un PC distant]], le compte utilisé n'est pas autorisé. Il faut donc le configurer avec :
GRANT ALL PRIVILEGES ON *.* TO 'utilisateur'@'%' WITH GRANT OPTION;
au lieu ou en plus de :
GRANT ALL PRIVILEGES ON *.* TO 'utilisateur'@'localhost' WITH GRANT OPTION;
 
=== General error: 1267 Illegal mix of collations ===
Trois solutions :
* <code>ALTER TABLE</code> pour changer la structure d'au moins une des deux tables jointes, pour uniformiser leur collation.
Ligne 125 ⟶ 120 :
* Pour un <code>UPDATE</code> ou un <code>DELETE</code>, les champs comparés par un <code>IN</code> ne sont peut-être pas du même type.
 
=== SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails ===
Il manque un "DROP FOREIGN KEY" avant un "DROP TABLE" ou un "DROP COLUMN".
 
Ligne 136 ⟶ 131 :
</source>
 
=== Lock wait timeout exceeded; try restarting transaction ===
=== SQLSTATE[42000]: Syntax error or access violation ===
Le serveur SQL est surchargé : exécuter les instructions une par une.
Sinon :
<source lang=mysq>
SET innodb_lock_wait_timeout = 120;
</source>
 
=== Syntax error or access violation ===
Utiliser phpMyAdmin pour trouver l'erreur de syntaxe.
 
=== This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' ===
Remplacer les "IN" par des jointures, ou la sous-requête par une deuxième dont le résultat est stockée dans une table temporaire.
 
== Too many tables (ou timeouts systématiques) ==
Si des requêtes sont systématiquement en timeout, c'est peut-être que la limite de 61 jointures a été atteinte.
Pour pallier cela, il est possible d'en remplacer certaines par des SELECT<ref>https://www.quora.com/How-do-I-override-a-max-limit-of-61-joins-in-a-MySQL-query</ref>.
 
=== Type d'énoncé non reconnu ===
Ligne 152 ⟶ 158 :
install plugin federated soname 'ha_federated.so';
 
=== CanYou can't createspecify federatedtarget table '...' Foreignfor dataupdate srcin error:FROM database...clause ===
Cela se produit quand on essaie de mettre à jour ou supprimer des lignes selon une sélection de ces mêmes lignes. En effet, il est impossible de mettre à jour une table pendant en même temps qu'elle une subit sous-requête. Par exemple, pour réinitialiser un mot de passe {{w|Système de publication pour l'Internet|SPIP}} :
Le schéma de la table distante doit être le même que celui de la table locale.
mysql> UPDATE spip_auteurs SET pass =
(SELECT pass FROM spip_auteurs WHERE login='paul') where login='admin';
ERROR 1093 (HY000): You can't specify target table 'spip_auteurs' for update in FROM clause
 
* Passer par des <code>CREATE TEMPORARY TABLE</code> (voire <code>DECLARE</code> si cela rentre dans une {{wt|variable scalaire}}).
Sinon, activer les logs sur le serveur distant pour voir le compte qui se connecte.
* Sinon, il est possible de sélectionner les enregistrements à mettre à jour automatiquement en enveloppant la sous-requête dans une autre, grâce aux tables temporaires générées par les <code>FROM</code><ref>({{en}}) http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/</ref>.
 
== You do not have the SUPER privilege and binary logging is enabled ==
=> SET GLOBAL log_bin_trust_function_creators = 1;
 
== phpMyAdmin ==
=== Access denied for user mon_compte@mon_hôte ===
=== Erreur : fonctionnalités relationnelles désactivées ! ===
* Vérifier le mot de passe du compte.
Se produit dans le concepteur de diagramme de phpMyAdmin, il faut l'activer dans <u>config.inc.php</u>.
* Vérifier que l'hôte du compte n'a pas été changé par une règle réseau.
*:Si c'est le cas, tester en shell :
<source lang=bash>
sudo mysql -h mon_hôte1 -u mon_compte
sudo mysql -h mon_hôte2 -u mon_compte
</source>
* Sinon, recréer le droit avec :
<source lang=mysql>
GRANT ALL PRIVILEGES ON *.* TO 'mon_compte'@'mon_hôte2' IDENTIFIED BY PASSWORD 'mon_mot_de_passe_hashé';
</source>
 
== Références ==