2012年10月20日土曜日

MySQLバイナリーログ

■MySQLバイナリーログについて

バイナリーログは更新系のログが記述されていくもので、
自動削除設定をしない限りは自動で消えないため、どんどん増えていってしまいます。

レプリケーション時には、このバイナリーログをマスターからスレーブが参照して、
自身のサーバーに持って行き、バイナリーログを実行することで同期を行っていますので、
レプリケーション時には必要なログになります。

もし、レプリケーションを行ってい無い場合で、何かあった時に調査もしなくて(・∀・)イイ!!
とかであれば、バイナリーログの出力自体を止めてしまうのもありかと思います( ̄ー ̄)ニヤリ
レプリケーション以外の用途としては、差分バックアップやリストア(ロールフォワードリカバリ)用途に利用できます。

削除の手段としては、手動でコマンドを実行する方法と、my.cnfに設定して自動で消す方法があります。
まずは、手動でコマンドを実行する方法をおこなっていみたいと思います

現在、存在しているバイナリーログを確認しています。
■バイナリーログが設定されているか確認
mysql> SELECT @@log_bin;
+-----------+
| @@log_bin |
+-----------+
|         1 |
+-----------+
1 row in set (0.01 sec)
1ならバイナリーログが有効になっています。
my.cnfの設定では、log-binが設定されていたら有効になっています。
view /etc/my.cnf
#バイナリーログ出力
log-bin=mysql-bin
■現在のバイナリログファイル一覧を確認
SHOW BINARY LOGS;
または
SHOW MASTER LOGS;

+------------------+------------+
| Log_name         | File_size  |
+------------------+------------+
| mysql-bin.000001 |      27287 |
| mysql-bin.000002 |    1031892 |
| mysql-bin.000003 |        271 |
| mysql-bin.000004 |        126 |
| mysql-bin.000005 |        126 |
:
:
:
| mysql-bin.000224 | 1074266518 |
| mysql-bin.000225 | 1073768399 |
| mysql-bin.000226 | 1074062569 |
| mysql-bin.000227 | 1073853832 |
| mysql-bin.000228 | 1073833840 |
| mysql-bin.000229 | 1073855601 |
| mysql-bin.000230 |  624410684 |
+------------------+------------+

たまっているバイナリーログを消す場合には、
次のコマンドを実行することで、最新バイナリーログ以外を全て自動で削除してくれます
PURGE MASTER LOGS BEFORE now();
もし、特定のファイルを指定して、それよりか古いファイルを消す場合には、
次の記述で行えます。(例では、mysql-bin.000010より若い番号のログが全て消えてしまいます)
PURGE MASTER LOGS TO 'mysql-bin.000010';
レプリケーション時に、マスターのバイナリーログを消す場合には注意が必要かも?
たとえば、スレーブ側で遅延が発生している場合に、
マスターのバイナリーログをまだスレーブ側が取得していない場合に消してしまった場合に、
同期がとれなくなる?
■my.cnfによる自動削除
my.cnfに「expire_logs_days」の項目を追加すると、
指定した日数を経過したバイナリーログを削除してくるようになります

10日を経過したバイナリーログを消す場合には、次のように記述します。
expire_logs_days = 10
データベースを止めずに反映させる場合には、
mysql> SET GLOBAL expire_logs_days = 10;

#確認する
SELECT @@expire_logs_days;
バイナリーログのローテーションは
mysql再起動や、FLUSH LOGS文の実効時、新たなバイナリログーが作られた時とかにも実行されてしまいます。

■番外編
とある案件で、zabbixを導入しているサーバーで、
zabbixが使っているMySQLのバイナリーログがHDDを圧迫して100%になってしまいました( ゚д゚)ポカーン

HDDが100%なんて初めて見たなので、戸愚呂120%的な意味かと思いワクテカしていたら、
MySQLにすらログイン出来ないという状況になっていて焦りましガ━━(;゚Д゚)━━ン!!

ログインが出来ないとPURGEコマンドによる削除が行えない・・・orz

仕方ないのでバイナリーログをrmコマンドで消しHDDの圧迫を解消し、
MySQLにログイン後にバイナリーログ一覧を見てみると、
実ファイルは既にrmコマンドでなくなっているのにも関わらず、
File_seizeの項目が全て0になってしまっていて、一覧にその名前が残っていたままでした。

mysql-bin.00108*番台のバイナリーログを全て削除
rm -rf ./mysql-bin.00108*
MySQlにログインして確認してみる。
mysql> SHOW BINARY LOGS;
+------------------+------------+
| Log_name         | File_size  |
+------------------+------------+
| mysql-bin.001081 |          0 |
| mysql-bin.001082 |          0 |
| mysql-bin.001083 |          0 |
| mysql-bin.001084 |          0 |
| mysql-bin.001085 |          0 |
| mysql-bin.001086 |          0 |
| mysql-bin.001087 |          0 |
| mysql-bin.001088 |          0 |
| mysql-bin.001089 |          0 |
| mysql-bin.001090 |          0 |
| mysql-bin.001091 | 1073744240 |
| mysql-bin.001092 |   12358066 |
+------------------+------------+
0byteファイル(゚∀゚)キタコレ!!
気持ち悪かったので、PURGEを実行してみると、
綺麗に一覧から消えてスッキリしましたド━━━━m9(゚∀゚)━━━━ン!!
mysql>  PURGE MASTER LOGS before now();
Query OK, 0 rows affected, 20 warnings (3.02 sec)

