GA

2015/12/10

sqlplusのお供、rlwrapのオプションについて調べてみた

この記事は JPOUG Advent Calendar 2015 の10日目の記事です。

残念ながら私は全くOracleというDBMSが使えません。どれくらい使えないかというと、

SQL> SHOW DATABASES;
SP2-0158: unknown SHOW option "DATABASES"

( ゚д゚)ノ せんせー、このDBMSダメなやつです!

というくらい使えません。PostgreSQLだったらまだコマンドラインクライアントをゴニョって`SHOW DATABASES`で一覧を出すくらいのことは出来たんですが、sqlplusだとそういう訳にも行きませんね、このクローズドソース野郎!!1

という訳で、sqlplus使い御用達(と聞いている) rlwrap の話をしようと思います。わたしは groonga (コマンドラインクライアントの方)でrlwrapをよく使いますが、初めてオプションを調べてみたので記録しておきます。

有名な話だったらごめんなさい。


まずは単に起動。

$ rlwrap sqlplus

SQL*Plus: Release 11.2.0.4.0 Production on Mon Dec 7 18:52:56 2015

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Enter user-name: supersuper
Enter password: **********


とまあこの通りパスワード部分はreadlineを通らず、"*"でマークされました。
Enter叩いた瞬間に"*"も消えました。sqlplus、こんな動作なのか。

そしてそこで有名なやつとして-aオプションを足してみると

$ rlwrap -a sqlplus

SQL*Plus: Release 11.2.0.4.0 Production on Mon Dec 7 18:59:45 2015

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Enter user-name: supersuper
Enter password: top_s3cret


如何にもありそうな感じで、剥き出しでパスワードが表示される。本来、パスワードっぽいものを遠慮してreadlineに流さずにやってるのを、全部readlineに通してそのあとNL契機でsqlplusに渡してるんですね、たぶん。"*"の時と同じくエンター叩いた瞬間に消えますが、SQLのプロンプトで↑キーを押すと


SQL> top_s3cret

履歴に出た━━━━(゚∀゚)━━━━!!
readlineに渡るとhistory_fileにも書くからか。そうか、確かにそうだけど面白い。


$ rlwrap -a"Enter password:" sqlplus

SQL*Plus: Release 11.2.0.4.0 Production on Mon Dec 7 19:02:19 2015

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Enter user-name: supersuper
Enter password: **********

-aオプションの直後(スペース文字を入れると、「スペース入れるな!」って怒られた)に指定した文字列が来た時は、パスワードだと見做してreadlineを通さなくなる、様子。
ちなみに"Enter password:"の状態で-aオプション *無し* の時でも *↑↓キーによる履歴呼び出しが可能* なので、一度パスワードが記録されると何となく雰囲気でログインできるかも知れない。


$ rlwrap -p"YELLOW" sqlplus

SQL*Plus: Release 11.2.0.4.0 Production on Mon Dec 7 19:15:38 2015

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Enter user-name: supersuper
Enter password:

う、テキストべた張りだと感動が伝わらないと思いますが、プロンプトが全て黄色太文字になってます。
"yellow"だと太文字ではない様子。"RED"だと赤太文字、"red"だと赤細文字でした。へーすごい。MySQLでいうところの--pagerにカラーコード仕込む感じですね。でもこっちの方が英語で指定できていいなぁ。ってかmysqlコマンドラインクライアントもrlwrap経由で起動させてやれば 日々の覚書: MySQL 5.6以降のmysqlコマンドラインクライアントでプロンプトに色を付けるcmakeオプション なんてのも必要なくなりそう。うむ。


$ rlwrap -z"pipeto" sqlplus
..
SQL> SELECT * FROM ..; | less -S -r

そして極め付け。SQLの結果をそのまま別のプロセスにパイプで渡せるpipetoフィルター。mysqlにはpagerコマンドがあるので気楽にlessに食わせられるけれど、sqlplusにはお手軽なのがないらしい。

