1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQL CasualAdvent Calendar 2015

Day 12

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

Last updated at Posted at 2015-12-12

※継続調査中です

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

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

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?