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

  • 1
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

※継続調査中です

昔々に参加したことがあるプロジェクトで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 年

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

この投稿は MySQL Casual Advent Calendar 201512日目の記事です。