Saya memiliki 8 mesin SQL Server 2008 R2, masing-masing hosting 1 database. Setiap basis data memiliki struktur dan skema tabel yang identik, dan data yang sepenuhnya unik. Saya ingin membuat server pelaporan (mungkin 2008 atau 2012), yang mengkonsolidasikan baris dari tabel yang dipilih di 8 server sumber menjadi satu contoh tunggal dari tabel tersebut di server pelaporan. Ini adalah replikasi satu arah (tidak ada perubahan akan dilakukan ke server pelaporan). Saya perlu mereplikasi perubahan dari database sumber dengan latensi yang relatif rendah (katakanlah 20-30 detik).
Anda dapat mencapai ini dengan replikasi Transaksional . Di bawah ini adalah bagaimana Anda dapat melakukannya.
Catatan : Anda harus sedikit mengubah skema tabel Anda untuk mencapai hal ini karena Anda harus secara unik mengidentifikasi baris ketika Anda mereplikasi ke pelanggan. Sebagai prasyarat T-Rep Anda harus memiliki tabel dengan PK yang ditentukan.
Di bawah ini adalah tabel sampel Anda di server Penerbit yang ada di semua 8 server yang Anda ingin gabungkan baris pada server pelaporan:
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)
Di server pelanggan , Anda perlu membuat tabel yang sama tetapi dengan PK yang berbeda untuk secara unik mengidentifikasi baris di pelanggan (tidak melakukannya, T-Rep akan gagal dengan pelanggaran PK - saya berasumsi bahwa Anda tidak dapat mengubah struktur PK pada tinggal PRODUCTION daripada lebih baik untuk memodifikasi di pelanggan)
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)
Skrip di bawah ini akan membantu Anda mengatur T-Rep, cukup ganti nama databasame, nama server tujuan bersama dengan nama objek.
-- 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
Beberapa hal yang perlu diperhatikan:
Di sp_addsubscription pastikan itu @sync_type = N'automatic'
Dan properti artikel harus diatur ke:
Jadi akhirnya, Anda dapat membuat baris terkonsolidasi dari semua (dalam server 3 kasus saya) seperti di bawah ini:
Jadi dalam ringkasan,
- Gunakan T-Rep.
- Tambahkan kolom tambahan ke basis data Penerbit yang ada mis. ServerName untuk mengidentifikasi baris di pelanggan secara unik.
Buat tabel pada Pelanggan yang memiliki PK disertakan sebagai ServerName.
Buat replikasi tabel dengan @sync_type = N'automatic 'dan properti Article disetel ke "Simpan objek yang ada tidak berubah".
Jalankan agen snapshot.
Periksa data konsolidasi pada pelanggan.