4

これが私が達成したいことです

  1. テーブル構造のみを保持し、データを保持しないマスター データベースをセットアップしたいと考えています。
  2. スレーブ データベースは、マスター データベースから構造を取り込みます。スレーブ DB のみにデータが含まれます
  3. マスターの構造変更 (テーブルの変更、テーブルの削除など) は、データを失うことなくスレーブ データベースに更新する必要があります。

構造の同期を維持するために、各データベースで手動でクエリを実行する必要があるため、これをどのように達成できますか。これは適切なオプションではありません。このプロセスを自動化したいので、これで私を助けてくれる人がいます。これを達成するための提案やチュートリアルへのリンクは大歓迎です

4

1 に答える 1

1

実際にはできませんが、ハックすることはできます。通常のスレーブを設定することから始めます。同期されると、それらは単一のマスターと同じスキーマを持ちます。ここでの秘訣は、スレーブに伝播するがマスターにデータを残さないマスターでクエリを作成することです。最初に、すべてのテーブルに自動インクリメント キーがあることを確認して、通常とまったく同じようにクエリを作成します。

INSERT INTO tbl (col1, col2, col3) VALUES (val1, val2, val3);
SELECT LAST_INSERT_ID();

クエリを作成したら、時間を記録し、最後の挿入 ID をアプリケーション レベルのキューに保存します。スレーブで断続的にクエリを実行します (負荷に応じて、たとえば 10 秒ごと)。

SHOW SLAVE STATUS;

現在のシステム時刻から Seconds_Behind_Master 値を減算します (この時刻を t1 と呼びます)。ここで、古いクエリのキューを反復処理し、最初の要素の時間が t1 よりも大きい限り、最初の要素を削除します。キュー内の要素を削除するたびに、そのレコードをマスターから削除したいが、それをスレーブに残しておきたい (前述のクエリを作成してから更新されているため、既にわかっている場合)。したがって、スレーブを消去せずに、マスター データベース (特定の時間に約 10 秒分のデータが含まれます) を消去します。

SET sql_log_bin=0;
DELETE FROM tbl WHERE autoincrement_key=last_insert_id;
SET sql_log_bin=1;

last_insert_id は、消去するクエリの格納された LAST_INSERT_ID() です。

于 2012-09-09T08:33:17.550 に答える