※継続調査中です
昔々に参加したことがあるプロジェクトで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 年
わかってはいましたが、あまり心配することではないでしょうね
