GA

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/01

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