2012年10月26日金曜日

MySQL5.6 .mylogin.cnfで遊んでみる

What's newの頭に書かれているのに誰もやってなさそうなので遊んでみる。

遊んでみるとは言っても、$HOME/.my.cnfにuser=/password=で書くのとやってることは変わらない。
今まで平文で書くのが嫌で特にやってなかったけど、これならやっても良いかなーという風情。

http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html


mysql_config_editor set --user=tpcc --password
Enter password: <パスワード手入力>


$ mysql_config_editor print --all
[client]
user = tpcc
password = *****


とまあこの通り記録される。
何も指定しないとclientセクションに記録されるけれど、セクションを指定することも出来る。



$ mysql_config_editor set --login-path=mysqldump --user=root --password
Enter password: <パスワード手入力>

mysql_config_editor print --all
[client]
user = tpcc
password = *****
[mysqldump]
user = root
password = *****


追加された。
これで-uや-pなしでmysqldumpの時はrootアカウント、
mysqlクライアントやmysqlcheckとかの時はtpccアカウントでログインできる。

予めDBAがこれ作って読み取りだけして配布しておけば、
ユーザーにパスワードを知らせずにそのアカウントでログインした時だけroot使える、とかできる。
これを作っておけば、馬鹿みたいに長いパスワードを作っても怒られなくて済む。。はず。。

DBIにmy.cnfを読み込ませられる様に.mylogin.cnfも読み込ませられる様になれば、
アプリの側にアカウントパスワード情報を平書きしなくても良くなるはず。。

対応してるインターフェイスの情報が見当たらないなぁ。。

2012年10月24日水曜日

mysqldumpslowを自分好みに改造

MySQL-serverに付属してくるmysqldumpslow、
スロウログをなんとなく集約してくれて標準出力に出すアレですが、
個人的にちょこちょこ好みがあったので改造してみました。

1) SQLテキスト中のASCII文字は全てlowercaseに変換してから処理する。
 ⇒オリジナルはSELECT ..とselect ..が違うと集約されないので、集約する様になります。

2) SQLテキスト中のLF文字、連続した空白文字1つの空白文字として扱って集約します。
 ⇒オリジナルは複数行に分けて書いたものと単一行のもので別々に集約されるので、
  それを一括に直します。

……微妙?;


まるごとはこちら。
 https://github.com/yoku0825/my_slowlog/blob/master/mysqldumpslow_ci

patchファイルはこちら。
 https://github.com/yoku0825/my_slowlog/blob/master/mysqldumpslow_ci.patch


Perlはいいな。。自分でいじれるから。

GPLv2ライセンスなので、原著作者とライセンスの表記はそのままにして、
「改変したものであることと改変した人」を明記する。。で良いはず。

mysqlfailoverを試した! が使えなかったorz

取り敢えずGTIDを使ってレプリケーションを組んだ記事と、
MySQL WorkbenchからMySQL Utilitiesだけを引っこ抜いてインストールした記事


mysqlfailoverの使い方自体は割と単純で、

$ mysqlfailover --master=root:root@localhost --candidate=root:root@cent22,root:root@cent23 --discover-slaves-login=root:root --log=/tmp/failover.log --rpl-user=repl:repl

MySQL Replication Failover Utility
Failover Mode = auto     Next Interval = Wed Oct 24 11:35:00 2012

Master Information
------------------
Binary Log File  Position  Binlog_Do_DB  Binlog_Ignore_DB
bin.000005       442

Replication Health Status
+------------+-------+---------+--------+------------+------------------------------------------+
| host       | port  | role    | state  | gtid_mode  | health                                   |
+------------+-------+---------+--------+------------+------------------------------------------+
| localhost  | 3306  | MASTER  | UP     | ON         | OK                                       |
| cent22     | 3306  | SLAVE   | UP     | ON         | OK                                       |
| cent23     | 3306  | SLAVE   | UP     | ON         | Slave has 1 transactions behind master.  |
+------------+-------+---------+--------+------------+------------------------------------------+