`-z"pipeto"`オプションを付けると、出力をパイプに向けられる。
( *出力を* 向けるので、パイプの手前までで出力が開始されてないとダメ。つまりSQLなら *セミコロンまで打ち込んでからパイプを付ける* 

ところでこれ、MySQLは文字列結合に"||"演算子を使わないから良いとして、Oracleはよく使いそう(偏見)なので、上手くやってくれ…

SQL> SELECT 'a' || 'b'; | wc

sh: -c: line 0: 期待してない token `|' のあたりにシンタックスエラー
sh: -c: line 0: `| 'b'; | wc'

  2

る訳がなかった。そりゃ別にsqlplus用のユーティリティーってわけじゃあるまいし。
幸いにしてフィルターの類はPerlで書かれているらしいので、ちょっと探してみる。


$ rpm -ql rlwrap
/usr/bin/rlwrap
/usr/share/doc/rlwrap-0.41
/usr/share/doc/rlwrap-0.41/AUTHORS
/usr/share/doc/rlwrap-0.41/COPYING
/usr/share/doc/rlwrap-0.41/NEWS
/usr/share/doc/rlwrap-0.41/README
/usr/share/man/man1/rlwrap.1.gz
/usr/share/man/man3/RlwrapFilter.3pm.gz
/usr/share/rlwrap
/usr/share/rlwrap/completions
/usr/share/rlwrap/completions/coqtop
/usr/share/rlwrap/completions/testclient
/usr/share/rlwrap/filters
/usr/share/rlwrap/filters/README
/usr/share/rlwrap/filters/RlwrapFilter.3pm
/usr/share/rlwrap/filters/RlwrapFilter.pm
/usr/share/rlwrap/filters/censor_passwords
/usr/share/rlwrap/filters/count_in_prompt
/usr/share/rlwrap/filters/ftp_filter
/usr/share/rlwrap/filters/history_format
/usr/share/rlwrap/filters/listing
/usr/share/rlwrap/filters/logger
/usr/share/rlwrap/filters/null
/usr/share/rlwrap/filters/paint_prompt
/usr/share/rlwrap/filters/pipeline
/usr/share/rlwrap/filters/pipeto
/usr/share/rlwrap/filters/scrub_prompt
/usr/share/rlwrap/filters/simple_macro
/usr/share/rlwrap/filters/template
/usr/share/rlwrap/filters/unbackspace

$ vim /usr/share/rlwrap/filters/pipeto
..
 50 sub input {
 51   my $input;
 52   $raw_input = $_;
 53   ($input, undef, $pipeline) =  /([^|]*)(\|(.*))?/;
 54   return $input;
 55 }
..

ここで切り分けているぽい。最初のパイプの手前までが元のコマンド、パイプの後ろがフィルターになってる。
そこでこんなパッチにしてみました。


*** /usr/share/rlwrap/filters/pipeto.orig       2010-01-03 21:42:16.000000000 +0900
--- /usr/share/rlwrap/filters/pipeto    2015-12-08 10:58:54.817411488 +0900
***************
*** 53 ****
!   ($input, undef, $pipeline) =  /([^|]*)(\|(.*))?/;
--- 53,54 ----
!   ($input, $pipeline) =  /(.+)?\s+\|\s+(.*)?/;
!   $input= $_ unless $input;

" | "(空白、パイプ、空白。空白は1つ以上の任意の個数でOK)をパイプと認識させるように変更。


SQL> SELECT 'a' || 'b' FROM dual /* パイプを通る */; | less
'A
--
ab

SQL> SELECT 'a' || 'b' FROM dual /* パイプを通らない */; |less
  2 

パイプを通らない場合、"|less"までをsqlplusが解釈しようとするのでちゃんと出力されませんね(これは-z"pipeto"を取ってもそんな動きだった)


ざっとマニュアルを読んで面白そうだったものの紹介でした!
(個人的にはパスワードプロンプトで↑↓使えたのが面白かった)

2015/12/09

pt-online-schema-changeと5.6 InnoDBのオンラインALTER TABLE使い分け

この記事は MySQL Casual Advent Calendar 2015 の9日目です。

MySQL 5.6から InnoDBのオンラインDDL が導入されて久しいですが、一方で pt-online-schema-change (以下pt-osc)もまだまだ元気です。MySQL 5.5とそれより前ではpt-osc一択になりますが、MySQL 5.6とそれ以上の場合はInnoDBさんに任せるかpt-oscを使うかを選択することができます。

MySQL 5.6でもpt-osc一択にしても構わないといえば構わないんですが、いくつかのケースではInnoDBさんに任せた方が速くなったり安定したりするので、そのあたり解説していきます。


TL;DR

ウチの使い分け。
  • 原則 pt-osc
  • スレーブの台数が多すぎない かつ
    • データ容量が馬鹿でかくてストレージ食いつぶしそう または
    • INSERT大杉で2度のメタデータロックが馬鹿にならない または
    • デッドロック大杉 なら
    • InnoDB Online DDLでRSU(Rolling Schema Upgrade)

When pt-osc?

  • pt-oscの仕組みをざっくり
    • 元テーブルから新しいテーブル(空っぽ)を作って
    • 空っぽのテーブルにALTER TABLEをかけて
    • 元テーブルへの更新をトリガーでフックしながら古いデータをコピーする
    • コピーが終わったらRENAME TABLEで新旧テーブルを入れ替える
  • 古いデータをコピーする処理を細切れにしてくれるので、レプリケーションスレーブを詰まらせることが少ない
    • あと、スレーブの遅延監視のための --recursion-methodが結構柔軟に設定できる ので、「MySQL 5.6だからオンラインALTER TABLEいけるじゃん?」「ざんねん! SQLスレッドは同時に1つのクエリーしかさばけない!」ということはない
  • 古いデータをコピーする処理が細切れなので、
    • デッドロックがボコボコ出たりする
    • binlogを抱いて溺死
  • まるまるテーブルをコピーするので
    • 容量に十分な余裕が必要
    • バッファプールもそれなりに圧迫する
    • binlogを抱いて(ry
  • トリガーを張る時、RENAME TABLEのタイミングでメタデータロックを取る
    • 同時アクセス(メタデータロックなのでSELECTも含む)が多い環境だと割と簡単に詰まる
    • 先行トランザクションが終了するまでメタデータロック待ちするので、その更に後から来たクエリーはメタデータロックが取れるまで待たされる
      • trx1> SELECT .. -- コイツが終わらないとき
      • trx2> RENAME TABLE .. -- コイツが"Waiting for table metadata lock"になり
      • trx3> SELECT .. -- コイツも"Waiting for table metadata lock"になる
    • メタデータロックとHandlerSocket Pluginの相性が最悪
    • pt-osc開始時のメタデータロックはまだ「様子を見ながら開始する」「引っかかったら即中断」することができるけど、終了直前のは祈るしかない(;-人-)
      • 中断した場合、一時テーブルとトリガーのお片付けは自分でやる必要がある
        • 先にDROP TABLEするとトリガーが転け続けるので必ずDROP TRIGGERから先にやること
  • 入れ替えたあとに要らなくなった方のDROP TABLEが走るので、 lazy drop table を食らったことがある
    • lazy drop tableは直ったことになってるんだっけ?
  • テーブルがまるまる再作成されるので、ついでにOPTIMIZEがかかったようなもの

When InnoDB Online DDL?

  • InnoDBオンラインDDLの仕組みをざっくり
    • ALTER TABLEで追加するインデックス, カラムなどを先に.ibdの外側に作っておくイメージ
      • ソートやもろもろ終わってから、.ibdファイルにマージする感じ
    • 追加するインデックスやカラムに対するALTER TABLE中の更新はtmpdirに書き出しておいて後からマージ
  • マスターで1時間かかったALTER TABLEがスレーブでも1時間かかるのはブロッキングなALTER TABLEと同じ
    • スレーブの更新クエリーはSQL_threadからしか入ってこないので、SQL_threadがALTER TABLEを掴みっぱなしになって結局レプリケーションが遅れる
    • マスターとスレーブで *レプリケーションを通さずに* それぞれオンラインALTER TABLEをかけることで回避する
      • この手間が惜しい場合はこっちは使えない
      • Rolling Schema Upgrade(RSU)って言うらしい
  • テーブル全体のコピーが発生しないのでI/O量がpt-oscに比べて少ない
    • とはいえそれなり(もとのFast Index Creation相当)のI/Oは発生する
    • binlogにやさしい
  • カラムのデータを読み取る処理はロックを取らないのでデッドロックは起こらない
  • メタデータロックに関しては開始時と終了時らしい
    • 開始時のメタデータロックに関する注意事項はpt-oscと同じ。長時間トランザクションが来てないタイミングを見計らって開始
    • 終了時に.ibdファイルにもろもろマージするタイミングでもメタデータロックを取るらしいけれど、pt-oscと違って目に見えた範囲で問題になったことはない
      • pt-oscはステートメントでロックを取るステートメントを実行するのに対し、内部のAPIでロックを取るからなのかしらん?
  • オペレーションを選ぶ。たとえばALTER TABLE .. MODIFYでデータ型が変わるものはブロッキングなALTER TABLEになる
  • ポイントインタイムリカバリー(PITR)ととても相性が悪い
    • RSUでない場合、単純にmysqlbinlogの結果を食わせる場合に結局そのスレッドを占有してしまう。
    • *RSUでbinlogに書き出させない場合、このALTER TABLEだけPITRできなくなってしまう。*

という訳で、InnoDBのオンラインALTER TABLEでRSUするやり方。


master> SET SESSION sql_log_bin= 0;
master> ALTER TABLE ..;

slave1> SET SESSION sql_log_bin= 0; -- binlog吐いてるなら。中間マスターでない限り必須ではない。好み。
slave1> ALTER TABLE ..;

slave2> SET SESSION sql_log_bin= 0; -- 同上
slave2> ALTER TABLE ..;

「やり方」も何もとても簡単。そのALTER TABLEだけbinlogに出力させないようにして、 *マスターとスレーブ全てのサーバーで* ALTER TABLEを実行する。

この方法だとbinlogに一切合財ALTER TABLEの情報が載らなくなるので、このALTER TABLEをまたぐ期間のPITRができなくなる。RSU後にフルバックアップ推奨。
(インデックス追加くらいなら後から来たクエリーも特に問題ないけど、カラム追加だとアプリのリリースかけた後のクエリーが全部詰まって死ぬ)
なので運用上は *原則pt-osc* としています。何回かやってもpt-oscに失敗する(あるいは容量不足でpt-oscができないことが明白)な場合だけRSU。


用法、用量を守って使い分けると便利です。

2015/12/08

MySQL 5.5とそれ以前のマスターにMySQL 5.7のスレーブはぶら下げられない(5.7.13で修正)

出来ないのは仕様だそうです。ステータスは"Not a Bug"

MySQL Bugs: #79272: MySQl 5.5 master fails to replicate to MySQL 5.7.9


【2016/07/08 12:04】
MySQL Bugs: #80962: Replication does not work when @@GLOBAL.SERVER_UUID is missing on the master で改めてFIXされました。 5.7.13から5.5系のマスターにつなげるようになっています。


これはレプリケーションの開始時にI/Oスレッドがマスターのserver_uuidサーバー変数を参照しに行くんだけど、その値が取れなくてエラーになる。

…あれ、これどこかで聞いたことある気がする。と思ったら5.6の時に軽く調べてた。
日々の覚書: MySQL 5.6より前のマスターにMySQL 5.6のスレーブをぶら下げるとワーニングが出る(Err: 1193)

MySQL 5.6からMySQL 5.5は同じくserver_uuid変数を参照するものの、I/Oスレッドはアボートせずワーニング止まりだった。それがMySQL 5.7では止まる。

試しにMySQL::Sandboxで5.5.46, 5.6.27, 5.7.9を浮かしてみると

mysql [localhost] {msandbox} ((none)) > CHANGE MASTER TO master_host= '127.0.0.1', master_port= 5627, master_user= 'rsandbox', master_password= 'rsandbox', master_log_file= 'bin.000001', master_log_pos= 1 FOR CHANNEL 'mysql56';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql [localhost] {msandbox} ((none)) > CHANGE MASTER TO master_host= '127.0.0.1', master_port= 5546, master_user= 'rsandbox', master_password= 'rsandbox', master_log_file= 'bin.000001', master_log_pos= 1 FOR CHANNEL 'mysql55';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql [localhost] {msandbox} ((none)) > START SLAVE;
Query OK, 0 rows affected (0.01 sec)

mysql [localhost] {msandbox} (performance_schema) > SELECT * FROM performance_schema.replication_connection_status;
+--------------+------------+--------------------------------------+-----------+---------------+---------------------------+--------------------------+--------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+
| CHANNEL_NAME | GROUP_NAME | SOURCE_UUID                          | THREAD_ID | SERVICE_STATE | COUNT_RECEIVED_HEARTBEATS | LAST_HEARTBEAT_TIMESTAMP | RECEIVED_TRANSACTION_SET | LAST_ERROR_NUMBER | LAST_ERROR_MESSAGE                                                                                                                               | LAST_ERROR_TIMESTAMP |
+--------------+------------+--------------------------------------+-----------+---------------+---------------------------+--------------------------+--------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+
| mysql55      |            |                                      |      NULL | OFF           |                         0 | 0000-00-00 00:00:00      |                          |              1593 | Fatal error: The slave I/O thread stops because a fatal error is encountered when it tries to get the value of SERVER_UUID variable from master. | 2015-12-08 15:54:40  |
| mysql56      |            | 9b2a8e7a-9d57-11e5-8f87-02018582356a |        42 | ON            |                         2 | 2015-12-08 15:55:40      |                          |                 0 |                                                                                                                                                  | 0000-00-00 00:00:00  |
+--------------+------------+--------------------------------------+-----------+---------------+---------------------------+--------------------------+--------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+
2 rows in set (0.00 sec)


5.7と5.5は確かにエラった。

5.6から5.5だと

mysql [localhost] {msandbox} ((none)) > CHANGE MASTER TO master_host= '127.0.0.1', master_port= 5546, master_user= 'rsandbox', master_password= 'rsandbox', master_log_file= 'bin.000001', master_log_pos= 1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql [localhost] {msandbox} ((none)) > START SLAVE;
Query OK, 0 rows affected (0.02 sec)

mysql [localhost] {msandbox} ((none)) > SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 127.0.0.1
                  Master_User: rsandbox
                  Master_Port: 5546
                Connect_Retry: 60
              Master_Log_File: bin.000001
          Read_Master_Log_Pos: 107
               Relay_Log_File: mysql_sandbox5627-relay-bin.000002
                Relay_Log_Pos: 264
        Relay_Master_Log_File: bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
..

エラーにはならない。コードを眺めてみると、5.6では "SHOW VARIABLES LIKE 'SERVER_UUID'"して、ちゃんとserver_uuidが返ってくる(server_uuidをサポートしている5.6以上)かエラーになる(予期しない想定外の事態なんだと思う)か空の結果セットが返ってくる(5.5とそれより前の、server_uuidをサポートしていないバージョン)かの3択で切り分けていた。

https://github.com/mysql/mysql-server/blob/12ec343846f2c1ed9f0454ccca8997afc4a0bb5f/sql/rpl_slave.cc#L1877-L1880


それが5.7だと"SELECT @@GLOBAL.SERVER_UUID"で取ろうとするので、server_uuidをサポートしていないバージョンだと"Unknown system variable"で一発エラーになってFatalでI/Oスレッドが止まる。

mysql [localhost] {msandbox} ((none)) > SELECT @@GLOBAL.SERVER_UUID;
ERROR 1193 (HY000): Unknown system variable 'SERVER_UUID'

https://github.com/mysql/mysql-server/blob/ef4fcf760a2d3b098a475323e289a6cab57020ab/sql/rpl_slave.cc#L2356-L2358


という訳で、MySQL 5.7のmysql_upgradeでイケるにしてもレプリケーションに属するサーバーを全部いっぺんに上げない限りは5.5から5.7へはジャンプできないのでした(´・ω・`)


【2016/07/08 12:04】

5.7.13で5.5とそれ以前のマスターのスレーブになれるようになりました。

MySQL Bugs: #80962: Replication does not work when @@GLOBAL.SERVER_UUID is missing on the master

> Replication: Slaves running MySQL 5.7 could not connect to a MySQL 5.5 master due to an error retrieving the server_uuid, which is not part of MySQL 5.5. This was caused by changes in the method of retrieving the server_uuid. (Bug #22748612)

http://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-13.html

とはいえそもそも2世代またいだレプリケーションはサポート対象外ではある。

しかし、 MySQL Bugs: #79272: MySQl 5.5 master fails to replicate to MySQL 5.7.9 の "Not a Bug" は何だったのか。

2015/12/04

MySQL Routerつらくない(CentOS 6.6でもビルドがしたい編)

この記事は MySQL Fabric&Routerつらくない Advent Calendar 2015 の4日目です。

昨日 の時点で、CentOS 7.1のコンテナーなら問題なくyumでインストールして動作確認ができることはわかりました。しかしまあ、勤め先の本番環境はほとんどがCentOS 6.xなので、どうせならそっちで動く形式にしておきたい(特に、MySQL RouterのスタイルからしてAPサーバーに載せるのが具合がいい気がするので)

SPECファイルの.in を見ている限り、systemdがない環境でもちゃんと選んでビルドしてくれそうではあったので頑張ってみることにした。

TL;DR


という訳で色々試してるんですが、rpmのビルドには失敗します。しょんぼり。誰か判ったら教えてください。バイナリー.tar.gzっぽいのはできたのでそろそろ諦めます。


CentOS 7.1ではビルドに成功する


$ rpm -i mysql-router-2.0.2-1.el7.src.rpm
$ cd rpmbuild/SPECS/
$ rpmbuild -bb mysql-router.spec
..
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/mysql-router-2.0.2-1.el7.centos.x86_64
Wrote: /root/rpmbuild/RPMS/x86_64/mysql-router-2.0.2-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/mysql-router-debuginfo-2.0.2-1.el7.centos.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.cku59B
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd mysql-router-2.0.2
+ rm -rf /root/rpmbuild/BUILDROOT/mysql-router-2.0.2-1.el7.centos.x86_64
+ exit 0

まあ、当然ですが上手くいきました。


CentOS 6.6だとダメ


$ rpm -i mysql-router-2.0.2-1.el7.src.rpm
$ cd rpmbuild/SPECS/
$ scl enable devtoolset-2 "rpmbuild -ba mysql-router.spec"
..
Processing files: mysql-router-2.0.2-1.el6.x86_64
error: File not found: /root/rpmbuild/BUILDROOT/mysql-router-2.0.2-1.el6.x86_64/etc/init.d/mysqlrouter
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.q5xdpa
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd mysql-router-2.0.2
+ DOCDIR=/root/rpmbuild/BUILDROOT/mysql-router-2.0.2-1.el6.x86_64/usr/share/doc/mysql-router-2.0.2
+ export DOCDIR
+ rm -rf /root/rpmbuild/BUILDROOT/mysql-router-2.0.2-1.el6.x86_64/usr/share/doc/mysql-router-2.0.2
+ /bin/mkdir -p /root/rpmbuild/BUILDROOT/mysql-router-2.0.2-1.el6.x86_64/usr/share/doc/mysql-router-2.0.2
+ cp -pr License.txt README.txt /root/rpmbuild/BUILDROOT/mysql-router-2.0.2-1.el6.x86_64/usr/share/doc/mysql-router-2.0.2
+ exit 0


RPM build errors:
    File not found: /root/rpmbuild/BUILDROOT/mysql-router-2.0.2-1.el6.x86_64/etc/init.d/mysqlrouter

明らかにsystemdを使わない判定の方に転がって、sysvinitスタイルのものが見付からないとかなんとか言ってる。
ソースを落としてみるとpackagingディレクトリーにbuild_rpm.shとかいうのもあってそっちも試してみたけれど、なんかこっちは最終的にmysql-router-commercial-*.tar.gzを要求されてビルドが転ける。


仕方がないのでバイナリー.tar.gz版ぽいものをビルド


$ scl enable devtoolset-2 "cmake -DINSTALL_LAYOUT=STANDALONE -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-router"
$ make
$ VERBOSE=1 sudo make install
..
Install the project...
/usr/bin/cmake -P cmake_install.cmake
-- Install configuration: ""
-- Up-to-date: /usr/local/mysql-router/include/mysql/mysqlrouter/config_parser.h
-- Up-to-date: /usr/local/mysql-router/include/mysql/mysqlrouter/plugin.h
-- Up-to-date: /usr/local/mysql-router/include/mysql/mysqlrouter/filesystem.h
-- Up-to-date: /usr/local/mysql-router/include/mysql/mysqlrouter/loader.h
-- Up-to-date: /usr/local/mysql-router/lib/libmysqlharness.a
-- Installing: /usr/local/mysql-router/lib/libmysqlharness.so.0
-- Up-to-date: /usr/local/mysql-router/lib/libmysqlharness.so
-- Installing: /usr/local/mysql-router/lib/mysqlrouter/logger.so
-- Up-to-date: /usr/local/mysql-router/include/mysql/mysqlrouter/logger.h
-- Installing: /usr/local/mysql-router/lib/mysqlrouter/keepalive.so
-- Installing: /usr/local/mysql-router/lib/mysqlrouter/fabric_cache.so
-- Up-to-date: /usr/local/mysql-router/include/mysql/mysqlrouter/fabric_cache.h
-- Installing: /usr/local/mysql-router/lib/mysqlrouter/routing.so
-- Up-to-date: /usr/local/mysql-router/include/mysql/mysqlrouter/routing.h
-- Installing: /usr/local/mysql-router/docs/README.txt
-- Installing: /usr/local/mysql-router/docs/License.txt
-- Installing: /usr/local/mysql-router/docs/sample_mysqlrouter.ini
-- Up-to-date: /usr/local/mysql-router/include/mysql/mysqlrouter/datatypes.h
-- Up-to-date: /usr/local/mysql-router/include/mysql/mysqlrouter/utils.h
-- Up-to-date: /usr/local/mysql-router/include/mysql/mysqlrouter/plugin_config.h
-- Installing: /usr/local/mysql-router/bin/mysqlrouter
-- Installing: /usr/local/mysql-router/lib/libmysqlrouter.so.1
-- Up-to-date: /usr/local/mysql-router/lib/libmysqlrouter.so

これで/usr/lcoal/mysql-routerの下に全部押し込められた気がする。
他のコンテナーにコピーして展開してみる。


$ tar -C /usr/local -cf mysql-router-2.0.2.glibc12.tar.gz mysql-router/
$ docker cp build:/root/mysql-router-2.0.2.glibc12.tar.gz ./
$ docker run -v /home/yoku0825/mysql-router-2.0.2.glibc12.tar.gz:/root/mysql-router-2.0.2.glibc12.tar.gz -it centos:centos6.6 bash
# /usr/local/mysql-router/bin/mysqlrouter
bin/mysqlrouter: error while loading shared libraries: libmysqlrouter.so.1: cannot open shared object file: No such file or directory
# LD_LIBRARY_PATH=/usr/local/mysql-router/lib /usr/local/mysql-router/bin/mysqlrouter --help
Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Start MySQL Router.

Configuration read from the following files in the given order (enclosed
in parentheses means not available for reading):
  (./mysqlrouter.ini)
  (/root/.mysqlrouter.ini)

Usage: mysqlrouter [-v|--version] [-h|--help]
                   [-c|--config=]
                   [-a|--extra-config=]

Options:
  -v, --version
        Display version information and exit.
  -h, --help
        Display this help and exit.
  -c , --config 
        Only read configuration from given file.
  -a , --extra-config 
        Read this file after configuration files are read from either
        default locations or from files specified by the --config
        option.

ライブラリーパスさえ通せば動きそうだった。つらくない!

2015/12/03

MySQL Routerつらくない(yumでインストールして動かしてみた編)

この記事は MySQL Fabric&Routerつらくない Advent Calendar 2015 の3日目です。

昨日 の時点で、CentOS 6.6でMySQL Routerを試すには自前ビルドしないといけないことが判明しました。つらい だが俺にはDockerがある。CentOS 6.6の上でCentOS 7.1のコンテナー動かせばいいじゃん。systemdとか動かなそうだけど取り敢えず試すだけだからこういう時に便利ですよね! つらくない!


$ sudo docker run -it centos:centos7 bash
# yum install -y http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
# yum install -y mysql-router
..
Installed:
  mysql-router.x86_64 0:2.0.2-1.el7

Complete!

お手軽! …って、mysql-routerの依存関係で引きずられてmysql-community-libsとか入るかと思ったけど入ってない。いいのかな。。


# rpm -ql mysql-router
/etc/mysqlrouter
/etc/mysqlrouter/mysqlrouter.ini
/usr/lib/systemd/system/mysqlrouter.service
/usr/lib/tmpfiles.d/mysqlrouter.conf
/usr/lib64/libmysqlharness.so
/usr/lib64/libmysqlharness.so.0
/usr/lib64/libmysqlrouter.so
/usr/lib64/libmysqlrouter.so.1
/usr/lib64/mysqlrouter
/usr/lib64/mysqlrouter/fabric_cache.so
/usr/lib64/mysqlrouter/keepalive.so
/usr/lib64/mysqlrouter/logger.so
/usr/lib64/mysqlrouter/routing.so
/usr/sbin/mysqlrouter
/usr/share/doc/mysql-router-2.0.2
/usr/share/doc/mysql-router-2.0.2/License.txt
/usr/share/doc/mysql-router-2.0.2/README.txt
/var/log/mysqlrouter
/var/run/mysqlrouter

# cat /usr/lib/systemd/system/mysqlrouter.service
[Unit]
Description=MySQL Router
After=syslog.target
After=network.target

[Service]
Type=simple
User=mysql
Group=mysql

PIDFile=/var/run/mysqlrouter/mysqlrouter.pid

ExecStart=/usr/sbin/mysqlrouter

PrivateTmp=true

[Install]
WantedBy=multi-user.target

rpmファイルの構成としては至極フツーな感じ。systemdもただ/usr/sbin/mysqlrouterしてるだけみたいだから取り敢えずやってみようかしら。


# mysqlrouter &
Logging to /var/log/mysqlrouter/mysqlrouter.log

# less /var/log/mysqlrouter/mysqlrouter.log
2015-12-02 05:13:52 INFO    [7f9173b46700] keepalive started with interval 60
2015-12-02 05:13:52 INFO    [7f9173b46700] keepalive
2015-12-02 05:14:52 INFO    [7f9173b46700] keepalive
2015-12-02 05:15:52 INFO    [7f9173b46700] keepalive

# ss -ltpn
State      Recv-Q Send-Q                               Local Address:Port                                 Peer Address:Port

あれ、どこのポートもLISTENしてない。
ドキュメント をナナメ読みしてみた感じ、どうも[routing:xxx]セクションに設定をしたぶんだけポートをLISTENするシロモノであるっぽい。


# vim /etc/mysqlrouter/mysqlrouter.ini
..
[routing:sakila_blue]
bind_port= 7001
mode= read-write
destinations= 127.0.0.1:3306

# mysqlrouter &
Logging to /var/log/mysqlrouter/mysqlrouter.log

# ss -ltpn
State      Recv-Q Send-Q                               Local Address:Port                                 Peer Address:Port
LISTEN     0      0                                        127.0.0.1:7001                                            *:*      users:(("mysqlrouter",40,4))

# less /var/log/mysqlrouter/mysqlrouter.log
2015-12-02 15:23:48 INFO    [7fae2cb46700] routing:sakila_blue started: listening on 127.0.0.1:7001; read-write
2015-12-02 15:23:48 INFO    [7fae2d547700] keepalive started with interval 60
2015-12-02 15:23:48 INFO    [7fae2d547700] keepalive

# vim /etc/mysqlrouter/mysqlrouter.ini
..
[routing:master]
bind_port= 7001
mode= read-write
destinations= 127.0.0.1:13454

[routing:slave]
bind_port= 7002
mode= read-only
destinations= 127.0.0.1:13455,127.0.0.1:13456

# pkill mysqlrouter
# mysqlrouter &
Logging to /var/log/mysqlrouter/mysqlrouter.log

# ss -ltpn
State      Recv-Q Send-Q                               Local Address:Port                                 Peer Address:Port
LISTEN     0      0                                        127.0.0.1:7001                                            *:*      users:(("mysqlrouter",49,6))
LISTEN     0      0                                        127.0.0.1:7002                                            *:*      users:(("mysqlrouter",49,4))

# less /var/log/mysqlrouter/mysqlrouter.log
2015-12-02 15:25:28 INFO    [7f0b81e2b700] keepalive started with interval 60
2015-12-02 15:25:28 INFO    [7f0b81e2b700] keepalive
2015-12-02 15:25:28 INFO    [7f0b8142a700] routing:slave started: listening on 127.0.0.1:7002; read-only
2015-12-02 15:25:28 INFO    [7f0b80a29700] routing:master started: listening on 127.0.0.1:7001; read-write

ふむふむ。
MySQL Proxyは1対多のプロキシしか構成できなかったけど、MySQL Routerだと多対多のプロキシが構成できるのね。


このコンフィグは組み込みでサポートしてる「Connection Routing」に当たるもので、MySQL Fabricは取り敢えず今日は関係なさげ。。見た目、Connector/Jのfailover記法みたいな感じで転けたら次のホストに行くって動作をさせられる様子。

MySQL :: MySQL Router :: 1.1.1 Connection Routing


* read-writeのポート

$ mysql -umsandbox -pmsandbox --protocol=tcp -P 7001 -e "SELECT @@port"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------+
| @@port |
+--------+
|  13454 |
+--------+

$ mysql -umsandbox -pmsandbox --protocol=tcp -P 7001 -e "SELECT @@port"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------+
| @@port |
+--------+
|  13454 |
+--------+

$ mysql -umsandbox -pmsandbox --protocol=tcp -P 7001 -e "SELECT @@port"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------+
| @@port |
+--------+
|  13454 |
+--------+

$ mysql -umsandbox -pmsandbox --protocol=tcp -P 7001 -e "SELECT @@port"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------+
| @@port |
+--------+
|  13454 |
+--------+


* read-onlyのポート

$ mysql -umsandbox -pmsandbox --protocol=tcp -P 7002 -e "SELECT @@port"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------+
| @@port |
+--------+
|  13455 |
+--------+

$ mysql -umsandbox -pmsandbox --protocol=tcp -P 7002 -e "SELECT @@port"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------+
| @@port |
+--------+
|  13456 |
+--------+

$ mysql -umsandbox -pmsandbox --protocol=tcp -P 7002 -e "SELECT @@port"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------+
| @@port |
+--------+
|  13455 |
+--------+

$ mysql -umsandbox -pmsandbox --protocol=tcp -P 7002 -e "SELECT @@port"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------+
| @@port |
+--------+
|  13456 |
+--------+

$ mysql -umsandbox -pmsandbox --protocol=tcp -P 7002 -e "SELECT @@port"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------+
| @@port |
+--------+
|  13455 |
+--------+

「read-writeは先頭のホストが失敗したら次のホストへ」
「read-onlyはラウンドロビン」
って書いてあった。ちゃんとドキュメントに書いてあるなんてつらくない!

MySQL :: MySQL Router :: 3.2.2 Connection Routing (Standalone)


マスターを落とすとこの通りフローティングしてくれて

$ ./master/stop

$ mysql -umsandbox -pmsandbox --protocol=tcp -P 7001 -e "SELECT @@port"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------+
| @@port |
+--------+
|  13455 |
+--------+

$ ./master/start

$ mysql -umsandbox -pmsandbox --protocol=tcp -P 7001 -e "SELECT @@port"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------+
| @@port |
+--------+
|  13455 |
+--------+

あれ、上げても勝手に戻るわけではないのか。

取り敢えず動いたので楽しい。つらくない!

2015/12/02

MySQL Routerつらくない(自前ビルド時のcmakeエラー編)

この記事は MySQL Fabric&Routerつらくない Advent Calendar 2015 の2日目です。

昨日 はしゃらっと流したcmakeした時のエラーについていくつか。


Could not find MySQL librariesと言われるけど、mysql-community-libsだけじゃなくてmysql-community-develも要求してくる


$ rpm -q mysql-community-libs
mysql-community-libs-5.7.9-1.el6.x86_64

$ cmake .
..
CMake Error at cmake/FindMySQL.cmake:105 (message):
  Could not find MySQL libraries; used
  /root/mysql-router-2.0.2/../mysql-server/lib;/usr/local/mysql/lib;/usr/local/mysql/lib;/usr/local/lib;/usr/lib/x86_64-linux-gnu;/usr/lib/i386-linux-gnu;/usr/lib64;/usr/lib
..

$ sudo yum install -y mysql-community-devel
$ cmake .
..
-- Found MySQL Libraries 5.7.9; using /usr/lib64/mysql/libmysqlclient.so
..

しかもエラーメッセージに含んでるディレクトリー群がlib系のディレクトリーだから 憎い つらくない。


Doxygenはなくても動く


$ cmake .
..
CMake Warning at mysql_harness/cmake/Docs.cmake:27 (message):
  Doxygen not found, no documentation target will be created
..

コールスタック出すから必須なのかと思ったけど、よく見たら"CMake Warning"だった。


デフォルトではインストールされるディレクトリがMySQLっぽくない


$ sudo make install
..
-- Install configuration: ""
-- Up-to-date: /usr/local/include/mysql/mysqlrouter/config_parser.h
-- Up-to-date: /usr/local/include/mysql/mysqlrouter/plugin.h
-- Up-to-date: /usr/local/include/mysql/mysqlrouter/filesystem.h
-- Up-to-date: /usr/local/include/mysql/mysqlrouter/loader.h
-- Up-to-date: /usr/local/lib/libmysqlharness.a
-- Up-to-date: /usr/local/lib/libmysqlharness.so.0
-- Up-to-date: /usr/local/lib/libmysqlharness.so
-- Up-to-date: /usr/local/lib/mysqlrouter/logger.so
-- Up-to-date: /usr/local/include/mysql/mysqlrouter/logger.h
-- Up-to-date: /usr/local/lib/mysqlrouter/keepalive.so
-- Up-to-date: /usr/local/lib/mysqlrouter/fabric_cache.so
-- Up-to-date: /usr/local/include/mysql/mysqlrouter/fabric_cache.h
-- Up-to-date: /usr/local/lib/mysqlrouter/routing.so
-- Up-to-date: /usr/local/include/mysql/mysqlrouter/routing.h
-- Up-to-date: /usr/local/share/doc/mysqlrouter/README.txt
-- Up-to-date: /usr/local/share/doc/mysqlrouter/License.txt
-- Up-to-date: /usr/local/share/doc/mysqlrouter/sample_mysqlrouter.ini
-- Up-to-date: /usr/local/share/doc/mysqlrouter/sample_mysqlrouter.init
-- Up-to-date: /usr/local/include/mysql/mysqlrouter/datatypes.h
-- Up-to-date: /usr/local/include/mysql/mysqlrouter/utils.h
-- Up-to-date: /usr/local/include/mysql/mysqlrouter/plugin_config.h
-- Installing: //var
-- Installing: //var/local
-- Installing: //var/local/mysqlrouter
-- Installing: //var/local/mysqlrouter/log
-- Installing: //var
-- Installing: //var/local
-- Installing: //var/local/mysqlrouter
-- Installing: //var/local/mysqlrouter/run
-- Installing: /usr/local/etc
-- Installing: /usr/local/etc/mysqlrouter
-- Up-to-date: /usr/local/bin/mysqlrouter
-- Up-to-date: /usr/local/lib/libmysqlrouter.so.1
-- Up-to-date: /usr/local/lib/libmysqlrouter.so

MySQL Community Serverは/usr/local/mysqlが全てのベースになってたけど、フツーのアプリケーションっぽく配置される。

* ライブラリー: /usr/local/lib
* ヘッダーファイル: /usr/local/include
* コンフィグ: /usr/local/etc
* ログとか: /var/local/mysqlrouter

うーん、/var/local/mysqlrouterは新しい。rpmだとどうなってるんだろ。


基本的にCentOS(なり、RHEL系は)7向け


MySQL :: Download MySQL Router

* まず、rpmは"Red Hat Enterprise Linux 7 / Oracle Linux 7"向けしかない。
* バイナリーの.tar.gzも"Linux - Generic (glibc 2.17)"なので、CentOS 6.xで動かすにはglibcを更新しないといけない。
* というか、RHEL 7系用のMySQL Toolsリポジトリー(Workbenchとか入ってるとこ)の中にはmysql-routerがある。6系用のリポジトリーにはない。

$ curl -s http://repo.mysql.com/yum/mysql-tools-community/el/7/x86_64 | grep router
[FILE] mysql-router-2.0.2-1.el7.x86_6..> 23-Oct-2015 06:36   1.0M
[FILE] mysql-router-debuginfo-2.0.2-1..> 23-Oct-2015 06:36   2.4M

$ curl -s http://repo.mysql.com/yum/mysql-tools-community/el/6/x86_64 | grep router


ビルドしたやつはちゃんと動くけど、.tar.gzを解凍したやつはもちろん動かない。

$ wget http://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-2.0.2-linux-glibc2.17-x86-64bit.tar.gz
$ tar xf mysql-router-2.0.2-linux-glibc2.17-x86-64bit.tar.gz
$ cd mysql-router-2.0.2-linux-glibc2.17-x86-64bit
$ bin/mysqlrouter
bin/mysqlrouter: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /root/mysql-router-2.0.2-linux-glibc2.17-x86-64bit/bin/../lib/libmysqlrouter.so.1)
bin/mysqlrouter: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /root/mysql-router-2.0.2-linux-glibc2.17-x86-64bit/bin/../lib/libmysqlrouter.so.1)
bin/mysqlrouter: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /root/mysql-router-2.0.2-linux-glibc2.17-x86-64bit/bin/../lib/libmysqlrouter.so.1)
bin/mysqlrouter: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /root/mysql-router-2.0.2-linux-glibc2.17-x86-64bit/bin/../lib/libmysqlharness.so.0)
bin/mysqlrouter: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /root/mysql-router-2.0.2-linux-glibc2.17-x86-64bit/bin/../lib/libmysqlharness.so.0)

うう、CentOS 7なマシンが欲しいよう。

2015/12/01

MySQL Routerはつらくない。何故ならまだ触っていないからだ。

この記事は MySQL Casual Advent Calendar 2015 の1日目です。
MySQL Fabric&Routerつらくない Advent Calendar 2015 の1日目でもあります。

さて…昨年あんなにも MySQL Fabric関連のブログ を書いたのに、少なくとも2015/12/1現在、MySQL Fabricがちっとも流行ってないのは何故だろうとか考えてみました。

  1. Fabric対応コネクターが必要
  2. MySQL 5.6以上かつGTIDが必要
  3. バッキングストア(mysqlfabricデーモンが情報をストアするためのmysqld)を自前で冗長化しないといけない
  4. ググったら 「MySQL Fabric つらい」 とかサジェストされる
やっぱり1ですかね。いや、あるにはあるんですが、俺(と、俺の勤めている会社)の利用可能な範囲になくて、Connecto/J, Connector/Python がサポートされてるし…おや、 去年からずっと思ってた んですが相変わらずConnector/.NETがサポートしてるはずなのに書いてないぞ。。

肝心のConnector/C (DBD::mysqlはコイツ依存)はまだLabsにいるし、mysqlndのMySQL Fabricも2015/12/1現在でまだ"pre-alpha"ってことになってる(シャード機能には対応してるけどHA機能には対応してない…とか1年前には書いてあったけど、HA機能に対応した素振りもなければ対応してないとも書いてなくなった。。)


でも。2015年10月。
MySQL 5.7のGA と同時にMySQL Router のGAも発表されました(されたんですよ!)
このMySQL Router、ちょっと話を聞いてみた限りだと、

  • MySQL ProxyみたいにmysqlrouterがポートをLISTENして、実際の処理はバックエンドのMySQL Serverに投げる
  • MySQL Fabricのクライアントになれる(MySQL RouterがFabric対応Connectorの代わりにマスターやシャードの在り処の問い合わせをしてキャッシュしてくれる。アプリからはMySQL Routerにクエリーを投げればそれだけでMySQL Fabric無双)
  • プラグインを書けば他にもゴニョれる

MySQL Fabricのクライアントになって、MySQL Fabric非対応コネクターのクエリーもルーティングしてくれるということで、これで 自分でゴニョったDBD::mysql を使わなくてもMySQL Fabricが試せると。つらくない!


という訳でまずは試しなのでソースからビルドしてみることにしましょう。ダウンロードページは ここ


$ wget http://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-2.0.2.tar.gz
$ tar xf mysql-router-2.0.2.tar.gz
$ cd mysql-router-2.0.2
$ cmake -i
..
Variable Name: ROUTER_CONFIGDIR
Description: Location of configuration file(s) (config_folder)
Current Value: /usr/local/etc/mysqlrouter
New Value (Enter to keep current value):

Variable Name: ROUTER_LOGDIR
Description: Location of log files; empty is console (logging_folder)
Current Value: /var/local/mysqlrouter/log
New Value (Enter to keep current value):

Variable Name: ROUTER_PLUGINDIR
Description: Location MySQL Router plugins (plugin_folder)
Current Value: /usr/local/lib/mysqlrouter
New Value (Enter to keep current value):

Variable Name: ROUTER_RUNTIMEDIR
Description: Location runtime files such as PID file (runtime_folder)
Current Value: /var/local/mysqlrouter/run
New Value (Enter to keep current value):
..

取り敢えずcmakeしてみて思うことは、ちょっとあっちこっち散らばり過ぎじゃないですかねディレクトリ。
あとはいつもビルドに使うようなモジュールの他にDoxygenが必要だよって言われてみたりする。
Doxygenを入れたらCMakeCache.txtを消してからもう一度cmakeして、さあいざ


$ make
[  2%] Building CXX object harness/harness/CMakeFiles/harness-archive.dir/src/loader.cc.o
cc1plus: error: unrecognized command line option "-Wpedantic"
make[2]: *** [harness/harness/CMakeFiles/harness-archive.dir/src/loader.cc.o] Error 1
make[1]: *** [harness/harness/CMakeFiles/harness-archive.dir/all] Error 2
make: *** [all] Error 2

あっ! これ確かLabsの時にも引っかかったやつだ! つらくない!



メッセージはちょっと違ったっぽいけど。


$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ sudo wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo
$ sudo yum install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++
$ scl enable devtoolset-2 bash

CentOS 6.5にGCC 4.8.2をレポジトリで入れてみた - 以下省略! こちら様を参考にしてgcc-4.8.2を放り込んで、cmakeのオプションに渡してやると

$ rm CMakeCache.txt
$ cmake -DCMAKE_CXX_COMPILER:FILEPATH=/opt/rh/devtoolset-2/root/usr/bin/g++ CMAKE_C_COMPILER:FILEPATH=/opt/rh/devtoolset-2/root/usr/bin/gcc .
$ make
..
Linking CXX executable ../../../stage/bin/mysqlrouter
[100%] Built target mysqlrouter

通ったー! やっと通ったー!

なお、ここまで(前に引っかかったにも関わらず)1時間かかっている。Labsの時にあった `cmake .`でインソースビルドできないやつ も直ってるけど、rpmで入れればよかった。でもrpmという選択肢がある時点でつらくない!



( ´-`).oO(MySQL Fabric&Routerつらくない Advent Calendar 2015 は明日からコメント欄127文字運用になる予定ですが続きます。