バイナリログは、以前の更新ログの代わりになるものです。更新ログは MySQL 5.0 でなくなります。バイナリログには、更新ログで利用可能だった情報がすべて、より効率的かつトランザクションセーフな方法で含まれます。
バイナリログは以前の更新ログと同様、データを実際に更新するステートメントだけを記録します。UPDATE
または DELETE
の WHERE
指定でレコードが見つからなかった場合、そのステートメントはログに書き込まれません。カラムの値を、すでにある同じ値で更新した
UPDATE
ステートメントもスキップされます。
バイナリログには、バックアップ後の更新がすべて記録されます。バイナリログの主な目的は、リストア時に、データベースに対して可能な限りバックアップ後の更新を実行できるようにすることです。
バイナリログは、マスタからスレーブにレプリケーションを行うときにも使用します。 See 項4.11. 「MySQL のレプリケーション」。
バイナリログには、データベースを更新した各クエリにかかった時間の情報も含まれます。データを変更しなかったクエリは含まれません。問題のあるクエリを見つけるなどの目的ですべてのクエリを記録したい場合には、一般クエリログを使用してください。 See 項4.10.2. 「一般クエリログ」。
mysqld
を
--log-bin[=file_name]
オプションで起動すると、データを更新したすべての
SQL
コマンドがログファイルに記録されます。ファイル名を指定しなければ、ホストマシンの名前に
-bin
を付けたものがデフォルト名になります。ファイル名を指定し、パスを指定していない場合には、ファイルはデータディレクトリに作成されます。
--log-bin=filename.extension
で拡張子を指定した場合、拡張子は削除されます。
mysqld
は、バイナリログファイル名に数字の拡張子を追加します。この番号は、mysqladmin
refresh
、mysqladmin
flush-logs
、および FLUSH LOGS
ステートメントが実行されるたびに、またはサーバが再起動するたびにインクリメントされます。バイナリログのサイズが
max_binlog_size
に達すると、新しいバイナリログが自動的に作成されます。注意:
トランザクションを使用している場合、トランザクションは
1
つのまとまりでバイナリログに書き込まれるため、複数のバイナリログに分割されることはありません。したがって、大きなトランザクションがある場合、バイナリログが
max_binlog_size
より大きくなる可能性があります。
すべてのバイナリログファイルを削除するには、RESET
MASTER
コマンド(see
項4.6.5. 「RESET
構文」)を使用します。一部のファイルを削除するには、PURGE
MASTER LOGS
(see
項4.11.7. 「マスタサーバを制御する SQL ステートメント」)を使用します。
mysqld
で以下のオプションを使用し、何をバイナリログに記録するか制御できます(表の後の説明を必ず読んでください)。
オプション | 説明 |
binlog-do-db=database_name |
カレントデータベース(USE
によって選択されたデータベース)が
'database_name'
の場合、更新をバイナリログに記録するようにマスタに指示する。それ以外の明示的に指定されていないデータベースはすべて無視する。注意:
カレントデータベース内でのみ更新を行うことが確実な場合に、このオプションを使用すること(例:
binlog-do-db=some_database )。
予想しづらい動作例: サーバを
binlog-do-db=sales
で起動し、USE prices; UPDATE sales.january
SET amount=amount+1000;
を実行した場合、このクエリはバイナリログには書き込まれない。 |
binlog-ignore-db=database_name |
カレントデータベース(USE
によって選択されたデータベース)が
'database_name'
の場合、更新をバイナリログに記録しないようにマスタに指示する。注意:
カレントデータベース内でのみ更新を行うことが確実な場合に、このオプションを使用すること(例:
binlog-ignore-db=some_database )。
予想しづらい動作例: サーバを
binlog-ignore-db=sales
で起動し、USE prices; UPDATE sales.january
SET amount=amount+1000;
を実行した場合、このクエリはバイナリログに書き込まれる。 |
クエリをバイナリログに書き込むかどうかの評価は、以下の順序で行われます。
binlog-do-db
ルールまたは
binlog-ignore-db
ルールがあるか。
No: クエリをバイナリログに書き込んで終了する。
Yes: 次のステップに移る。
ルール(binlog-do-db
または
binlog-ignore-db
、あるいはその両方)が存在する。カレントデータベースがあるか(USE
が選択しているデータベースがあるか)。
No: クエリを書き込まないで終了する。
Yes: 次のステップに移る。
カレントデータベースがある。binlog-do-db
ルールはあるか。
Yes: カレントデータベースが
binlog-do-db
ルールのいずれかに一致しているか。
Yes: クエリを書き込んで終了する。
No: クエリを書き込まないで終了する。
No: 次のステップに移る。
binlog-ignore-db
ルールが存在する。
カレントデータベースが
binlog-ignore-db
ルールのいずれかに一致しているか。
Yes: クエリを書き込まないで終了する。
No: クエリを書き込んで終了する。
したがって、たとえば
binlog-do-db=sales
だけで実行中のスレーブは、カレントデータベースが
sales
ではないクエリを一切バイナリログに書き込みません(つまり、binlog-do-db
は ``他のデータベースを無視する''
ということにもなります)。
どのバイナリログファイルが使用されたかわかるように、mysqld
はバイナリログインデックスファイルも作成します。このファイルに、使用されたバイナリログファイルすべての名前が含まれます。デフォルトでは、このファイルの名前はバイナリログファイル名に拡張子
'.index'
を付けたものとなります。
バイナリログインデックスファイルの名前を変更するには、--log-bin-index=[filename]
オプションを使用します。 mysqld
の実行中は、このファイルを手動で編集しないでください。mysqld
が混乱する原因となります。
レプリケーションを使用している場合、スレーブが必要としている間は、古いバイナリログファイルを削除しないでください。
たとえば、mysqladmin flush-logs
を毎日実行する場合、3
日たったログをすべて削除するようにします。これらのログは手動で削除することもできますが、バイナリログインデックスファイルも安全に更新できる
PURGE MASTER LOGS
(see
項4.11.7. 「マスタサーバを制御する SQL ステートメント」)を使用して削除することを推奨します。このコマンドは、MySQL
4.1
から日付引数を指定できるようになっています。
SUPER
権限での接続では、SET
SQL_LOG_BIN=0
を使用して、クエリのバイナリログを無効にできます。
See 項4.11.7. 「マスタサーバを制御する SQL ステートメント」。
バイナリログファイルを調べるには、mysqlbinlog
ユーティリティを使用します。
たとえば、以下のようにバイナリログから MySQL
サーバを更新することができます。
shell> mysqlbinlog log-file | mysql -h server_name
mysqlbinlog
ユーティリティおよびその使用法に関する詳細については、項4.9.5. 「mysqlbinlog
(バイナリログからクエリを実行する)」
を参照してください。
BEGIN [WORK]
または SET
AUTOCOMMIT=0
を使用している場合は、以前の更新ログではなく
MySQL
バイナリログをバックアップ用に使用してください。更新ログは
MySQL 5.0 でなくなります。
バイナリログの書き込みは、クエリが完了した直後でロックの解除前に、またはコミットの前に行われます。このため、ログは実行順序どおりに書き込まれます。
非トランザクションテーブルの更新は実行直後にバイナリログに保存されます。BDB
テーブルや InnoDB
テーブルなどのトランザクションテーブルでは、テーブルを変更するすべての更新(UPDATE
、DELETE
、または
INSERT
)は、COMMIT
コマンドがサーバに送信されるまでキャッシュされます。mysqld
は、COMMIT
が実行される前にトランザクション全体をバイナリログに書き込みます。
すべてのスレッドが、最初に、クエリをバッファする
binlog_cache_size
のバッファを割り当てます。クエリがこれより大きい場合、スレッドはテンポラリファイルを開いてトランザクションを保存します。スレッドが終了するとテンポラリファイルは削除されます。
max_binlog_cache_size
(デフォルトは
4G)を使用して、複数クエリトランザクションのキャッシュに使用するトータルサイズを制限できます。トランザクションがこれより大きい場合、エラーとなってロールバックします。
更新ログまたはバイナリログを使用している場合に、CREATE
... SELECT
または INSERT ...
SELECT
を使用すると、同時挿入が通常の挿入に変換されます。
これは、バックアップにログを適用したときに、テーブルの正確なコピーを作成するための措置です。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.