Edited at

MySQLのバイナリログの番号をどこまで許容するのか?(調査中)

More than 3 years have passed since last update.

※継続調査中です

昔々に参加したことがあるプロジェクトで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に連打を丸投げします


とりあえずperlで10回実行

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

パフォーマンスの関係上、ログは適宜パージしていきます。

さらにこれでも手間なので、もうちょっと複雑なスクリプトで進めてみます。


flush_and_purge.pl

#!/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 年

わかってはいましたが、あまり心配することではないでしょうね