mysqldumpを実行しようとするとCouldn’t execute ‘SET OPTION SQL_QUOTE_SHOW_CREATE=1’が出るときの対処法

mysqldumpを実行しようとするとCouldn’t execute ‘SET OPTION SQL_QUOTE_SHOW_CREATE=1’が出るときの対処法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

元はAmazon EC2からAmazon RDSのデータを出力しようとしたんです

 現在業務でAmazon AWSのEC2及びRDSを使用しています。
コレ自体は一つも珍しいことではなく、もはや日常茶飯事っぽくなりましたね。
ただ、EC2内でMySQLを使って実装することも多々有ります。
レプリーケーション機能が使いたいとか色々理由はあるのですが、それがネックで今までRDSを使ってきませんでした。
が、ステージング環境を作る上で、データベースも別の場所を使ったほうが簡単ということで、レプリケーション機能がいらない部分をRDS側にコピーしました。

そして時が過ぎて、このステージング環境のデータを一旦EC2内のMySQLへ移植しようとした時に、問題が発生しました。
データを吐き出すために、いつもどおりmysqldumpでデータを取得しようとしました。
そしたら、下記のようなエラーが発生しました。

$ mysqldump -uuser -ppass -h xxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -t database_name table_name > output.sql
mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OPTION SQL_QUOTE_SHOW_CREATE=1' at line 1

OPTION~でエラーが出てます。
これは、mysqld(サーバ)と、mysqldump(クライアント)のバージョンがずれていると発生する模様。
具体的には、MySQLサーバが5.6になったとき、SET OPTION構文が廃止されたのが原因の模様。
この状況を確認するために、現在のバージョンを確認してみると、

$ mysqldump -V
mysqldump Ver 10.13 Distrib 5.5.31, for Linux (x86_64)

$ mysql -uuser -ppass -h xxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com database_name
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 16487 Server version: 5.6.12-log MySQL Community Server (GPL) 

サーバは5.6.12で、クライアントは5.5.31。このバージョン不一致の問題でした。
なお、EC2で使っているMySQLのバージョンを調べてみると、

$ mysql -uuser -ppass -hxxx.xxx.xxx.xxx
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19707879
Server version: 5.1.67-log Source distribution

わぉ。5.5系統かとおもいきや5.1でしたよ、奥さん。
これに関してはまた別の問題な上、現在絶賛稼働中のシステムのためメジャーアップデートもできません。
なお、RDSであれば、5.1から5.5へのメジャーバージョンアップを提供(2013/6/20)しているのでそれを利用するのも手です。が、ここはEC2なので、おいおいの課題として、とりあえず現在は、このmysqldumpを使えるようにしようと思います。
なお、使えるようにするためには、

  1. version5.5のmysqldumpバイナリファイルを編集してOPTIONを取り除く
  2. mysqlサーバ側でSET OPTIONを受け入れるようにする
  3. mysqldumpを5.6にアップグレードする

などの方法があるようです
2はRDSが絡んできてめんどくさいのと、1はなんかスマートじゃないので、ここでは簡単に3のアップグレードする方法で解決します。

アンインストールしてインストールする

さっくりと現在のステージング環境のEC2内MySQLをアップグレードします。
これは、ローカルの環境でMySQLサーバを使用していないから手っ取り早いだろうという結論です。

$ sudo yum remove -y mysql
Loaded plugins: priorities, security, update-motd, upgrade-helper
~~~~
Running Transaction
Erasing : mysql-5.5-1.3.amzn1.noarch 1/1
Verifying : mysql-5.5-1.3.amzn1.noarch 1/1
Removed: mysql.noarch 0:5.5-1.3.amzn1 Complete!

$ sudo yum remove -y mysql-server
Loaded plugins: priorities, security, update-motd, upgrade-helper
~~~~
Package(s) mysql-server available, but not installed. No Packages marked for removal

$ sudo yum remove -y mysql-devel
Loaded plugins: priorities, security, update-motd, upgrade-helper
~~~~
Package(s) mysql-devel available, but not installed. No Packages marked for removal

つまり、mysqlのパッケージだけ削除したと。
動いてないからこれだけだった模様。ということは、再度入れなおす時もとりあえずmysqlだけにしておきましょう。

