MySQLレプリケーションスレーブをセットアップしようとしていますが、LOAD DATA FROM MASTER;
の実行に非常に苦労しています。はい、私はそれが非推奨であることを知っています、しかし私はMySQL 5.1を実行しています、そしてそれは今のところ私の問題ではありません。
何らかの理由で、MySQLはCREATE
コマンドが拒否されたと私に言い続けますが、SHOWGRANTSのチェックはそうではないと言います。これをチェックしてください:
mysql> SHOW GRANTS;
+--------------------------------------------------------------------------------------------------------------------+
| Grants for replicator@% |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'replicator'@'%' IDENTIFIED BY PASSWORD '*ABCDEFABCDEFABCDEFABCDEFBLAHBLAHBLAHBLAH' |
+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> LOAD DATA FROM MASTER;
ERROR 1142 (42000): CREATE command denied to user 'replicator'@'localhost' for table 'aggregate'
mysql>
ここで奇妙だと思ったのは、LOAD DATA FROM MASTER
を呼び出すと、私は'replicator'@'localhost'
だと思いますが、SHOW GRANTS
は'replicator'@'%'
と言います。安全のために、私は'replicator'@'localhost'
にも同じ特権を与えました。
mysql> SHOW GRANTS FOR 'replicator'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------+
| Grants for replicator@localhost |
+----------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'replicator'@'localhost' IDENTIFIED BY PASSWORD '*ABCDEFABCDEFABCDEFABCDEFBLAHBLAHBLAHBLAH' |
+----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
それで、なぜこれがすべて台無しにされているのかについての考えはありますか?はい、FLUSH PRIVILEGES
も何度もやりました。
あなたが与えることができるどんなアドバイスにも前もって感謝します。
私は次のことを提案したいと思います:
次回ログインするときに、次のクエリを実行します。
_SELECT USER(),CURRENT_USER();
_
2つの異なるユーザー名が表示された場合、奇妙なシナリオがあります
これは、MySQL 5.0認定学習ガイド(ISBN 0-672-32812-7)の第34章または第35章に記載されています。
USER()
は、ログインしようとしたものをエコーします
CURRENT_USER()
は、mysqlがログインを許可したものをエコーします。
127.0.0.1を使用してレプリケーターとして使用して接続し、同じクエリを実行してみてください。
また、使用しているmysqlのバージョンに必要なすべての列がmysql.userに存在することを確認することもできます。 mysql.userテーブルをアップグレードしなかった場合(MySQL 4-MySQL 5、またはMySQL 5.0から5.1への移行から)、mysql.userの列が同期していない可能性があります。
将来の検索者のために、MySQL WorkbenchとphpMyAdminの組み合わせを使用すると、このエラーが発生することがわかりました。テーブルリストから「SQLをコピー」すると、createステートメントのテーブル名の前にスキーマ名が追加されます。その一部である可能性のある外部キーコマンド)。
スキーマ名を注意深く削除すると、この問題は解決しました。
例えば:
CREATE TABLE IF NOT EXISTS `schema`.`table1` (
...blah blah blah...
CONSTRAINT `fk_user_id`
FOREIGN KEY (`user_id` )
REFERENCES `schema`.`table1` (`id` )
...blah blah blah...
次のように変更する必要があります。
CREATE TABLE IF NOT EXISTS `table1` (
...blah blah blah...
CONSTRAINT `fk_user_id`
FOREIGN KEY (`user_id` )
REFERENCES `table1` (`id` )
...blah blah blah...
奇妙なことに、クライアントを終了して再接続するだけで問題は解決しました。明らかに、FLUSH PRIVILEGES
では不十分です。
その理由についてコメントがあれば教えてください。 FLUSH PRIVILEGES
がまさにそれを行うといつも聞いています。最初に'replicator'@'%'
としてログインし、後で'replicator'@'localhost'
アカウントを作成したことと関係がありますか?
いずれにせよ、このような奇妙なアクセス許可の問題がある場合は、クライアントを再接続してみる価値があると思います。
MySQL Workbench Migration Wizardを使用してDBをあるサーバーから別のサーバーにコピーすると、新しいDB名が元の名前と一致しなかったため、同じエラーメッセージが表示されました。新しいサーバーは自動的に配置します。すべてのDB名の前にあるドメイン名により、名前の不一致が発生します。したがって、DB xyz
を新しいサーバーdomain
に転送すると、新しいDB domain_xyz
が呼び出され、上記のエラーが発生します。テーブルが作成されるたびにメッセージが発生しました。
この問題を修正するために、移行スキーマの生成後に新しいDB名を手動で編集し、xyz
からdoman_xyz
に変更しました。
私をこの方向に向かわせたCamwynの応答へのヒント。