AmazonRDSのスロウログってTABLE形式でしか取れない。
そんな話をChiba.pm#1で聞いてきたので取り敢えずばっこ抜く為だけのPerlを。
https://gist.github.com/3910570
mysql.slow_logにSELECT権限を持ってるアカウントとパスワードだけ指定して叩くだけです。
標準出力に吐きます。
CSVが取れるのであればこっちも使えますが、文字列を色々ごにょごにょしているので
おとなしくDBI使ってるこっちの方が見やすいな。。
GA
2012/10/22
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に。。
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。。(つд`)
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してやれば完成かな。
まずは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。
取り敢えずなるべくそれだけで動く何かを目指してみた。
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したぜ!」
という。
でエラーログに載るのが特徴。
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
一応ステータスは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
登録:
投稿
(
Atom
)