sql >> Databáze >  >> RDS >> Mysql

Jak synchronizovat data mezi dvěma tabulkami v různých databázích (MYSQL) běžících na různých serverech

Za prvé, proč nikdo z vás neodpoví na otázku tohoto chlápka? Někdy to musíme udělat kvůli bezpečnostním omezením / dodržování předpisů / starším systémům.

Je několik možností, které sem napíšu pomocí pseudo kódu. Nejste si jisti, jak je vaše databáze v reálném čase, takže to nebude fungovat ve všech případech.

Požadavky

Aby to fungovalo, databáze musí být na stejné instanci serveru. Pokud ne, budete muset nastavit modul federovaného úložiště pro přístup ke vzdáleným datům. Jak uvedla jiná osoba, replikace MySQL by mohla být stále užitečná alespoň pro získání dat na stejný server, čímž by se synchronizace zrychlila bez nutnosti nastavení federovaného úložiště. Odkaz:https://dev.mysql.com/doc/refman/5.7/en/federated-storage-engine.html

Časování synchronizace

MySQL vám umožní vytvářet události podle konkrétního plánu pro provádění vaší práce (za předpokladu, že nemáte žádné externí nástroje pro plánování úloh).

Doufejme, že máte nějaké upravené datum, můžete dotazovat jednou denně nebo v kratších intervalech ve všech polích, kde je modified_at>=DATE_SUB(NOW( ),INTERVAL ? HOUR)

Pokud jste schopni přidat sloupec, můžete vytvořit jeden s názvem synced_at který by byl o něco odolnější vůči rozdílům v taktu serveru. Pak se můžete jednoduše zeptat, kde je synced_at JE NULL nebo synced_at <=modified_at

MySQL podporuje BEFORE a AFTER triggery INSERT / UPDATE / DELETE atd... můžete je použít ke spuštění vaší logiky. Mějte na paměti, že za každou transakci dostanete malou výkonnostní penalizaci, což může snadno zahltit velmi aktivní produkční servery.

Opravdu není velký rozdíl mezi BEFORE a AFTER kromě toho, že pokud použijete spouštěče stylu BEFORE, můžete vyvolat sqlstate, abyste zabránili vložení do zdrojové tabulky, pokud je důležité, aby obě tabulky byly vysoce synchronizované.

Synchronizační logika

Toto je pseudo kód, ale...

# new and updated records
INSERT ... ON DUPLICATE KEY UPDATE ...
SELECT FROM source_table
JOIN target_table.id
WHERE target_table.id IS NULL or modified_at > DATE_SUB(NOW(), INTERVAL ..)

# deleted records

Stejně jako výše pouze manipulujete s jedním záznamem najednou a zrcadlíte příkaz spouště. Například:INSERT TRIGGER ve zdrojové tabulce by se měl dotazovat pouze na INSERT v cílové tabulce.

Jednoduché, ale nedoporučované pro nic jiného než možná databáze hlášení. Zrušte celou tabulku a znovu ji sestavte z ostatních záznamů.



  1. Nelze se připojit k žádnému ze zadaných hostitelů mysql. C# MySQL

  2. Řádky tabulky Mysql DB mizí

  3. T-SQL:Odstranění všech duplicitních řádků, ale ponechání jednoho

  4. PHP:proč nemohu dvakrát opakovat výsledky mysqli_fetch_array()?