※継続調査中です
昔々に参加したことがあるプロジェクトでMySQLを採用した際に、「バイナリログの番号ってどこまで進むの?」という疑問を提示されて調べたことがあるので、この機会に今どうなっているんだろう?という調査をしてみました。
調査してみる
どうやって調査するか
環境
- サーバー:Virtualbox上にVagrantで
- MySQL: (ここ)を参考に5.7をインストール
MySQLの設定変更
log-bin=mysql-bin
server-id=1
を足すだけ
この時点でlsしてみる
root@vagrant-ubuntu-trusty-64:~# ls /var/lib/mysql/mysql-bin*
/var/lib/mysql/mysql-bin.000001 /var/lib/mysql/mysql-bin.index
バイナリログは FLUSH LOGS
クエリを投げれば無条件で番号を進めることができます。
(コマンドライン上で mysqladmin flush-logs
でも同じことができます)
root@vagrant-ubuntu-trusty-64:~# mysqladmin flush-logs
insecure.
root@vagrant-ubuntu-trusty-64:~# ls /var/lib/mysql/mysql-bin*
/var/lib/mysql/mysql-bin.000001 /var/lib/mysql/mysql-bin.000002 /var/lib/mysql/mysql-bin.index
増えました。
ここからが本番となる「どうやって調査するか」ですが、シンプルにひたすらflush-logsしつづける という手法を取っていこうかと思います。
やってみた
root@vagrant-ubuntu-trusty-64:~# mysqladmin flush-logs
root@vagrant-ubuntu-trusty-64:~# mysqladmin flush-logs
root@vagrant-ubuntu-trusty-64:~# mysqladmin flush-logs
root@vagrant-ubuntu-trusty-64:~# mysqladmin flush-logs
root@vagrant-ubuntu-trusty-64:~# mysqladmin flush-logs
root@vagrant-ubuntu-trusty-64:~# ls /var/lib/mysql/mysql-bin*
/var/lib/mysql/mysql-bin.000001 /var/lib/mysql/mysql-bin.000003 /var/lib/mysql/mysql-bin.000005 /var/lib/mysql/mysql-bin.000007
/var/lib/mysql/mysql-bin.000002 /var/lib/mysql/mysql-bin.000004 /var/lib/mysql/mysql-bin.000006 /var/lib/mysql/mysql-bin.index
これはさすがに飽きるので、Perlに連打を丸投げします
root@vagrant-ubuntu-trusty-64:~# perl -e 'for ($cnt = 0; $cnt < 10; $cnt++){ `mysqladmin flush-logs`;}'
root@vagrant-ubuntu-trusty-64:~# ls /var/lib/mysql/mysql-bin*
/var/lib/mysql/mysql-bin.000001 /var/lib/mysql/mysql-bin.000004 /var/lib/mysql/mysql-bin.000007 /var/lib/mysql/mysql-bin.000010 /var/lib/mysql/mysql-bin.000013 /var/lib/mysql/mysql-bin.000016
/var/lib/mysql/mysql-bin.000002 /var/lib/mysql/mysql-bin.000005 /var/lib/mysql/mysql-bin.000008 /var/lib/mysql/mysql-bin.000011 /var/lib/mysql/mysql-bin.000014 /var/lib/mysql/mysql-bin.000017
/var/lib/mysql/mysql-bin.000003 /var/lib/mysql/mysql-bin.000006 /var/lib/mysql/mysql-bin.000009 /var/lib/mysql/mysql-bin.000012 /var/lib/mysql/mysql-bin.000015 /var/lib/mysql/mysql-bin.index
パフォーマンスの関係上、ログは適宜パージしていきます。
さらにこれでも手間なので、もうちょっと複雑なスクリプトで進めてみます。
#!/usr/bin/perl
$binlog_pos = 1;
$max_binlog_pos = 1000000;
for ($cnt = $binlog_pos; $cnt < $max_binlog_pos; $cnt++){
$ret = system("mysqladmin flush-logs");
if (0 ne $ret) {
exit(0);
}
if ($cnt % 100 eq 0) {
$cmd = 'mysql -e '."'".'PURGE BINARY LOGS TO "mysql-bin.'.($cnt).'"'."'";
`$cmd`;
}
# `mysql -e 'PURGE BINARY LOGS TO "mysql-bin.'.$cnt.'"'`;
# last;
}
とりあえずファイルフォーマットがmysql-bin.XXXXXX と6桁なので、7桁に到達するように1000000回flushさせてみます。
root@vagrant-ubuntu-trusty-64:~# mysql -e 'SHOW BINARY LOGS;'
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
(中略)
| mysql-bin.999997 | 201 |
| mysql-bin.999998 | 201 |
| mysql-bin.999999 | 202 |
| mysql-bin.1000000 | 154 |
+-------------------+-----------+
7桁目突入。まだまだ行けそうですね。
※PC上でどこまでいけるか挑戦中。結果が出たら編集します
考察(2)
ところで、1000000って一般的にどれぐらいで到達するんでしょうか。
自社のゲームだと大体1日で4ぐらい進んでました。
- 1000000 / 4 = 250000 日
- 250000 / 365 = 684.93 年
わかってはいましたが、あまり心配することではないでしょうね