web-dev-qa-db-ja.com

GRANT ALLPRIVILEGESを持つユーザーに対してCREATEコマンドが拒否されました

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も何度もやりました。

あなたが与えることができるどんなアドバイスにも前もって感謝します。

10
Brad

私は次のことを提案したいと思います:

次回ログインするときに、次のクエリを実行します。

_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の列が同期していない可能性があります。

14
RolandoMySQLDBA

将来の検索者のために、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...
16
Camwyn

奇妙なことに、クライアントを終了して再接続するだけで問題は解決しました。明らかに、FLUSH PRIVILEGESでは不十分です。

その理由についてコメントがあれば教えてください。 FLUSH PRIVILEGESがまさにそれを行うといつも聞いています。最初に'replicator'@'%'としてログインし、後で'replicator'@'localhost'アカウントを作成したことと関係がありますか?

いずれにせよ、このような奇妙なアクセス許可の問題がある場合は、クライアントを再接続してみる価値があると思います。

5
Brad

MySQL Workbench Migration Wizardを使用してDBをあるサーバーから別のサーバーにコピーすると、新しいDB名が元の名前と一致しなかったため、同じエラーメッセージが表示されました。新しいサーバーは自動的に配置します。すべてのDB名の前にあるドメイン名により、名前の不一致が発生します。したがって、DB xyzを新しいサーバーdomainに転送すると、新しいDB domain_xyzが呼び出され、上記のエラーが発生します。テーブルが作成されるたびにメッセージが発生しました。

この問題を修正するために、移行スキーマの生成後に新しいDB名を手動で編集し、xyzからdoman_xyzに変更しました。

私をこの方向に向かわせたCamwynの応答へのヒント。

0
WThomas