[RDS] mysql でmysqldumpのimportが失敗する・・


データベースを 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;