質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

5687閲覧

Cloud SQLでデータを正しくインポートできない

RyuichiTani

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

0クリップ

投稿2016/09/03 07:20

編集2016/09/10 10:51

###前提・実現したいこと
GCP(Compute Engine + SQL)でウェブサイトを構築しています。
既存のSQLインスタンスのデータをエクスポートし、新しく作成したSQLインスタンスにデータをインポートしようとすると以下のエラーが発生してしまいました。

MySQL

1ERROR 1227 (42000) at line 885: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

データのインポートは一見できているように見えるのですが、
GROUP_CONCAT(tag.id SEPARATOR ',')
といった命令が入ったリクエストすると動作しなくなってしまいました。

何か打開策をご存じの方が居られましたらご教授お願い致します。

KiyoshiMotoki👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

推測による回答ではありますが、、

おそらく、以下のような状況ではありませんか?

  • mysqldump コマンドでインポートするデータを作成している。
  • その中に "CREATE VIEW 〜"文が含まれている。
  • エクスポート元のインスタンスのユーザー名とインポート先のインスタンスのユーザー名が異なる。

であれば、インポートするデータの中に以下のような行が含まれているはずです。

sql

1/*!50013 DEFINER=`[エクスポート元のユーザー名]`@`[そのインスタンスにアクセスする IP またはホスト名]` SQL SECURITY DEFINER */

この行を削除し、再度、インポートしてみてください。


エラーの内容は
「SUPER 権限を持っていないユーザーが、それを必要とする SQL を実行しようとした」
というものです。
https://dev.mysql.com/doc/refman/5.6/ja/error-messages-server.html

エラー: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR)

メッセージ: アクセスは拒否されました。この操作には %s 権限が (複数の場合はどれか 1 つ) 必要です。

MySQL のビューはそのビューにアクセスできるユーザーを制限できるようになっており、デフォルトでは、それはそのビューを作成したユーザーです。
https://dev.mysql.com/doc/refman/5.6/ja/create-view.html

DEFINER および SQL SECURITY 句は、そのビューを参照しているステートメントの実行時に、そのビューに対するアクセス権限を確認するときにどの MySQL アカウントを使用するかを決定します。

(中略)
DEFINER のデフォルト値は、CREATE VIEW ステートメントを実行するユーザーです。

で、手元の環境(MySQL5.7)で、以下のような現象となることが確認できました。

  • DEFINER を明示せずビューを作成しても、mysqldump でエクスポートすると、ダンプファイル内では上述の 'DEFINER=' が明示される。
  • SUPER 権限を持っていないユーザーで自分以外のユーザーを DEFINER に指定しようとすると、ご質問のエラーメッセージが表示される。
  • ダンプファイルのインポートで↑の操作を行なった場合、そのビューの作成だけがスキップされる(その他のテーブルは正常に作成される)。

ちなみに、Cloud SQL では SUPER 権限を持つユーザーを作成できないようです。
https://cloud.google.com/sql/faq

Google Cloud SQL does not support SUPER privileges,

追記

ダウンロードしたSQLファイルで「SECURITY DEFINER」キーワードを探してみたのですが、存在が確認できませんでした。

そもそも、エクスポート元のインスタンスで VIEW を作成した記憶はありませんか?

「SECURITY DEFINER」では、検索するキーワードとして長過ぎます。
スペースの数が違うだけでも、ヒットしなくなってしまいますので。

"DEFINER" または "INVOKER" だけで検索してみてください。

また、どうやらストアドプログラム (プロシージャー、関数、トリガー、およびイベント) も、ビューと同じように実行可能なユーザーを制限できるようです。
https://dev.mysql.com/doc/refman/5.6/ja/stored-programs-security.html

すべてのストアドプログラム (プロシージャー、関数、トリガー、およびイベント) とビューには、MySQL アカウントを指名する DEFINER 属性を含めることができます。

念のため、こちらも含まれていないか、確認してみてください。
それぞれの確認方法は、「MySQL プロシージャー 一覧」などで検索すると分かると思います。


