MySQLのバイナリログの番号をどこまで許容するのか？（調査中）

*※継続調査中です*

昔々に参加したことがあるプロジェクトでMySQLを採用した際に、「バイナリログの番号ってどこまで進むの？」という疑問を提示されて調べたことがあるので、この機会に今どうなっているんだろう？という調査をしてみました。

# 調査してみる
## どうやって調査するか

### 環境

* サーバー：Virtualbox上にVagrantで
* MySQL: (ここ)を参考に5.7をインストール

### MySQLの設定変更

`log-bin=mysql-bin` `server-id=1` を足すだけ

この時点でlsしてみる

```shell-session:設定変更直後
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` でも同じことができます)


```shell-session:一回やってみた結果
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しつづける** という手法を取っていこうかと思います。

## やってみた

```shell-session:まずは普通に実行
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に連打を丸投げします

```shell-session:とりあえず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
```

パフォーマンスの関係上、ログは適宜パージしていきます。
さらにこれでも手間なので、もうちょっと複雑なスクリプトで進めてみます。

```perl: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 と６桁なので、7桁に到達するように1000000回flushさせてみます。

```shell-session:スクリプト実行後
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上でどこまでいけるか挑戦中。結果が出たら編集します

# 考察（２）

ところで、1000000って一般的にどれぐらいで到達するんでしょうか。
自社のゲームだと大体1日で4ぐらい進んでました。

* 1000000 / 4 = 250000 日
* 250000 / 365 = 684.93 年

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