SQL Server Sao chép nhiều-một


14

Tôi có 8 máy SQL Server 2008 R2 riêng lẻ, mỗi máy lưu trữ 1 cơ sở dữ liệu. Mỗi cơ sở dữ liệu có cấu trúc bảng và lược đồ giống hệt nhau và dữ liệu hoàn toàn duy nhất.

Tôi muốn thiết lập một máy chủ báo cáo (có thể là 2008 hoặc 2012), hợp nhất các hàng từ các bảng được chọn trên 8 máy chủ nguồn thành một phiên bản duy nhất của các bảng đó trên máy chủ báo cáo. Đây là bản sao một chiều (sẽ không có thay đổi nào đối với máy chủ báo cáo). Tôi sẽ cần sao chép các thay đổi từ cơ sở dữ liệu nguồn với độ trễ tương đối thấp (giả sử 20-30 giây).

Hơn nữa, tôi muốn tìm các phương pháp để đạt được điều này với ít tác động đến các máy chủ nguồn là thực tế. Các tác nhân, trình kích hoạt hoặc mod lược đồ của bên thứ 3 đối với các máy chủ đó rất khó khăn trong môi trường của tôi.

Những câu hỏi của tôi:

  • Kiến trúc và công nghệ đầy hứa hẹn để đạt được mục tiêu này là gì?
  • Tôi đã xem SQL Server Merge Replication, nhưng tôi lo ngại về độ trễ. Đây có phải là một công nghệ thích hợp cho mục tiêu này?
  • Có kiến ​​trúc nhiều-một để nhân rộng giao dịch không?
  • Tôi có nên xem xét sao chép 1 thành 1 vào 8 cơ sở dữ liệu trên máy chủ báo cáo của mình, theo sau là một số chức năng hợp nhất tùy chỉnh (sao chép 2 bước)?

Cảm ơn, John


Tùy chọn tích hợp duy nhất là Hợp nhất nhân rộng. SLA 30 giây có thể dễ dàng đạt được nếu không có hàng tấn thay đổi xảy ra tại các nguồn. Bất kỳ sơ đồ sao chép 2 bước nào cũng sẽ đưa thêm độ trễ vào quy trình, khiến việc đạt được SLA đã nêu trở nên khó khăn hơn.
Jon Seigel

Câu trả lời:


16

Tôi có 8 máy SQL Server 2008 R2 riêng lẻ, mỗi máy lưu trữ 1 cơ sở dữ liệu. Mỗi cơ sở dữ liệu có cấu trúc bảng và lược đồ giống hệt nhau và dữ liệu hoàn toàn duy nhất. Tôi muốn thiết lập một máy chủ báo cáo (có thể là 2008 hoặc 2012), hợp nhất các hàng từ các bảng được chọn trên 8 máy chủ nguồn thành một phiên bản duy nhất của các bảng đó trên máy chủ báo cáo. Đây là bản sao một chiều (sẽ không có thay đổi nào đối với máy chủ báo cáo). Tôi sẽ cần sao chép các thay đổi từ cơ sở dữ liệu nguồn với độ trễ tương đối thấp (giả sử 20-30 giây).

Bạn có thể đạt được điều này với nhân rộng Giao dịch . Dưới đây là cách bạn có thể làm điều đó.

Ghi chú : Bạn phải thay đổi một chút lược đồ bảng của mình để đạt được điều này vì bạn phải xác định duy nhất các hàng đó khi bạn đang sao chép vào thuê bao. Là điều kiện tiên quyết của T-Rep, bạn cần phải xác định các bảng có PK.

Dưới đây là bảng mẫu của bạn trên các máy chủ Nhà xuất bản trên tất cả 8 máy chủ của bạn mà bạn muốn hợp nhất các hàng trên máy chủ báo cáo:

CREATE TABLE Products
(
ProductID INT not null,
ProductName VARCHAR(25),
ServerName sysname default @@servername not null -- this is to identify which row is from which server ; probably add this using Alter column
)
GO
ALTER TABLE Products
ADD CONSTRAINT pk_Product_ID_ServerName PRIMARY KEY (ProductID)

Trên máy chủ thuê bao , bạn cần tạo cùng một bảng nhưng với PK khác nhau để xác định duy nhất các hàng tại thuê bao (không làm như vậy, T-Rep sẽ thất bại với vi phạm PK - Tôi giả sử rằng bạn không thể sửa đổi cấu trúc PK trên SẢN XUẤT trực tiếp thay vì tốt hơn để sửa đổi tại thuê bao)

CREATE TABLE Products
(
ProductID INT not null,
ProductName VARCHAR(25),
ServerName sysname default @@servername not null
);
GO

ALTER TABLE Products
ADD CONSTRAINT pk_Product_ID_ServerName PRIMARY KEY (ProductID,ServerName)