まず、最新版を取得します。
なお、yum install mysqlでさくっと入れようとすると、yumパッケージがMySQL5.5.32を入れようとします。まあ、当然のことなのですが。
なので、手動でパッケージを取得してインストールすることとします。
現段階での最新版はこのページから取得します。MySQL Community Server、執筆中(9/26)では5.6.14が最新でした。

$ wget http://cdn.mysql.com/Downloads/MySQL-5.6/MySQL-5.6.14-1.linux_glibc2.5.i386.rpm-bundle.tar
~~~~
(3.96 MB/s) - ‘MySQL-5.6.14-1.linux_glibc2.5.i386.rpm-bundle.tar’ saved [306165760/306165760]

306.1Mbyte程度でした。
これをさくっとインストールします。

$ tar xvf MySQL-5.6.14-1.linux_glibc2.5.i386.rpm-bundle.tar
MySQL-shared-5.6.14-1.linux_glibc2.5.i386.rpm
MySQL-embedded-5.6.14-1.linux_glibc2.5.i386.rpm
MySQL-server-5.6.14-1.linux_glibc2.5.i386.rpm
MySQL-shared-compat-5.6.14-1.linux_glibc2.5.i386.rpm
MySQL-devel-5.6.14-1.linux_glibc2.5.i386.rpm
MySQL-test-5.6.14-1.linux_glibc2.5.i386.rpm
MySQL-client-5.6.14-1.linux_glibc2.5.i386.rpm

$ sudo rpm -hiv MySQL-devel-5.6.14-1.linux_glibc2.5.i386.rpm
Preparing... ########################################### [100%]
1:MySQL-devel ########################################### [100%]

$ sudo rpm -hiv MySQL-shared-5.6.14-1.linux_glibc2.5.i386.rpm
error: Failed dependencies: 
libstdc++.so.6 is needed by MySQL-shared-5.6.14-1.linux_glibc2.5.i386
 libstdc++.so.6(CXXABI_1.3) is needed by MySQL-shared-5.6.14-1.linux_glibc2.5.i386
  libstdc++.so.6(GLIBCXX_3.4) is needed by MySQL-shared-5.6.14-1.linux_glibc2.5.i386

libstdc++.so.6がない模様。なので、インストールします。

$ sudo yum install libstdc++.so.6
Loaded plugins: priorities, security, update-motd, upgrade-helper
~~~~
Installed:
libstdc++46.i686 0:4.6.3-2.67.amzn1
Complete!

再度インストールします。

$ sudo rpm -hiv MySQL-shared-5.6.14-1.linux_glibc2.5.i386.rpm
Preparing... ########################################### [100%]
 1:MySQL-shared ########################################### [100%]
~~~~
--defaults-file argument to mysqld_safe when starting the server

$ sudo rpm -hiv MySQL-client-5.6.14-1.linux_glibc2.5.i386.rpm
Preparing... ########################################### [100%]
 1:MySQL-client ########################################### [100%]

本来であれば、clientだけ入れればよかったのですが、念の為に全部入れました。
起動しなければサーバも関係ないので入れといて問題ないという判断です。

というわけで、mysqldumpのバージョンを確認します。

$ mysqldump -V
mysqldump Ver 10.13 Distrib 5.6.14, for Linux (i686)

無事、5.6.14にアップしてました。
さて、当初の目標としたmysqldumpで出力できるかやってみましょう。

$ mysqldump -uuser -ppass -h xxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -t database_name table_name > output.sql
Warning: Using a password on the command line interface can be insecure.

Warningは出てるけど、出力はできてるようです。このエラーは、おそらく「コマンドラインにパスワード入れると危険だからやめろ」ッて感じなんだと思います。そう思ったので、パスワードを入れないで-pのみ指定して、Enter password:で入力するようにしたらWarning消えました。

というわけで、長々と書いてきましたが、システムを使う上で、バージョン情報がずれてると色々と問題があるので、一度これと決めた状態ではバージョンを動かさないのがBetterかも知れません。
が、本当であれば、全てを最新版にしておけば安全なんですけどね~。

今週の秋葉原

久しぶりにブログをまじめに書いたので、秋葉原での最近の様子を。
今週月曜日の祝日に、よく行くお店の女の子の誕生日でした。
花束を渡して、シャンパンあけて、サイリウムで照らして、ケーキ渡して、クラッカーでっせいに祝って。
そんなひと通りのお祝いをしました。お誕生日ってめでたいですねヽ(=´▽`=)ノ

IMG_1983