全体でのMySQLデータベースサーバーのデータ同期

1.背景
近年、企業やデータバットのためのオープンソースプロジェクトZentaoプロジェクトの要件、理由は関連するテーブルのローカルデータベース同期プログラムでZentaoデータベースを使用して、オープンソースプロジェクトへの変更のリスクが大きくなります。私は、プログラムの実行可能性をテストしました。
。MySQLのバージョン:5.7.20
ローカルデータベースA(Zentaoデータベースなど)、ローカルデータベースB、ネイティブC; Windows環境にネイティブ。

2.プログラム探査
プログラム1
プロジェクトマネージャーフリップフロップで書かれた意味、テーブル内のデータは、CによってAでのクエリデータの変更をCに発行されたIDを変更したときに、B.は書いて インストールのmysql-UDF-HTTPプラグイン時に必要(参考ます。https://www.2cto.com/database/201801/713571.html)。
しかし、問い合わせの後に問題が見つかりました:プラグインは、MySQL5.5Xにのみサポートしており、唯一のLinux環境、紛争、プロジェクトの拒絶にインストールすることができます。

シナリオ2は、
アイデアの技術的なマネージャーに尋ねました:

その後、トリガーと監視データの変化、およびクロスBDlinkによってデータベースライブラリにデータをプッシュするストアドプロシージャBを呼び出します。

クエリデータ、DBLINKは、SQL ServerがlinkServerを使用することができ、クロスデータベースのアクセス方法のoracleです。上記のMySQL5.0のバージョンでは、(デフォルトのエンジンはInnoDBのある)FEDERATEDエンジンを使用することができます。(参考ます。https://blog.csdn.net/langkeziju/article/details/50462943)
用途:エンジンFEDERATEDテーブル際にテーブルとリモートデータベースの構築、この文は、その

ENGINE = FEDERATEDのCONNECTION = 'mysqlの://ユーザー:パスワード@のIP:ポート/ test1の/ TEST_TABLE';
如下:

表federated_table(CREATE
IDはint(20)NOT NULL AUTO_INCREMENT、
名前のVARCHAR(32)NOT NULLデフォルト''、
年齢VARCHAR(4)NOT NULLデフォルトは'0'、
CHAR(1)NOT NULLデフォルトをSTS '0'、
オフィスVARCHAR (64)NOT NULLデフォルト'0'、
電話VARCHAR(15)NOT NULLデフォルト'0'、
PRIMARY KEY(ID)、
KEY名前(名)、
KEY年齢(歳)、
KEY STS(STS)、
KEY電話(電話)、
KEY事務所(オフィス)

)ENGINE = FEDERATEDのCONNECTION = 'mysqlの://ユーザー:パスワード@のIP:ポート/ test1の/ TEST_TABLE';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15は
あなたが、アクセスを読み書き設定、MySQLのオープンFEDERATEDエンジンをリモート・データベースにアクセスできることを条件とします。
リモート・データとローカルデータの建設後、動作はカードの同期を行うことができます。

個人的な理解:接続確立は、内部のローカルテーブルにリモートデータをマッピングする場合、またはデータが実際にリモートデータベースに保存されている、ちょうど地元の読み書き「クライアント」を開設 私は適切にBテーブルデータの変更は、データをAに変更され、Bを変更したが起動しませ作動するfederated_tableトリガーを書きました。

データはFEDERATEDによってオーバー同期させることができますので、あなたはBにマッピングAを確立することができます
プログラムマップテーブルと本当の意味で、いくつかのフィールドマッピングテーブルデータはCので、実際のビジネステーブルBと同期する必要がある、またはトリガおよびストアドプロシージャを使用してプログラムを動作させるために使用されてもよいです。

例のトリガー:

#表示すべてのトリガは、ショーは、トリガー
#トリガを削除し、ビルドを削除する必要が変更することができます。TRIGGER updateFromFedをドロップ

デリミタ$$#修改语句结束标志为$$
挿入した後TRIGGER insertFromFederatedを作成
行ごとfederated_tableに
#状态= 1执行插入操作開始
DECLAREデVARCHAR(128)。
設定デ= CONCAT(IFNULL(new.name、 '')、 ' - '、IFNULL(new.age、 '')、 ' - '、IFNULL(new.office、 ''));
new.sts = "1"の場合、
LOCAL1(ID、名前、説明、STS)への挿入
値(new.id、new.name、DE、new.sts)。
LOCAL2への挿入(ID、名前、オフィス、STS)
の値(new.id、DE、new.office、new.sts)。
END IF;
END $$
区切り文字。
















17
参考ます。https://blog.csdn.net/qq_33556185/article/details/77745449

ストアドプロシージャの例:

次の例は、のパラメータを設定#mysql IDデッドタイムの値がヌルであるが、パラメータセットとしてパラメータ値に渡されたIDを使用することがnullでないに選択書き込みます。
ショーは手続きテストを作成します。#表示
CALLテスト();#コール
ドロップの手順をテストが存在する場合、#削除します

デリミタ$$
CREATE PROCEDURE試験()
開始
DECLARE IDをVARCHAR(32)。
セットID = '8302';
v_name VARCHAR(128)を宣言
ID = 5 LOCAL2からv_name INTO SELECT local2.nameと、
SELECT ID、v_name。
LOCAL2に#INSERT(ID、名前、オフィス、STS)VALUES(ID、DES、 '办公室'、 '8')。
最後$$
区切り文字。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
参考:HTTP://www.shouce.ren/api/view/a/11695

シナリオ2あきらめる
初期の段階では、オプション2を使用して決定しますが、ユーザーやDBAと真実の議論に新たな問題を発見しました。

1.FEDERATEDエンジンが利用可能であるが、ターゲットサーバマイグレーションの発生、テーブルの再構築、保守より多くの問題の場合にサーバアドレスを変更する必要があり、
制御されない2.Zentaoデータベースを変更し、その状態データベースを同期させることができるが、Bで制御することができません競合を変更します。

3.最終的に確立された
上記の問題2、ステータスビットを制御することによって、同時に修正されたユーザエンゲージメントの一方のみを解決するために。
問題1を解決するために、ETLは、タイマによりタイミング同期を操作するためにケトルを決定し、または2つのローカルデータベースに直接手順CをA / Bを書き込み、データ。
製品の後期ケトル運用・保守に関わる問題の結果として、我々は後者の方法を使用する傾向があります。

おすすめ

転載: www.cnblogs.com/HKROnline-SyncNavigator/p/10971499.html
おすすめ