2011-12-08 12 views
8

環境:Ubuntu 11.10、MySQL 5.1.58MySQLは、ビューを含むバックアップを確実に復元できますか?

私はビューを持つ小さなデータベースを持っています。私はダンプとリストアしようとすると、私は

ERROR 1356 (HY000) at line 1693: View 'curation2.condition_reference_qrm_v' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them 

は、しかし、私は自分自身を部分的に復元されたデータベースに接続し、ビューを作成することができます取得します。したがって、私は、エラーメッセージがビュー自体とは無関係の問題であると推測します。

ここで私が問題を示すために使用する単純なアプローチです:

MYSQL_PWD='xxx' mysqldump -u root --routines -B curation \ 
| perl -pe 's/`curation`/`curation2`/' \ 
| MYSQL_PWD='xxx' mysql -u root 

は、同様の問題のオンライン他の多くの報告があります。 mysqldumpのマニュアルページには、ビューのバックアップに関するバグについての注意書きがありますが、現在のものではなく歴史的な問題として書かれています。

問題は次のとおりです。MySQLは、ビューを含むバックアップを確実に復元できるかどうかを確認しますか?できるなら、どう?そうでない場合、人々は回避策として何をしていますか?

おかげで、物事の リース

答えて

3

私の場合は問題が見つかりました。私はそれがWeb上で同様のレポートを解決することは確信しています。

これは基本的に、このデータベースを新しい名前にコピーしようとしたためのアクセス許可の問題でした。このユーザーとスキーマ(curation2の軌跡)のパーミッションは存在しませんでした。私は手動で 'GRANT ALL ON curation2。* TO軌跡'を追加しました(軌跡はエラーで報告されたユーザーです)。これを実行した後、上記のコマンドラインは正常に動作しました。

レッスンでは、新しいデータベースを作成するときに、宛先データベースとテーブルに必要な権限を手動で付与する必要があります。

0

カップル:

1.)はい、あなたはいくつかのクライアントを使用してビューを作成することができますおそらく、テーブルの所有者がリードしている、ビューの所有者ではありません

2)通常には、MySQL内のビューのバックアップを行うと、

create algorithm xxx definer=<USER> sql security view <view_name> as .... 

と、そのユーザーが頻繁に含まれるようないくつかの「役に立たないゴミ」が含まビューを作成するときにユーザーがログオンしたIPまたはマシン名...だから、ビューは正しく作成されません。それを確認して、あなたを助けるかもしれません。

+0

私はこれをすべてrootとして実行しています。これは私の標準的な習慣ではありませんが、rootとしてこれを行うと、アクセス権が問題になる可能性は低いと思います。私はあなたがビューの定義について何を言おうとしているのか理解していませんが、ダンプの中で私には合理的です。 – Reece

+0

ビュー定義をここに持ってきて質問に追加してください。ちょうど確認する – Alfabravo

10

...

この質問は少し古いですが、私はちょうどまったく同じ問題を解決しようとする時間のカップルを無駄にしたので、私は明確な説明が将来的に誰かに便利になることができると思います

追跡を切る:問題はmysqlダンプのDEFINERフィールドにあります。問題は、この* some_userする@ localhostの*は常に元DBでビューを作成するために使用されたユーザーアカウントにハードコードとあなた」はユーザーされるということです

/*!50013 DEFINER=`some_user`@`localhost` SQL SECURITY DEFINER */ 

:ようです何かを探しますデータベースをエクスポートまたはインポートするために使用されていた(または少なくとも私がやった)。後で、インポート中に、このユーザーはビューの再作成に使用されます。

rootとしてエクスポート/インポートできますが、元のDBが別のユーザーで実行されていて、新しいデータベースにCREATE VIEW権限がない場合、インポートは失敗します。

は、次の2つのシンプルなソリューションがあります。

  1. 検索をして、新しいユーザー(あなたはダンプをインポートするために使用するもの、例えばルート@ localhostの)を使ってダンプファイル内localhost @some_userへのすべての参照を置き換え
  2. またはビューが自分のアカウント

の下でいずれかの方法を作成することができるように、問題を解決する新しいデータベースに* some_user *適切な権限を付与することができますが、私は最初のアプローチをyとして、ずっといいときれいだと思います将来、複数のユーザーを心配する必要はありません。

7

私がこの問題を解決するために見つけたのは、最初にビューを作成するときに 'SQLセキュリティインボーカ'を使用することです。

create or replace sql security invoker view <VIEW_NAME> as select ... 

これは、定義者ではなく、呼び出し側によるビューへのアクセスを定義します。

ダンプファイルがロードされると、ビューは正しく作成されます。 1は、ダンプファイルにするには、このコマンドを実行することができます(上記を行うために必要とされる)スーパーPRIVことはできませんアマゾンRDS、とこの作品を作るために

:アマゾンRDSで

# Remove DEFINER statement from VIEWS in Dump file 
sed -i 's/\sDEFINER=`[^`]*`@`[^`]*`//' $DUMPFILE_NAME 

その後、ダンプファイルがRDSにロードされると、ビューは正しく作成されます。

+0

これはAmazonによって信じられないほど曖昧な要件と思われる。私はなぜビューが単にデフォルトで含まれているのではないのだろうか? –

関連する問題