Pertama-tama, mengapa tidak ada di antara kalian yang menjawab pertanyaan pria ini? Terkadang kami harus melakukan ini karena batasan keamanan / kepatuhan / sistem lama.
Ada beberapa opsi yang akan saya tulis di sini dengan kode semu. Tidak yakin seberapa real-time database Anda sehingga ini tidak akan berfungsi di semua kasus.
Persyaratan
Agar ini berfungsi, database harus berada di instance server yang sama. Jika tidak, Anda perlu menyiapkan mesin penyimpanan gabungan untuk mengakses data jarak jauh. Seperti yang dinyatakan orang lain, replikasi MySQL masih dapat berguna setidaknya dalam mendapatkan data ke server yang sama sehingga sinkronisasi lebih cepat tanpa perlu menyiapkan penyimpanan gabungan. Referensi:https://dev.mysql.com/doc/refman/5.7/en/federated-storage-engine.html
Waktu Sinkronisasi
MySQL akan memungkinkan Anda untuk membuat acara pada jadwal tertentu untuk melakukan pekerjaan Anda (dengan asumsi Anda tidak memiliki alat penjadwalan pekerjaan eksternal).
Semoga Anda memiliki semacam tanggal yang dimodifikasi, Anda dapat menanyakan sekali sehari atau interval yang lebih ketat pada semua bidang di mana modified_at
>=TANGGAL_SUB(SEKARANG ( ),INTERVAL ? JAM)
Jika Anda dapat menambahkan kolom, Anda dapat membuatnya dengan nama synced_at
yang akan sedikit lebih tahan terhadap perbedaan jam server. Kemudian Anda cukup menanyakan di mana synced_at
IS NULL atau synced_at
<=modified_at
MySQL mendukung pemicu SEBELUM dan SETELAH INSERT / UPDATE / DELETE dll ... Anda dapat menggunakan ini untuk memicu logika Anda. Ingatlah bahwa Anda akan menerima sedikit penalti kinerja untuk setiap transaksi dan ini dapat dengan mudah membebani server produksi yang sangat aktif.
Sebenarnya tidak ada perbedaan besar antara BEFORE dan AFTER kecuali bahwa jika Anda menggunakan pemicu gaya BEFORE, Anda dapat melempar sqlstate untuk mencegah penyisipan ke tabel sumber jika kedua tabel penting untuk disinkronkan.
Logika Sinkron
Ini adalah kode semu tapi...
# 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
Sama seperti di atas hanya Anda hanya memanipulasi satu catatan pada satu waktu dan Anda mencerminkan pernyataan pemicu. Misalnya:sebuah INSERT TRIGGER pada tabel sumber seharusnya hanya query INSERT pada tabel target.
Sederhana tetapi tidak direkomendasikan untuk apa pun selain mungkin database pelaporan. Jatuhkan seluruh tabel dan bangun kembali dari catatan lain.