web-dev-qa-db-fra.com

MySQL Server ne démarre pas avec ForeRPS_Key_Checks = 0

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))

4
Christophe L

Cause première

é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 */;

Épilogue

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.

6
RolandoMySQLDBA