web-dev-qa-db-ja.com

MySQLバイナリログを使用してデータベースダンプ間のバックアップを保持しますか?

私は現在、mysqldumpを使用してデータベースの完全バックアップを1日1回取得しています。これをより細かく(たとえば15分ごとに)したいのですが、サイズの制約のために、より多くのフルダンプを取得することはできません。 mysqlbinlogを使用して、最後のmysqldump以降の変更のみを取得できますか?

最後のmysqldumpの正確な時刻以降のバイナリログのみを取得するにはどうすればよいですか?その時間より前に別のトランザクションが開始され、その後に終了した場合でも、ログに適切に含まれますか?

1
Levi H

Binlogの圧縮アーカイブを保持することは、ロールフォワードできる完全バックアップがあると仮定して、データベースで ポイントインタイムリカバリ を達成するための非常に一般的な方法です。

リモート転送手順(例:scp)を使用してバイナリログをコピーするだけで問題ありません。そのまま適用できます。ただし、バイナリログが使用中、ローテーション/パージされている場合、および何よりも最後のログであるために書き込まれている場合は、不便が生じる可能性があります。あなたはそれを回避することができますが-より簡単な方法があります:

mysqlbinlogは、binlogをsqlに変換できるだけでなく、mysqlクライアントコードに含まれているユーティリティですmysqlプロトコルを使用してリモートでストリーミングすることもできます(したがって、追加のインフラストラクチャとコードを設定する必要はありません)。特に -Rオプション を使用すると、リモートサーバーに接続して、そのbinlogをローカルにストリーミングできます。 -raw および -stop-never オプションと組み合わせると、ほぼリアルタイムでストリーミングするための組み込みオプションがありますバイナリログは元の形式で、さまざまなファイルを処理したり、イベントを失ったりする必要はありません。ただし、接続エラーやその他の問題を処理できるように、それをラップすることもできます。リモートコピーで発生します。

最後のmysqldumpの正確な時刻以降のバイナリログのみを取得するにはどうすればよいですか?

そのためには、 --master-dataまたは--dump-slaveオプション (および単一トランザクション、または一貫性を実現する他の方法)を指定してmysqldumpを実行し、binlogまたはgtid座標を収集する必要があります。 。このようにして、binlogの収集を開始する場所(または、より簡単に、それらの適用を開始する場所)を構成できます。物事をさらに簡単にする秘訣は、ダンプの前にFLUSH LOGSを実行することです。これにより、ポイントインタイムリカバリを実行するときに移動するデータが少なくなります。

その時間より前に別のトランザクションが開始され、その後に終了した場合でも、ログに適切に含まれますか?

ログに含まれる場合と含まれない場合がありますが、mysqldumpによる座標は含まれません。トランザクションは、コミット時にのみbinlogに含まれます。その間、それらはメモリまたはディスクにキャッシュされます。考えているようにログを分割することは可能ですが、ログをmsaterの元の形式にできるだけ類似させ、座標を使用して、取得するさまざまなバックアップの一貫性を処理する方が簡単であることをお勧めします。そのため、同じファイルを再利用して、同様のバックアップを復元できます。

Mysqlbinlogを使用して、最後のmysqldump以降の変更のみを取得できますか?

それでもそれらを別々に保ちたい場合は、上記で提案したローテーションを使用しますが、ログとバックアップのローテーションを一貫させるために、(不要な)データベースロックを増やす必要がある場合があります。または、 --start-position および--stop-positionmysqlbinlogオプションを1回限りのコピーに使用することもできます。

1
jynus

mysqlは、最近のデフォルトであるトランザクションセーフテーブル(つまり、myISAMではなくInnoDB)を使用していることを前提として、バイナリ(トランザクション)ログを介した増分バックアップをサポートしています。これは 公式ドキュメント でカバーされています。

0
David Spillett