Cloud SQLでデータベースをインポートする際は、コマンドではなく管理画面でインポートボタンを押すことで実行するので「mysqldump コマンドでインポートするデータを作成している。」については問題ないと思います。

マニュアルによると、
Cloud SQL では、エクスポートするデータの形式は"MySQL ダンプファイル"または"CSV"のいずれかを選択でき、
エクスポートする際、フォーマットに"SQL"を指定すると、"MySQL ダンプファイル"となるようです。

https://cloud.google.com/sql/docs/import-export/exporting

Decide what file type you are creating: a MySQL dump file or a CSV file.

To export data to a MySQL dump file
(中略)
5. Set the Format to SQL.

おそらく、"MySQL ダンプファイル"はmysqldump コマンドを実行した場合と全く同じか、同じような形式のデータになっているはずです。
mysqldump コマンドで作成したデータも、実体は SQL 文ですので。


それでも解決できない場合、可能であれば、実行に失敗する SQL文(どれか1つで結構です)の全文と、その SQL文がアクセスしている全てのテーブルのテーブル定義を質問に追記してください。

テーブル定義は、以下の SQL を実行すれば分かります。

sql

1SHOW CREATE TABLE [テーブル名];

https://dev.mysql.com/doc/refman/5.6/ja/show-create-table.html


追記2

今までは、SQLインスタンスまるまるエクスポートしていたのですが、試しにコピーしたいデータベースのみをエクスポートするとエラーが吐かれませんでした。

なるほど。
恐らく(information_schema など)MySQL が勝手に(w)作成するスキーマの中に含まれていた何らかのオブジェクトが、インポート時にエラーになっていたのかもしれません。

「コピーしたいデータベースのみをエクスポートするとエラーが吐かれません」
であれば、それで問題ないかと思います。


で、

ただ、SQL文のエラー結果は変わりませんでした。

そうすると、こちらはインポート時のエラーとは別の問題だと考えられます。
出力されるエラーメッセージを確認してみてください。

PHPからmysqliでSQL文を実行するとエラーが発生するようです。

ということなので、mysqli で問題の SQL文を実行($mysqli->query()またはmysqli_query())した直後に$mysqli->errorまたはmysqli_error($link)で、エラーメッセージを取得できるはずです。
http://php.net/manual/ja/mysqli.error.php

投稿2016/09/03 08:52

編集2016/09/03 16:15
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RyuichiTani

2016/09/03 09:25

ご回答ありがとうございます! ただ、解決することができませんでした。すみません。。。 ダウンロードしたSQLファイルで「SECURITY DEFINER」キーワードを探してみたのですが、存在が確認できませんでした。 また、Cloud SQLでデータベースをインポートする際は、コマンドではなく管理画面でインポートボタンを押すことで実行するので「mysqldump コマンドでインポートするデータを作成している。」については問題ないと思います。
KiyoshiMotoki

2016/09/03 14:40

返信ありがとうございます。 回答欄に追記させていただきました。 確認願います。
RyuichiTani

2016/09/03 15:42

VIEWは使った記憶がありません。 ワード検索も色々試したのですがヒットしませんでした。 できるだけDB情報を追記させていただきました。 何から何まで頼らせて頂いてしまい大変恐縮ですが、宜しくお願い致します。。
KiyoshiMotoki

2016/09/03 16:18 編集

情報の追記、ありがとうございます。 回答を追記させていただきました。 確認願います。
RyuichiTani

2016/09/03 16:35

原因はわからないのですが、プレースホルダに値をバインドする際にエラーが発生するようです。SSHクライアントでクエリを投げるときはプレースホルダを利用せずに呼び出していたのでエラーが発生しなかったのかもしれません。 しかしなぜこんなことになるのだろうか…
KiyoshiMotoki

2016/09/03 18:16

エラーメッセージを確認してください。 たいていの問題は、エラーメッセージをキーワードに検索すれば原因と解決策がわかります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問