2つの異なるデータベースのテーブルを同期するツールを探していましたが、 pt-table-sync
が見つかりました。ドキュメントを読んで混乱しました。ほとんどの場合、レプリケートされた環境を参照する例を使用していますが、レプリケーションの全体的なポイントはデータの同期を処理することだと思ったので、私の質問は次のとおりです。
レプリケーションプロセスがデータの同期を処理することになっている場合、pt-table-sync
を使用する意味は何ですか?
複製されていない環境でpt-table-sync
を使用できますか(相互に関係のない2つ以上のホスト間で、与えられたpt-table-sync --execute Host1 Host2 Host3
の例の役割ですか? )?
レプリケートされた環境でpt-table-sync
を使用する必要がある場合、master
にbin-logs
を付けずに使用できますか(違いの解決について説明している例があります) pt-table-checksum
によって発見されたので、bin-logs
が絶対に必要かどうか疑問に思います)?
MySQLレプリケーションには2つの大きな問題があります
MySQLレプリケーションは非同期です。これにより、レプリケーションの遅延が発生する可能性があります。これは、スレーブI/Oスレッドを介したマスターとスレーブ間の通信の問題で明らかになります。これは、論理的および数値的にSeconds_Behind_Master
で確認できます。
Data Drift
。これは、MySQLレプリケーションの領域外の要因のために、マスターとスレーブが単に同期していない断続的な状態です。たとえば、レプリケーションをより適切に同期する1つの方法に注意してください。オプション sync-binlog
を使用します。 sync-binlog
を1に設定すると、mysqldは、バイナリログに記録するすべてのエントリに対して現在のバイナリログのフラッシュを実行します。それはとんでもなくマスターを遅くすることができます。デフォルトでは、sync-binlog
は0です。
sync-binlog=0
で、バイナリログをディスクにフラッシュする責任があるのは誰ですか?pt-table-sync
は、--sync-to-master
オプションを使用してスレーブのI/Oスレッドを検出するように設計されているため、ここでの直接の答えはノーです。
MySQLレプリケーションは知る必要があるため、ここでの直接の答えはノーです。
Master_Log_File
のSHOW SLAVE STATUS\G
です)Read_Master_Log_Pos
のSHOW SLAVE STATUS\G
です)バイナリログを邪魔にならないようにしたいだけの場合は、次の2つのいずれかを実行できます。
expire-logs-days
を3に設定して、過去3日間分のバイナリログを保持しますexpire-logs-days=3
を追加しますSET GLOBAL expire_logs_days = 3;
を実行するだけですSHOW SLAVE STATUS\G
を実行します。 Relay_Master_Log_File
の値を取ります。それを使用して、マスターのバイナリログをクリアし、そのログファイルをアップします。SHOW SLAVE STATUS\G
を実行するとします。Relay_Master_Log_File: mysql-bin.000035
PURGE BINARY LOGS TO 'mysql-bin.000035';
Pt-table-syncをより信頼したい場合は、--print
オプションを使用して、--execute
オプションの代わりにテキストファイルにリダイレクトしてみてください。これにより、通常はマスターで実行されるSQLが生成されます。その後、そのスレーブでSQLを直接実行できます。 --execute
のドレスリハーサルと考えてください。
しかし、レプリケーションの全体的なポイントは、データの同期を処理することだと思いました
はい、MySQLレプリケーションはレプリケートされたデータベースの同期を試みます。ただし、MySQLレプリケーションには注意が必要であり、さまざまな理由でレプリケーションが失敗する可能性があります。私の経験ではレプリケーションエラーはまれですが、予期しないサーバークラッシュ、マスターの大きな挿入の途中でユーザーが「Control-C」を押した場合などに発生します。MySQL.comには、多くの処理に適したツールがありませんこれらの問題の。幸いなことに、Baron Schwartz(Percona Toolkit(旧称Maatkit)の元の作者)などの数人のエンジニアが、MySQLの管理を容易にするツールを開発しました。
たとえば、現在、5,000万行のテーブルがあります。数週間前にサーバーがクラッシュしたため、いくつかの行が同期していません。どの行が同期していないかを見つける必要がありますが、手動で行うのは面倒です。 pt-table-checksumを使用してレプリカのレプリケーションエラーをチェックし、pt-table-syncを使用してレプリカで欠落している行を検出します。
MySQLレプリケーションを検討している場合は、PerconaToolkitを調査して使用することを強くお勧めします。 Percona Toolkitから始めていたら、MySQLデータベースの管理ははるかに簡単だったでしょう。
ドキュメントを読んで混乱しました:
Percona Toolkitのドキュメントは、技術マニュアルのように書かれています。残念ながら、ツールの使用方法、ツールがどのように役立つかなどを説明するのはうまくいきません。 http://www.mysqlperformanceblog.com この情報の一部がありますが、主に焦点が当てられています。 MySQLのPerconaフォーク(これが彼らが生計を立てている方法です)で、読者が何らかの翻訳を行う必要があります。
質問1への回答
pt-table-sync
(pt-table-checksum
と一緒に)を使用すると、データの破損、スレーブ上のデータを直接変更する人、サーバーのクラッシュ、スキーマの変更などのレプリケーションエラーを修正できます。
ただし、データがあまり変更されない場合は、pt-table-sync
をレプリケーションなしで使用して、テーブルの同期をほぼリアルタイムで維持することもできます。
質問2の正解
もちろん、複製されていない環境でも使用できます。 manual にも記載されています。私はcronからそれを使用して、5分ごとに3つのmysqlサーバーを「同期」させます。それらは(最初のサーバーで)たまにしか変更されないデータの同じコピーを持っているので、この目的のための複製はやり過ぎでしょう。
同期する個々のデータベースまたは個々のテーブルを指定できます。複数の宛先サーバーを持つことができます。 pt-table-sync
は、いくつかの効率的なアルゴリズムを使用して、データベーステーブルの変更を検出し、変更のみをコピーします(変更を、削除、置換、挿入、更新の4つのグループに分類します)。