Vâng tôi có thể không nhận được nó, nhưng tôi cố gắng trả lời nó.
Bạn nói rằng bạn cần một giải pháp hiệu suất cao chạy thường xuyên (tối thiểu tất cả 2 phút) và bạn cần một cách tiếp cận tốt, nhanh chóng mà không cần khóa. Nhưng bạn không muốn có một hệ thống hộp đen.
Thay vì một hệ thống hộp đen, được sử dụng trên hàng triệu cài đặt với kết quả tốt, bạn có thử phát minh lại bánh xe và xây dựng giải pháp của riêng mình không? Hừm, nghe hơi lạ.
Trong thực tế đây là những gợi ý của tôi.
- Nhân rộng ngay cả khi bạn nói bạn sẽ không sử dụng nó. Đây là giải pháp dễ nhất và tốt nhất bạn có thể sử dụng cho việc này. Bản sao dễ cài đặt, sao chép nhanh và bạn không phải phát minh lại bánh xe. Nếu bạn chỉ lạ về khóa, bạn có thể thử để thiết lập
ISOLATION LEVEL
để READ_COMMITTED_SNAPSHOT
. Bạn có thể đọc thêm về nó ở đây . Điều này sẽ sử dụng hết một phần tempdb của bạn, nhưng bảng của bạn luôn có thể đọc và ghi được và bản sao có thể hoạt động ở chế độ nền.
Xem ví dụ dưới đây:
ALTER DATABASE yourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE yourDatabase SET READ_COMMITTED_SNAPSHOT ON
- CDC (Change Data Capture) cũng có thể là một giải pháp. Nhưng theo cách này bạn cần phải tự mình xây dựng gần như mọi thứ. Và tôi đã tạo ra trải nghiệm
CDC
có thể là một điều mong manh trong một số trường hợp. CDC
sẽ thu thập tất cả dữ liệu trên một bảng đã xem (bạn cần chỉ định từng bảng được xem theo cách thủ công). Sau đó, bạn sẽ nhận được giá trị trước và giá trị sau một INSERT
, UPDATE
hoặc DELETE
. CDC
sẽ giữ lại những thông tin đó trong một khoảng thời gian (bạn có thể tự mình chỉ định thông tin đó). Cách tiếp cận có thể là sử dụng CDC
trên một số bảng nhất định mà bạn cần xem và sao chép thủ công những thay đổi đó sang cơ sở dữ liệu khác. Nhân tiện, cũng CDC
sử dụng Bản sao máy chủ SQL dưới mui xe. ;-) Bạn có thể đọc thêm về nó ở đây .
Cảnh báo: CDC
sẽ không nhận thức được các DDL
trao đổi. Điều này có nghĩa, nếu bạn thay đổi bảng và thêm một cột mới, CDC
sẽ xem bảng nhưng bỏ qua tất cả các thay đổi đối với cột mới. Trong thực tế, nó chỉ ghi lại NULL
như giá trị trước và giá trị sau. Bạn cần phải xác định lại nó sau DDL
-Thay đổi vào một bảng đã xem.
- Cách bạn mô tả ở trên là một cái gì đó giống như nắm bắt một khối lượng công việc bằng SQL Server Profiler và chạy lại nó trên một cơ sở dữ liệu khác cho một số điểm chuẩn. Vâng, nó có thể làm việc. Nhưng thực tế là có quá nhiều tác dụng phụ là hơi quá nặng đối với tôi. Bạn sẽ làm gì nếu bạn thực hiện một cuộc gọi thủ tục trên máy khách của mình. Sau đó chạy cùng một lệnh tại cơ sở dữ liệu nguyên tắc của bạn vì nó không đồng bộ? Quy trình có thể chạy qua, nhưng nó có thể xóa / cập nhật / chèn các hàng không có trong máy khách của bạn. Hoặc làm thế nào để bạn xử lý nhiều khách hàng với một nguyên tắc. Tôi nghĩ rằng điều này là quá khó khăn. Trong trường hợp xấu nhất, bạn có thể phá hủy tính toàn vẹn của bạn.
- Một ý tưởng khác có thể dựa trên ứng dụng hoặc sử dụng kích hoạt. Tùy thuộc vào số lượng bảng bạn muốn được đồng bộ hóa. Bạn có thể viết tất cả các thay đổi vào một bảng phân tầng riêng biệt và chạy Công việc Tác nhân Máy chủ SQL tất cả x Phút để đồng bộ hóa các hàng đó trong bảng phân tầng với chủ của bạn. Nhưng điều này có thể hơi nặng nề nếu bạn cố gắng đồng bộ hóa (ví dụ) 150 bảng. Bạn sẽ có một chi phí lớn.
Vâng, đây là 2 xu của tôi. Hy vọng rằng bạn có một cái nhìn tổng quan tốt và có thể bạn đã tìm thấy một giải pháp phù hợp với bạn.