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))
foreign_key_checks は、起動時に事前設定できるグローバルオプションではありません。どうして ?
foreign_key_checks のドキュメントへのリンクをクリックすると、それがグローバルスコープまたはセッションスコープであることを示すグラフはありません。他のオプションは、チャートのスコープを指定します
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_checks はmy.cnf
で使用するためのものではありません。 (許可されている場合)mysqldを起動すると、起動時の参照整合性が損なわれるため、これは最も理にかなっています。