今回は、MySQLのバイナリログについてです。バイナリログは、ロールフォワードやレプリケーションの構築をするために使いますが、あまりバイナリログについて意識していなかったので調べたことを残します。

環境

  • CentOS7
  • MySQL5.7

バイナリログとは

バイナリログとは、バイナリ形式(2進数)でテーブルやデータの更新操作のログが格納されたログファイルです。バイナリログの用途や特徴は、ざっくり以下の3点です。

ロールフォワードや、レプリケーションに使われる

ロールフォワードとは

ロールフォワードとは、ログファイルに残っているチェックポイント後(最後にデータが書き込み処理が行われた時)の処理を再現し、障害直前の状態にまで戻すことができる機能のひとつです。

ロールフォワードを行うには、バイナリログが必要になります。普段の運用では、cronでmysqldumpを動かすなど、定期的にフルバックアップを取得していなければいけません。

レプリケーションとは

データの複製(レプリカ)を別のコンピュータ上に作成し、ネットワークを介してリアルタイムに情報の更新を反映させて常に内容を同期することです。

レプリケーションの構築については、別記事で書きましたのでご確認頂ければと思います。

バイナリログはデフォルトでは作成されないため、設定が必要になる

バイナリログの作成方法

バイナリログはデフォルトでは作成されないため、my.cnfにてバイナリログを有効にする設定をします。

1.my.cnfの場所を確認します。この場合は、/etc/my.cnfです。

# mysql --help | grep my.cnf

                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

2.viコマンドでmy.cnf(MySQLの設定ファイル)を編集します。

# vi /etc/my.cnf

3.log-binとserver-idの設定をし、バイナリログを有効にします。この時にserver-idを付けないと、mysqlを再起動したときにエラーになります。server-idは、テキトーな値で問題ないです。

[mysqld]
log-bin=mysql-bin
server-id=1001

4.mysqlを再起動します。CentOS7の場合は、systemctlを使います。

# systemctl restart mysqld.service

5.バイナリログのファイルの存在を確認します。以下のコマンドを使うと、バイナリログ【mysql-bin.000001】が出力されているのが分かります。

# ll /var/lib/mysql/mysql-bin*

-rw-r----- 1 mysql mysql  154 Mar 21 14:03 /var/lib/mysql/mysql-bin.000001
-rw-r----- 1 mysql mysql   76 Mar 21 14:03 /var/lib/mysql/mysql-bin.index

バイナリログの中身を見る

バイナリログの中身を見る場合は、ファイルの中身を確認するコマンド【cat】ではなく、rootユーザーで【mysqlbinlog】コマンドを使います。

# mysqlbinlog /var/lib/mysql/mysql-bin.000001

root権限がないと以下のようなエラーが出ます。

mysqlbinlog: File 'mysqld-bin.000001' not found (Errcode: 13)

バイナリログの設定をした後に、テーブルを作成してデータをインサートすると、バイナリログ(mysql-bin.000001)が更新されます。

サイズの上限を超えたりMySQLを再起動すると、バイナリログが新規作成される

バイナリログには、サイズ上限値(デフォルト1GB)があり、その上限値に達した時点で新たなログファイルが作成されます。サイズ上限値は、my.cnfのmax_binlog_sizeを指定することで変更が可能です。

また、MySQLを再起動しても新たに作成されます。例えばバイナリログが【mysql-bin.000001】だった場合、MySQLを再起動をすると【mysql-bin.000002】と次の番号にスイッチします。

バイナリログの説明は、以上です。

関連用語

バイナリログについて調べている時に出てきた用語をメモします。

ロールバック

ロールバックは、ロールフォワードと類似していますので、よく比較して説明をされることが多いようです。ですので、ここでは「ロールバックとロールフォワードの違い」について書きます。

ロールバック

  • トランザクション処理において、データの整合性が取れなくなるなどの障害が発生した場合に行います。
  • 実行した処理を取り消します。

ロールフォワード

  • データベースが物理的に壊れたりした場合などに行います。
  • 障害が発生する前の状態に戻します。

※トランザクション処理とは、複数の処理をひとつの処理単位として実行する処理のこと

参考

MySQLのバイナリログを使った復旧手順
MySQLのバイナリログについて調べた
MySQLのバイナリログを見てみる