Đầu tiên, tại sao không có bạn nào trả lời câu hỏi của công tử này? Đôi khi chúng tôi phải thực hiện việc này do các hạn chế về bảo mật / tuân thủ / hệ thống kế thừa.
Có một số tùy chọn tôi sẽ viết ở đây với mã giả. Không chắc cơ sở dữ liệu của bạn theo thời gian thực như thế nào nên điều này sẽ không hoạt động trong mọi trường hợp.
Yêu cầu
Để điều này hoạt động, các cơ sở dữ liệu sẽ phải ở trong cùng một phiên bản máy chủ. Nếu không, bạn sẽ cần thiết lập công cụ lưu trữ liên kết để truy cập dữ liệu từ xa. Như một người khác đã nói, sao chép MySQL vẫn có thể hữu ích trong việc ít nhất đưa dữ liệu đến cùng một máy chủ, giúp đồng bộ hóa nhanh hơn mà không cần thiết lập bộ nhớ liên kết. Tham khảo: https://dev.mysql.com/doc/refman/5.7/en/federated-storage-engine.html
Thời gian đồng bộ hóa
MySQL sẽ cho phép bạn tạo các sự kiện theo một lịch trình cụ thể để thực hiện công việc của mình (giả sử bạn không có bất kỳ công cụ lập lịch công việc bên ngoài nào).
Hy vọng rằng bạn có một số loại ngày được sửa đổi, bạn có thể truy vấn mỗi ngày một lần hoặc các khoảng thời gian chặt chẽ hơn trên tất cả các trường mà modified_at
> =DATE_SUB (NOW (), INTERVAL? HOUR)
Nếu bạn có thể thêm một cột, bạn có thể tạo một cột có tên là synced_at
sẽ có khả năng chống lại sự khác biệt xung nhịp máy chủ tốt hơn một chút. Sau đó, bạn có thể chỉ cần truy vấn nơi synced_at
LÀ NULL hoặc synced_at
<=modified_at
MySQL hỗ trợ các kích hoạt TRƯỚC và SAU KHI CHÈN / CẬP NHẬT / XÓA, v.v ... bạn có thể sử dụng các kích hoạt này để kích hoạt logic của mình. Hãy nhớ rằng bạn sẽ phải chịu một chút hình phạt về hiệu suất cho mỗi giao dịch và điều này có thể dễ dàng áp đảo các máy chủ sản xuất đang hoạt động.
Thực sự không có sự khác biệt lớn giữa TRƯỚC và SAU, ngoại trừ việc nếu bạn sử dụng trình kích hoạt kiểu TRƯỚC, bạn có thể ném một sqlstate để ngăn việc chèn vào bảng nguồn nếu điều quan trọng là cả hai bảng phải được đồng bộ hóa cao.
Logic đồng bộ hóa
Đây là mã giả nhưng ...
# 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
Tương tự như trên, bạn chỉ đang thao tác một bản ghi tại một thời điểm và bạn đang sao chép câu lệnh kích hoạt. Ví dụ:một INSERT TRIGGER trên bảng nguồn chỉ nên truy vấn INSERT trên bảng đích.
Đơn giản nhưng không được khuyến nghị cho bất kỳ thứ gì khác ngoài cơ sở dữ liệu báo cáo. Bỏ toàn bộ bảng và xây dựng lại nó từ các bản ghi khác.