Tập lệnh bên dưới sẽ giúp bạn thiết lập T-Rep, chỉ cần thay đổi tên tệp dữ liệu, tên máy chủ đích cùng với tên đối tượng.

-- Enabling the replication database
use master
exec sp_replicationdboption @dbname = N'repl1', @optname = N'publish', @value = N'true'
GO

exec [repl1].sys.sp_addlogreader_agent @job_login = null, @job_password = null, @publisher_security_mode = 1
GO
exec [repl1].sys.sp_addqreader_agent @job_login = null, @job_password = null, @frompublisher = 1
GO
-- Adding the transactional publication
use [repl1]
exec sp_addpublication @publication = N'repl1_2005', @description = N'Transactional publication of database ''repl1'' from Publisher ''server_name\SQL2005''.', @sync_method = N'concurrent', @retention = 0, @allow_push = N'true', @allow_pull = N'true', @allow_anonymous = N'false', @enabled_for_internet = N'false', @snapshot_in_defaultfolder = N'true', @compress_snapshot = N'false', @ftp_port = 21, @ftp_login = N'anonymous', @allow_subscription_copy = N'false', @add_to_active_directory = N'false', @repl_freq = N'continuous', @status = N'active', @independent_agent = N'true', @immediate_sync = N'false', @allow_sync_tran = N'false', @autogen_sync_procs = N'false', @allow_queued_tran = N'false', @allow_dts = N'false', @replicate_ddl = 1, @allow_initialize_from_backup = N'false', @enabled_for_p2p = N'false', @enabled_for_het_sub = N'false'
GO


exec sp_addpublication_snapshot @publication = N'repl1_2005', @frequency_type = 1, @frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 0, @frequency_subday_interval = 0, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 0, @job_login = null, @job_password = null, @publisher_security_mode = 1
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'sa'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'NT AUTHORITY\SYSTEM'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'BUILTIN\Administrators'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'server_name\SQLServer2005SQLAgentUser$server_name$SQL2005'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'server_name\SQLServer2005MSSQLUser$server_name$SQL2005'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'distributor_admin'
GO

-- Adding the transactional articles
use [repl1]
exec sp_addarticle @publication = N'repl1_2005', @article = N'Products', @source_owner = N'dbo', @source_object = N'Products', @type = N'logbased', @description = N'', @creation_script = N'', @pre_creation_cmd = N'none', @schema_option = 0x000000000803509F, @identityrangemanagementoption = N'none', @destination_table = N'Products', @destination_owner = N'dbo', @status = 24, @vertical_partition = N'false', @ins_cmd = N'CALL [sp_MSins_dboProducts]', @del_cmd = N'CALL [sp_MSdel_dboProducts]', @upd_cmd = N'SCALL [sp_MSupd_dboProducts]'
GO

-- Adding the transactional subscriptions
use [repl1]
exec sp_addsubscription @publication = N'repl1_2005', @subscriber = N'server_name\SQL2008R2', @destination_db = N'repl123', @subscription_type = N'Push', @sync_type = N'automatic', @article = N'all', @update_mode = N'read only', @subscriber_type = 0
exec sp_addpushsubscription_agent @publication = N'repl1_2005', @subscriber = N'server_name\SQL2008R2', @subscriber_db = N'repl123', @job_login = null, @job_password = null, @subscriber_security_mode = 1, @frequency_type = 64, @frequency_interval = 1, @frequency_relative_interval = 1, @frequency_recurrence_factor = 0, @frequency_subday = 4, @frequency_subday_interval = 5, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 0, @dts_package_location = N'Distributor'
GO

Vài điểm cần lưu ý:

Trong sp_addsubcription hãy chắc chắn rằng @sync_type = N'automatic'

Và các thuộc tính bài viết nên được đặt thành:

nhập mô tả hình ảnh ở đây

Vì vậy, cuối cùng, bạn có thể có các hàng được hợp nhất từ ​​tất cả (trong trường hợp của tôi là 3 máy chủ) như sau:

nhập mô tả hình ảnh ở đây

Vì vậy, tóm lại,

  • Sử dụng T-Rep.
  • Thêm một cột bổ sung vào cơ sở dữ liệu Nhà xuất bản hiện tại, ví dụ như serverName để xác định duy nhất các hàng tại thuê bao.
  • Tạo bảng trên Thuê bao có PK bao gồm Tên máy chủ.

  • Tạo bản sao của các bảng với @sync_type = N'automatic 'và thuộc tính Article được đặt thành "Giữ nguyên đối tượng hiện tại không thay đổi".

  • Chạy đại lý chụp nhanh.

  • Kiểm tra dữ liệu hợp nhất trên thuê bao.


@JohnJeheimer Vui mừng vì điều đó đã giúp. Nếu bạn cảm thấy rằng câu trả lời đã trả lời câu hỏi của bạn, vui lòng upvote / mark là câu trả lời.
Kin Shah
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.