mysql> SHOW BINARY LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.001092 |  12553967 |
+------------------+-----------+
1 row in set (0.00 sec)
もしかしたらflush logs;でも治ったかも!?(゚д゚)(。_。)(゚д゚)(。_。) ウンウン
そもそも、zabbixサーバーのMySQLはレプリケーションを行っていないので、
バイナリーログを出力しない設定にすれば良かったのかといまさら思いました・・・orz
バイナリーログの設定には次の項目もあるみたいです。
#バイナリログ出力先
log_bin                 = /var/log/mysql/mysql-bin.log
#フラッシュするかの回数
sync_binlog             = 0
#バイナリログを保持しておく日数
expire_logs_days        = 60
#バイナリログの1ファイルあたりの最大サイズ
max_binlog_size         = 1024M
#バイナリログを出力する対象のDB
binlog_do_db           = hoge
#バイナリログの出力対象外とするDB 
binlog_ignore_db        = mysql information_schema
#バイナリログフォーマット
binlog_format           = ROW
以上(`・ω・´)ゞビシッ!!

ちなみに稼働中にHDD100%になると次のようなエラーが吐き出されていました!
121028  9:56:06 [Warning] Timeout waiting for reply of binlog (file: mysql-bin.000459, pos: 1387371563), semi-sync up to file mysql-bin.000459, position 1040130015.
121028  9:56:06 [Note] Semi-sync replication switched OFF.
121028  9:56:23 [Note] Semi-sync replication switched ON with slave (server_id: 2) at (mysql-bin.000459, 1387371563)
121028  9:57:05 [Warning] Timeout waiting for reply of binlog (file: mysql-bin.000460, pos: 347253907), semi-sync up to file mysql-bin.000459, position 1387371563.
121028  9:57:05 [Note] Semi-sync replication switched OFF.
121028  9:57:20 [Note] Semi-sync replication switched ON with slave (server_id: 2) at (mysql-bin.000460, 347253907)
121028  9:58:04 [ERROR] /usr/libexec/mysqld: Disk is full writing './mysql-bin.000460' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue afte
r freeing disk space)
121028  9:58:04 [ERROR] /usr/libexec/mysqld: Retry in 60 secs. Message reprinted in 600 secs
121028  9:59:04 [ERROR] /usr/libexec/mysqld: Disk is full writing './mysql-bin.000460' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue afte
r freeing disk space)
121028  9:59:04 [ERROR] /usr/libexec/mysqld: Retry in 60 secs. Message reprinted in 600 secs
121028 10:00:02 [ERROR] Error writing file '/data/mysql-log/mysql.log' (errno: 28)
121028 10:00:04 [ERROR] /usr/libexec/mysqld: Incorrect key file for table '/data/mysql-tmp/#sql_7a73_0.MYI'; try to repair it
121028 10:00:04 [ERROR] Got an error from unknown thread, /builddir/build/BUILD/mysql-5.5.22/storage/myisam/mi_write.c:223
121028 10:00:04 [ERROR] Error writing file '/data/mysql-log/mysql-slow.log' (errno: 1)
121028 10:00:06 [ERROR] /usr/libexec/mysqld: Incorrect key file for table '/data/mysql-tmp/#sql_7a73_0.MYI'; try to repair it
121028 10:00:06 [ERROR] Got an error from unknown thread, /builddir/build/BUILD/mysql-5.5.22/storage/myisam/mi_write.c:223
121028 10:09:04 [ERROR] /usr/libexec/mysqld: Retry in 60 secs. Message reprinted in 600 secs
121028 10:19:04 [ERROR] /usr/libexec/mysqld: Retry in 60 secs. Message reprinted in 600 secs
121028 10:29:04 [ERROR] /usr/libexec/mysqld: Retry in 60 secs. Message reprinted in 600 secs
121028 10:30:04 [ERROR] /usr/libexec/mysqld: Incorrect key file for table '/data/mysql-tmp/#sql_7a73_0.MYI'; try to repair it
121028 10:30:04 [ERROR] Got an error from unknown thread, /builddir/build/BUILD/mysql-5.5.22/storage/myisam/mi_write.c:223
121028 10:30:06 [ERROR] /usr/libexec/mysqld: Incorrect key file for table '/data/mysql-tmp/#sql_7a73_0.MYI'; try to repair it
121028 10:30:06 [ERROR] Got an error from unknown thread, /builddir/build/BUILD/mysql-5.5.22/storage/myisam/mi_write.c:223
121028 10:39:04 [ERROR] /usr/libexec/mysqld: Retry in 60 secs. Message reprinted in 600 secs

参考URL

0 件のコメント:

コメントを投稿