HerokuのJawsDBからAmazon RDSに移行しようとしたら死ぬほどハマった話
こんにちは、たつきちです。
タイトルのエラーでハマりすぎて発狂しかけました。AWS本当に苦手です😥
とりあえず解決したので記録として残しておきます。
やろうとしたことと起こったこと
もともとHeroku & JawsDB を使っていたんですが、こちらの記事 に書いたとおりJawsDBに限界を感じたため、Herokuは使いつつデータベースだけを Amazon RDS に移行しようと思いました。
- 普通にRDSでAurora(MySQL 5.7)のデータベースをパブリックアクセス可能な設定で立ち上げて
- 普通にJawsDBからmysqldumpして
- 普通にインポートしようとしたら
ERROR 1227 (42000) at line xxx: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
これです。
ちなみにAuroraじゃなくMySQLインスタンスでも結果は同じです。
log_bin_trust_function_creators
?
犯人は エラーメッセージをググると、まずこちらの記事が見つかりました。
MySQLのDBからAWSのRDSへデータをインポートする
https://qiita.com/hikey/items/ab5fca33849d3e3929cb
読んでみると、
- DBパラメーターグループの
log_bin_trust_finction_creators
というシステム変数を1
に設定する必要あり - それを設定したとしても、mysqldumpに
TRIGGER
やDEFINER
が使われているとダメなので、sedコマンドなどで取り除いておく必要あり
ということのようです。
確かに、もう少しググってみると、そのような内容を言っているAWS公式の回答が見つかりました。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/mysqldump-error-rds-mysql-mariadb/
- ターゲット RDS インスタンスでバイナリログが有効 (バックアップ保有期間 > 0) になっており、mysqldump ファイルにトリガー、ビュー、関数、イベントなどのオブジェクトが含まれています。詳細については、Amazon RDS MySQL インスタンスでレプリケーションまたは自動バックアップを有効にしたときに起こる ERROR 1227 を解決する方法を教えてくださいをご参照ください。
- インポートした mysqldump ファイルが、DB インスタンスに存在しない DEFINER 属性ユーザーを持つオブジェクトを作成しようとしたか、または必要な SUPER ユーザー権限を持たない属性ユーザーを作成しようとしました。詳細については、「mysqldump を使用して RDS MySQL インスタンスにデータをインポートするときに definer エラーが発生する」をご参照ください。
自分のmysqldumpファイルには、 TRIGGER
も DEFINER
も含まれていませんでしたが、とりあえず言われるがままに対応してみました。
-
デフォルトのパラメータグループは設定を変更できない ので、
DBパラメータグループ
とDBクラスターのパラメータグループ
をそれぞれ作成 - 両方の
log_bin_trust_finction_creators
を1
に - DBクラスターとDBインスタンスの両方を、設定変更したパラメータグループに変更
やってみましたが、結果は変わらずでした😥
SET @@SESSION.SQL_LOG_BIN
!
犯人は さらにググっていたら、こちらの記事を見つけました。
AWS/RDS/MySQL5.7を複製する
https://qiita.com/taka10257/items/99827f3683ce51d3213c
記事のとおり
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED='';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
これらをmysqldumpから削除してみたところ、やっとインポートできました…!
ここまで来てやっと気付いたのですが、よくよくエラーメッセージを見てみると、
ERROR 1227 (42000) at line xxx: Access denied; you need (at least one of) the SUPER privilege(s) for this operation**
エラーになっている行番号が書いてあったんですね💦
結局、僕の場合は log_bin_trust_finction_creators
の設定は必要なくて、デフォルトのパラメータグループのままで問題なかったです。
まとめ
- エラーメッセージはもっとよく見よう
Discussion