joeパスワードなのはご愛嬌。topみたいに画面が更新される様になる。

--masterにはマスターのユーザー名[:パスワード]@ホスト名[:ポート番号]を指定。
mysql.failover_consoleテーブルに書き込みをしたり
mysql.userテーブルから読み込みしたりするので、権限のあるユーザーで。

--candidateにはマスターに昇格できるスレーブの情報を指定。
ユーザー名[:パスワード]@ホスト名[:ポート番号],ユーザー名[:パスワード]@ホスト名[:ポート番号],..
複数指定する時は書いた順番で優先される。
↑のやつだと、
"localhostが転けた時はcent22をマスターに昇格、cent22も転けた時はcent23に昇格"
という意味合い。

--discover-slaves-loginには、
マスターにログインして"SHOW SLAVE HOSTS"を叩けるユーザーを指定する。
--slaves=user@host,user@host,.. で列挙する場合、このオプション要らない。

--rpl-userにはREPLICATION SLAVE権限のユーザーを記載する。
これ書いておかないと謎のユーザー(3306@cent23w)で昇格後の新マスターに
つなぎに行くようになった。
動作的にはmysql.slave_master_infoから読んでる様な気配がするんだけどなぜこうなった。。

で、mysqladmin shutdownで順番に殺してやると、たまにしか上手く行かない(´・ω・`)
マスターを落とした直後に、"ERROR: No candidate found for failover."と言われて
mysqlfailoverスクリプトが落ちる。
 ⇒再現条件はっきりしてない。ログにも
  "WARNING Candidate cent22:3306 does not meet the requirements."
  としか書いてくれないから困る。。


また時間が取れたらがんばる。
というか、GTIDベースのレプリケーションにかなりやられたので、
使う予定の人は今から使っておいた方が絶対に良いと思う。。

2012年10月23日火曜日

Chiba.pm #1に行ってきました

去る10/20、Chiba.pm #1に行ってきました。

全員LT! という触れ込みだったので、恐る恐るへちょい資料を作って、おそるおそる初LT。
いやもういつ椅子が㌧で来るかと(ry

この類の勉強会って、やっぱりそれなりに勉強会に参加している人たちの輪が出来ていて、
立ち上げ初回とはいえそれなりに既に顔見知りの輪があるんだろうなぁと思っていました。
その感覚は概ね間違っていなかったんですが、一見さんの俺でも色々話せたよ!



みなさんちゃんと(?)YAPCとか行ってるんですねー。

息をするようにCPANモジュールを書いちゃう人とか
Perl普段使ってない人がChiba.pmの為に触った感想とか
IPAの問題をdisってみたりとか。


会場のWAVE船橋校さんもLTしてました。ッターン!
次回も多分ここでしょうとのこと。



あ、懇親会、煙草買いに行ってそのまま迷子になってごめんなさい。。orz

2012年10月22日月曜日

mysql.slow_logからデータを抜いてFILE形式にアウトプット

AmazonRDSのスロウログってTABLE形式でしか取れない。
そんな話をChiba.pm#1で聞いてきたので取り敢えずばっこ抜く為だけのPerlを。

https://gist.github.com/3910570


mysql.slow_logにSELECT権限を持ってるアカウントとパスワードだけ指定して叩くだけです。
標準出力に吐きます。

CSVが取れるのであればこっちも使えますが、文字列を色々ごにょごにょしているので
おとなしくDBI使ってるこっちの方が見やすいな。。

2012年10月19日金曜日

mysqlfailoverを試したい(準備。MySQL UtilitiesをLinuxに入れる)

mysqlfailoverその他のMySQL Utilitiesをインストールする。

rpmで入れるとX Window関連の色々なものを要求されて面倒だったので、
ソースから入れることにする。

http://dev.mysql.com/downloads/workbench/5.2.html#downloads


3コマンドでさっくり。

$ tar xzf mysql-workbench-gpl-5.2.44-src.tar.gz
$ cd mysql-workbench-gpl-5.2.44-src/ext/mysql-utilities
python setup.py install --prefix=<インストール先>

--prefixを指定しない場合のデフォルトでは/usrなので、
/usr/binの下にごりごりスクリプトが入る。


mysqldiskusage
# Source on localhost: ... connected.
# Database totals:
+---------------------+--------------+
| db_name             |       total  |
+---------------------+--------------+
| d1                  |   231541199  |
| innodb_memcache     |   231541199  |
| mysql               |   231541199  |
| performance_schema  |   231541199  |
| test                |   231541199  |
| tpcc                |   231541199  |
+---------------------+--------------+

Total database disk usage = 407,571,482 bytes or 388.00 MB

#...done.


動いた!
じゃあ次こそmysqlfailoverに。。

mysqlfailoverを試したい(準備。GTIDでレプリケーション組むところまで)

MySQL 5.6で使えるGTIDの機能を使うと、MHAみたいなことがMySQL Workbench付属の
mysqlfailoverっていうユーティリティで出来るようになるよ!

ということで、試してみるメモ。


まずはVirtualBoxに5.6.7を3台浮かせる。。
_| ̄|○ < 3台は重いなー。。

my.cnfに↓を設定。


log-bin=bin
log-slave-update
gtid-mode = ON
disable-gtid-unsafe-statements

肝心なのはgtid-mode=ONだけだけど、
他のオプションも書いておかないと、
`gtid-mode=ONの時はこれつけないとダメだよ!'って怒られてmysqldが起動しなくなる(´・ω・)


GTIDを有効にしたら、レプリケーションを構成しておく。

mysql> CHANGE MASTER TO MASTER_HOST='cent21',MASTER_USER='repl',MASTER_AUTO_POSITION=1;

MASTER_AUTO_POSITION=1でGTIDを使ったレプリケーションを構築する、らしい。
GTIDを使うので、バイナリログファイル名もポジションも要らなくなる。

スレーブ側で保持している「最後に適用したGTID」の次のGTIDを探して、
それを含むバイナリログとポジションを自動設定してくれる、という様な動きっぽい。


ハマったのは、
121019 10:52:47 [ERROR] Slave I/O: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593
と言われたこと。

サーバIDちゃんと別のにしてるのに! と思ったら、
server_uuidという値をdatadir/auto.cnfに書き込んでいた。
(datadir以下をまるっとマスターからコピーしていたので、これもコピーされたんだ)

これを一度削除して再起動すると、auto.cnfが再作成されてちゃんとユニークになった。


取り敢えずここまで。。


【2012/10/23 12:15】
色々ごにょごにょしていて(やっと)気付いたんだけれど、
disable-gtid-unsafe-statementsを有効にするとトランザクション非対応なテーブルに対する更新を
一切合切拒否る様になる。
つまり、InnoDBだけ更新できて、MyISAMやMemoryはダメ。

http://dev.mysql.com/doc/refman/5.6/en/replication-options-gtids.html

disられてるなぁMyISAM。。(つд`)

2012年10月18日木曜日

VirtualBoxで共有DISKファイルを作る

クラスタソフトの動作確認をする時に必要になったのでメモ。


まずはvdiファイルを新規作成しておく。

$ VBoxManage createhd --filename <ファイル名> --size <DISKのサイズ MB単位> --variant Fixed

共有DISKにセットアップするにはファイルサイズは固定でないといけないので、
--variant Fixedで予めファイル領域を全て確保しておく。



$ VBoxManage showhdinfo shared.vdi
UUID:                 49a0995c-bcaf-4315-8656-82633abde094
Accessible:           yes
Logical size:         10240 MBytes
Current size on disk: 10240 MBytes
Type:                 normal (base)
Storage format:       VDI
Format variant:       fixed default
Location:             D:\VirtualBox\vdis\shared.vdi


こんな風に作ってみた。
Windows上でCygwinからVBoxManage.exeを呼んでます。


$ VBoxManage modifyhd <ファイル名> --type shareable

modifyhdの--typeオプションでshareableを指定すると共有DISK型になる。
一瞬で終わる。



$ VBoxManage showhdinfo shared.vdi
UUID:                 49a0995c-bcaf-4315-8656-82633abde094
Accessible:           yes
Logical size:         10240 MBytes
Current size on disk: 10240 MBytes
Type:                 shareable
Storage format:       VDI
Format variant:       fixed default
Location:             D:\VirtualBox\vdis\shared.vdi



はいOK。
これで複数のVMのストレージポートに同時に繋げられるvdiファイルの完成。

GFS2なりOCFS2なりでmkfsしてやれば完成かな。

2012年10月15日月曜日

information_schema.GLOBAL_STATUSを収集するスクリプト

作ってみた。

https://gist.github.com/3910575


mysql_status_collector.pl の中身をちょこちょこいじる。
1) $sMySQL .. mysqlクライアントをフルパスで指定
2) $sRrdTool .. rrdtoolをフルパスで指定
3) $sWorkDir .. 色々ファイルを吐き出すディレクトリを指定
4) $sUser .. MySQLに接続できるユーザーを指定、SHOW GLOBAL STATUS叩くだけなので何でもOK。
5) $sPass .. ↑のアカウントのパスワード
6) $sInterval .. information_schema.GLOBAL_STATUSを記録する間隔


設定したら↓で起動。
mysqlクライアントがインストールされていないとダメ。
勝手にバックグラウンドに回る。

shell> perl mysql_status_collector.pl collect

止める時は、$sPidFileのファイルを消す。
PIDファイルが無くなると、次のポーリング間隔になった時にそれを見てexitする仕組み。
killしても構わないけれども。
PIDファイルと言いながら中身はからっぽでPIDは書いてないorz

shell> rm -i /tmp/mywork/mysql_status.pid


ファイルを収集した後は、rrdtoolが入っているマシンの同じディレクトリに持っていって

shell> perl mysql_status_collector.pl total

これで勝手にrrdファイルを作ってデータを突っ込んで、グラフを作る。


ログを収集するマシンにはmysqlクライアントとperlだけ入ってればOK、
集計するマシンにはrrdtoolとperlだけ入ってればOK。

取り敢えずなるべくそれだけで動く何かを目指してみた。

2012年10月1日月曜日

MySQL 5.1.66 の新information_schemaを有効にする


取り敢えずやり方だけメモ。
5.1.66のmy.cnfに以下を追記。


ignore-builtin-innodb
plugin-load = innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innodb_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;innodb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_reset=ha_innodb_plugin.so;innodb_buffer_page=ha_innodb_plugin.so;innodb_buffer_page_lru=ha_innodb_plugin.so;innodb_buffer_pool_stats=ha_innodb_plugin.so;


これで5.5.28と同じinformation_schemaが見える様になるます。

MySQL5.5系のチェンジバッファのバグ

ずーっとあるバグだけれども。
一応ステータスはCloseになってるけど、
「ドキュメントにワークアラウンド書いたからCloseしたぜ!」
という。


yymmdd hh:nn:ss  InnoDB: Assertion failure in thread xxx in file ibuf0ibuf.c line yyy
InnoDB: Failing assertion: page_get_n_recs(page) > 1


でエラーログに載るのが特徴。

http://bugs.mysql.com/bug.php?id=61104



5.5で強化されたInnoDBチェンジバッファの強化された部分にバグがあって、
HITするとInnoDBテーブルスペースファイルを巻き込んでクラッシュするという。

ワークアラウンドは5.5で増えた部分を使わない様にすること。
innodb_change_buffering=inserts を指定。



しかもワークアラウンド書いたドキュメントって全然目立たない、5.5.21のチェンジログだけという。

http://dev.mysql.com/doc/refman/5.5/en/news-5-5-21.html


情報量から、HITしてしまう環境では結構HITする、
HITしない環境では全然HITしない、という感じはする。


【2013/01/25 11:53】
この記事読んでる方多いので補足。。

これ5.5.29(2012/12/21)で直ってるらしいです。
Bugsにも追記されて、ChangeLogにも載っています。

http://dev.mysql.com/doc/relnotes/mysql/5.5/en/news-5-5-29.html