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:
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:
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.