Je cours Ubuntu avec la version 5.5.44 MySQL
mysqld ver 5.5.44-0ubuntu0.14.10.1 pour Debian-Linux-Gnu sur X86_64 ((Ubuntu))
J'ai une dB avec des clés étrangères. Je voudrais avoir la vérification de la clé étrangère désactivée au niveau système (pas à la session).
J'ai vu le système var étrangers_key_checks qui semble contrôler ce comportement, mais quand je l'ai défini dans /etc/mysql/my.cnf
(en ajoutant foreign_key_checks = 0
) Le serveur ne démarre pas. Le journal d'erreur ressemble à:
150729 15:38:18 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
150729 15:38:18 [Note] Plugin 'FEDERATED' is disabled.
150729 15:38:18 InnoDB: The InnoDB memory heap is disabled
150729 15:38:18 InnoDB: Mutexes and rw_locks use GCC atomic builtins
150729 15:38:18 InnoDB: Compressed tables use zlib 1.2.8
150729 15:38:18 InnoDB: Using Linux native AIO
150729 15:38:18 InnoDB: Initializing buffer pool, size = 128.0M
150729 15:38:18 InnoDB: Completed initialization of buffer pool
150729 15:38:18 InnoDB: highest supported file format is Barracuda.
150729 15:38:18 InnoDB: Waiting for the background threads to start
150729 15:38:19 InnoDB: 5.5.44 started; log sequence number 56348937
150729 15:38:19 [ERROR] /usr/sbin/mysqld: unknown variable 'foreign_key_checks=0'
150729 15:38:19 [ERROR] Aborting
Comment puis-je configurer mon serveur MySQL pour commencer avec les chèques étrangers chèques au niveau du système?
EDIT: Le comportement est le même avec MySQL 5.6.25:
mysqld ver 5.6.25-0ubuntu0.15.04.1 pour Debian-Linux-Gnu sur x86_64 ((Ubuntu))
étrangers_key_checks n'est pas une option globale que vous pouvez prérégler au démarrage. Pourquoi ?
Lorsque vous cliquez sur ce lien vers la documentation sur étrangers_key_checks , il n'y a aucun graphique qui dit qu'il s'agit d'une portée mondiale ou de session. D'autres options spécifieront la portée dans un graphique
Avec étrangers_key_checks , c'est une scorie de session uniquement.
Une preuve supplémentaire de ceci est lorsque vous allez à la ligne de commande et courez ceci
mysqld --help --verbose > /tmp/mysqld.txt
vi /tmp/mysqld.txt
Lorsque vous regardez dans le fichier texte, vous ne voyez pas --foreign-key-checks
comme une option de démarrage de ligne de commande. Les quatre autres variables que j'ai montrées peuvent être utilisées sur la ligne de commande et dans my.cnf
.
Si vous avez des données à charger, vous pouvez définir cela avant de charger:
SET foreign_key_checks = 0;
source mydata.sql
La preuve de ceci est un en-tête standard mysqldump (10 premières lignes)
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
S'il vous plaît noter la ligne 8
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
À quoi ressemble le fond d'un mysqldump? Comme ça:
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
S'il vous plaît noter la ligne
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
Bottom Line : Foreign_Key_Checks n'est pas destiné à être utilisé dans my.cnf
. Cela a le plus de sens parce que (si autorisé) commencer mysqld avec qui serait endommager l'intégrité référentielle du démarrage.