データベースを mysql8.0 にしているときに、mysqldump したファイルをmysqlコマンドで別スキーマにインポートすると、以下の様なエラーが出る。
ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER, SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation
解決策
RDSのパラメータグループの設定について gtid-mode を OFFにしました
解説など
ちなみに Line 18の記述はこんな感じ
SET @@SESSION.SQL_LOG_BIN= 0;
エラーメッセージの提案としてはユーザーに権限をあたえることとなっているけど、RDSのユーザーはSUPER権限は許容されていないです。
なので、ユーザーが許容されていないコマンドの原因となる設定を変更しました。これが、gtid-modeとなっています
よくみるとmysqldump作成時に以下の様なwarningが出ていた
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.
DBのレプリケーションをする様な場合はgtid-modeを有効にする必要があるようなのですが、私の要件ではそれが必要無かったので、コピー元の設定を変更することで対応
gtid-modeの話としてはこのあたりが参考記事:https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html
一連の操作でやりたかったことは本番データベースの内容でステージング環境を構築することだったのですけど、本番データベースの設定を変えられない場合は、mysqldumpで出力される内容を変更することで対応できるようです
参考:https://docs.microsoft.com/ja-jp/azure/mysql/howto-troubleshoot-common-errors
RROR 1227 (42000) at line 18 (エラー 1227 (42000)、行 18): Access denied; you need (at least one of) the SUPER privilege(s) for this operation. (アクセスが拒否されました。この操作には、(少なくとも 1 つの) SUPER 権限が必要です。)
GTID が有効にされている MySQL サーバーからターゲット Azure Database for MySQL サーバーにダンプ ファイルをインポートしようとすると、上記のエラーが発生することがあります。 Mysqldump では、GTID が使用されているサーバーからのダンプ ファイルに SET @@SESSION.sql_log_bin=0 ステートメントが追加されます。これによって、ダンプ ファイルがリロードされている間のバイナリ ログが無効になります。
解決方法: インポート中のこのエラーを解決するには、万全を期すために、mysqldump ファイルにある以下の行を削除するかコメント アウトしてから、再度インポートを実行してください。
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN; SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;