💻

HerokuのJawsDBからAmazon RDSに移行しようとしたら死ぬほどハマった話

2020/02/03に公開

こんにちは、たつきちです。

タイトルのエラーでハマりすぎて発狂しかけました。AWS本当に苦手です😥

とりあえず解決したので記録として残しておきます。

やろうとしたことと起こったこと

もともとHeroku & JawsDB を使っていたんですが、こちらの記事 に書いたとおりJawsDBに限界を感じたため、Herokuは使いつつデータベースだけを Amazon RDS に移行しようと思いました。

  1. 普通にRDSでAurora(MySQL 5.7)のデータベースをパブリックアクセス可能な設定で立ち上げて
  2. 普通にJawsDBからmysqldumpして
  3. 普通にインポートしようとしたら

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

読んでみると、

  1. DBパラメーターグループの log_bin_trust_finction_creators というシステム変数を 1 に設定する必要あり
  2. それを設定したとしても、mysqldumpに TRIGGERDEFINER が使われているとダメなので、sedコマンドなどで取り除いておく必要あり

ということのようです。

確かに、もう少しググってみると、そのような内容を言っているAWS公式の回答が見つかりました。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/mysqldump-error-rds-mysql-mariadb/

自分のmysqldumpファイルには、 TRIGGERDEFINER も含まれていませんでしたが、とりあえず言われるがままに対応してみました。

  1. デフォルトのパラメータグループは設定を変更できない ので、 DBパラメータグループDBクラスターのパラメータグループ をそれぞれ作成
  2. 両方の log_bin_trust_finction_creators1
  3. 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 の設定は必要なくて、デフォルトのパラメータグループのままで問題なかったです。

まとめ

  • エラーメッセージはもっとよく見よう
GitHubで編集を提案

Discussion