EC2 MySQLをAmazon RDSに最初に移行しようとしてもうまくいかない-スーパー権限


11

私は、EC2で実行されているMySQLから新しいAmazon RDSインスタンスに既存のデータベースを移動しようと試みました(移動できるかどうかを確認するための実験)。これまでのところ、うまくいきません。レプリケーションをセットアップする前に、最初のインポートで立ち往生しています(手順はこちら)。

前述のようにRDSインスタンスを準備し、mysqlを使用してEC2インスタンスから接続できます。mysqldumpコマンドを次のように実行しました。

mysqldump --master-data --databases db1 db2 > dump.sql

次に、次を使用してRDSにアップロードしようとしました。

mysql -h RDSHost -P 3306 -u rdsuser --password=rdspassword < dump.sql

最初の問題は、ダンプの22行目にありました。

マスターをMASTER_LOG_FILE = 'mysql-bin.000002'に変更し、MASTER_LOG_POS = 106;

この行によりエラーが発生しましたERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation。問題ありません。その行をコメントアウトして、後でmysql.rds_set_external_master()で修正したいと考えています。アップロードを再試行しましたが、非常によく似たエラーが発生しました:ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation。行7844の周りのセクションは次のようになります。

/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`dev`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `jos_contributor_ids_view` AS select `jos_resource_contributors_view`.`uidNumber` AS `uidNumber` from `jos_resource_contributors_view` union select `jos_wiki_contributors_view`.`uidNumber` AS `uidNumber` from `jos_wiki_contributors_view` */;

最初の2行をコメントアウトし、3行目に「CREATE」を追加することで、この1行を超えることができました。しかし、このようなセクションはたくさんあります。すべての編集なしでこれを回避する方法はありますか?mysqldumpSUPER特権を必要とするものを作成しないオプションのように?

sedmysqldump / mysqlbinlogの出力に対して実行する必要があるなど、多くの人が同様の問題を抱えているようです。私もAWSフォーラムに投稿します-実際には、RDSにはmysqldumpからインポートするより寛容な方法、または既存のdbに対して実行してRDSセキュリティに問題があるダンプを作成できる特定のツールが必要だと思います。誰かがここで役立つかもしれない他のレシピやトリックを持っているかどうか疑問に思いました。

おかげで、

デイブ


申し訳ありません-私は変更しようとしたと言うのを忘れてlog_bin_trust_function_creators1にパラメータを、まだラインで7844.同じエラーを取得する
DSL101

古い投稿ですが、最初のエラーはを言うことで回避できます--masterdata=2。この行はダンプ内でコメント化されます。
ハーフガー

回答:


26

log_bin_trust_function_creatorsRDSで= 1 が必要になる可能性がありますが、ここでは問題ではありません。

 特権DEFINER を持っている場合のみ、自分のアカウント以外の値  を指定できます  SUPER

http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html

ストアドプログラム(proc、function、event、またはtrigger)が実行されているとき、それが行うすべてのものは、それを定義したユーザー、またはDEFINER宣言で明示的に指定されたユーザーの許可を持ちます。これにより、とりわけ、保存されたプログラムは、保存されたプログラム自体を使用する権限がある限り、他のユーザーが直接操作する権限を持たないデータに対して操作を行うことができます。

SUPERユーザーが任意に権限を昇格できるため、非ユーザーが任意の定義者でプロシージャを作成できる場合、深刻な脆弱性になります。

もちろん、これは、投稿した例のように、定義者セキュリティコンテキストが使用される場合のビューにも当てはまります。

私がRDSで抱えている最大の不満の1つは、あなたが持てないということSUPERです...そして今ではそれもあなたのものになる可能性があります:)その事実はあなたが抱えている問題の原因だからです。

もちろん、マネージドMySQLサービスを実行している場合は、だれSUPERにも提供しませんので、それらのセキュリティモデルは、扱いにくい場合でも意味があります。

すべてのオブジェクトの定義者が同じ場合、回避策は、現在使用しているアカウントではなく、そのアカウントを使用してダンプを復元することですが、それは考えにくいです。

DEFINER宣言のある行だけを削除すると、それ自体が行に表示される場合にダンプファイルが機能するか、sedまたはperlを使用してファイルを変更できます...私はすでにあなたが好きではないことを知っていますしかし、MySQLについては、このようなハッカーが非常に合法であり、RDS以外の環境でもDBAとしてやらなければならないことからそれほど遠くないことは本当に素晴らしいことです。

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < oldfile.sql > newfile.sql

...おそらくあなたが望んでいた答えではありませんが、ダンプファイルに対してそれを実行することができ、わずかに使いやすいファイルで終わるはずです。


包括的な回答と、sed / perlが唯一の解決策であると考えたことを確認していただき、ありがとうございます。私が使用しているアプリは高度にカスタマイズされたJoomlaであり、オープンソースでありながら、RDSにうまく移行できるかどうかを分析する時間/スキルがありません。私の考えは「試してみる」ことでした-しかし、最初のステップが最も難しいように思えます-Amazonの不適切な(私の見解では)移行ツールのために少なからず。セキュリティモデルに同意しますが、mysqldumpのデフォルト出力が非常に多くの問題を作成する場合、なぜより良い解決策がないのですか?私もこれについて尋ねます。
dsl101

1
驚くばかり。そのperlスクリプトに感謝します。私のバックアップは4 GB以上であり、それを開くだけでは困難でした。これは私の一日を救った。
エミールバイゼル14年

1
優れた説明、優れた回答、優れたソリューション!愚かな定義者。
rkaregaran

4
perl one linerをありがとう。実際に機能するのは私が見つけることができた唯一のものです。これらのボード上の他の多くは単純にそうではありません。できればもう一度賛成します。
lucian303

1

私の場合、エラーの原因となったダンプ内の「CHANGE MASTER TO MASTER_LOG_FILE = ...」行でした。この行は、mysqldumpの「--master-data」オプションによって追加されました。Amazon AWSでは、代わりに「mysql.rds_set_external_master」プロシージャでマスターの詳細を設定してレプリケーションを開始する必要があります

そのため、22行目でエラーが報告された「head 22 backup.dump」という行のメモを取りました。次に、インポートする前に削除します。大きなファイルには「sed '22d' backup.dump> backup_clean.dump」を使用します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.