web-dev-qa-db-ja.com

MySQLサーバーがforeign_key_checks = 0で起動しない

MySQLバージョン5.5.44でUbuntuを実行しています

mysqld Ver 5.5.44-0ubuntu0.14.10.1 for debian-linux-gnu on x86_64((Ubuntu))

外部キーを持つDBがあります。 systemレベルで(セッションではなく)外部キーチェックを無効にしたいのですが。

この動作を制御しているように見えるシステム変数 foreign_key_checks を見ましたが、/etc/mysql/my.cnfに設定すると(foreign_key_checks = 0を追加して)、サーバーが起動しません。エラーログは次のようになります。

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

システムレベルで外部キーチェックをオフにするようにMySQLサーバーを構成するにはどうすればよいですか?

編集:動作はMySQL 5.6.25と同じです。

mysqld Ver 5.6.25-0ubuntu0.15.04.1 for debian-linux-gnu on x86_64((Ubuntu))

4
Christophe L

根本的な原因

foreign_key_checks は、起動時に事前設定できるグローバルオプションではありません。どうして ?

foreign_key_checks のドキュメントへのリンクをクリックすると、それがグローバルスコープまたはセッションスコープであることを示すグラフはありません。他のオプションは、チャートのスコープを指定します

  • ft_boolean_syntax は、変数スコープグローバルを示しています。動的変数はい
  • innodb_doublewrite は変数スコープグローバルを示します。動的変数いいえ
  • max_allowed_pa​​cket は変数スコープグローバルを示しています。動的変数はい
  • sort_buffer_size はVariable Scope Global、Sessionと言います。動的変数はい

foreign_key_checks の場合、これはセッションスコープのみです。

これのさらなる証拠は、コマンドラインに移動してこれを実行したときです

mysqld --help --verbose > /tmp/mysqld.txt
vi /tmp/mysqld.txt

テキストファイル内を見ると、コマンドラインの起動オプションとして--foreign-key-checksが表示されていません。私が示した他の4つの変数は、コマンドラインとmy.cnfで使用できます。

ロードするデータがある場合は、ロードする前に設定できます。

SET foreign_key_checks = 0;
source mydata.sql

この証明は標準のmysqldumpヘッダーです(最初の10行)

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

8行目に注意してください

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

Mysqldumpの下部はどのように見えますか?このような:

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

行に注意してください

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

エピローグ

結論: foreign_key_checksmy.cnfで使用するためのものではありません。 (許可されている場合)mysqldを起動すると、起動時の参照整合性が損なわれるため、これは最も理にかなっています。

6
RolandoMySQLDBA