mysqldumpを実行しようとするとCouldn’t execute ‘SET OPTION SQL_QUOTE_SHOW_CREATE=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を使えるようにしようと思います。
なお、使えるようにするためには、
- version5.5のmysqldumpバイナリファイルを編集してOPTIONを取り除く
- mysqlサーバ側でSET OPTIONを受け入れるようにする
- 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
<p>つまり、mysqlのパッケージだけ削除したと。<br />動いてないからこれだけだった模様。ということは、再度入れなおす時もとりあえずmysqlだけにしておきましょう。</p> <p>まず、最新版を取得します。<br />なお、yum install mysqlでさくっと入れようとすると、yumパッケージがMySQL5.5.32を入れようとします。まあ、当然のことなのですが。<br />なので、手動でパッケージを取得してインストールすることとします。<br />現段階での最新版は<a href="http://dev.mysql.com/downloads/mysql/" target="_blank" rel="noopener noreferrer">このページ</a>から取得します。MySQL Community Server、執筆中(9/26)では5.6.14が最新でした。</p>
$ 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!
<p>再度インストールします。</p>
$ 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かも知れません。
が、本当であれば、全てを最新版にしておけば安全なんですけどね~。
今週の秋葉原
久しぶりにブログをまじめに書いたので、秋葉原での最近の様子を。
今週月曜日の祝日に、よく行くお店の女の子の誕生日でした。
花束を渡して、シャンパンあけて、サイリウムで照らして、ケーキ渡して、クラッカーでっせいに祝って。
そんなひと通りのお祝いをしました。お誕生日ってめでたいですねヽ(=´▽`=)ノ