Replikation mit Abonnenten von speicheroptimierten Tabellen
Die Tabellen, die als Transaktionsreplikationsabonnenten fungieren, können (mit Ausnahme der Peer-zu-Peer-Transaktionsreplikation) als speicheroptimierte Tabellen konfiguriert werden. Andere Replikationskonfigurationen sind mit speicheroptimierten Tabellen nicht kompatibel.
Konfigurieren einer speicheroptimierten Tabelle als Abonnent
Führen Sie die folgenden Schritte aus, um eine speicheroptimierte Tabelle als Abonnenten zu konfigurieren.
Erstellen und Aktivieren einer Veröffentlichung
Erstellen einer Veröffentlichung
Fügen Sie der Veröffentlichung Artikel hinzu. Verwenden Sie für den
@upd_cmd
-Parameter die SCALL- oder SQL-Konvention.EXEC sp_addarticle @publication = N'Publication1', @article = N'Mem_Table', @source_owner = N'dbo', @source_object = N'Mem_Table', @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'none', @schema_option = 0x00000000080050DF, @identityrangemanagementoption = N'manual', @destination_table = N'Mem_Table', @destination_owner = N'dbo', @vertical_partition = N'false', @ins_cmd = N'CALL sp_MSins_Mem_Table', @del_cmd = N'CALL sp_MSdel_Mem_Table', @upd_cmd = N'SCALL sp_MSupd_Mem_Table'; GO
Generieren einer Momentaufnahme und Anpassen des Schemas
Erstellen Sie einen Momentaufnahmeauftrag, und generieren Sie eine Momentaufnahme.
EXEC sp_addpublication_snapshot @publication = N'Publication1', @frequency_type = 1; EXEC sp_startpublication_snapshot @publication = N'Publication1';
Navigieren Sie zum Ordner für Momentaufnahmen. Der Standardspeicherort ist "C:\Programme\Microsoft SQL Server\MSSQL12.<INSTANCE>\MSSQL\repldata\unc\XXX\JJJJMMDDHHMMSS\".
Suchen Sie nach . SCH-Datei für Ihre Tabelle, und öffnen Sie sie in Management Studio. Ändern Sie das Tabellenschema, und aktualisieren Sie die gespeicherte Prozedur, wie im Folgenden beschrieben.
Werten Sie die in der IDX-Datei definierten Indizes aus. Ändern Sie
CREATE TABLE
, um die erforderlichen Indizes, die Einschränkungen, den Primärschlüssel und die speicheroptimierte Syntax anzugeben. Für speicheroptimierte Tabellen dürfen Indexspalten NICHT NULL sein, und Indexspalten von Zeichentypen müssen Unicode sein und eine BIN2-Sortierung aufweisen. Siehe das unten stehende Beispiel:SET ANSI_PADDING ON; GO SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO CREATE TABLE [dbo].[Mem_Table]([c1] [int] NOT NULL, [c2] [float] NOT NULL, [c3] [decimal](10, 2) NOT NULL, [c4] [nvarchar](5) COLLATE SQL_Latin1_General_CP850_BIN2 NOT NULL, INDEX [hash_index_sample_memoryoptimizedtable_c2] HASH (c2) WITH (BUCKET_COUNT = 1024), INDEX [index_sample_memoryoptimizedtable_c3] NONCLUSTERED ([c3]), INDEX [nvarchar_index_sample_memoryoptimizedtable_c4] ([c4]), CONSTRAINT [PK_sample_memoryoptimizedtable] PRIMARY KEY NONCLUSTERED ([c1])) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA); GO
Wenn Sie die SCALL-Konvention für den
@upd_cmd
-Parameter verwenden, navigieren Sie zur Schemadatei (.sch), und ändern Sie die Table Update-Anweisung increate procedure [sp_MSupd_<SCHEMA><TABLE_NAME>]
, um Primärschlüsselspalten zu entfernen.Um Primärschlüsselupdates zu unterstützen, können Sie die UPDATE-Anweisung für Primärschlüssel wie folgt durch eine benutzerdefinierte gespeicherte Updateprozedur ersetzen:
Wählen Sie fehlende Spaltenwerte aus (SCALL gibt nur die Spalte an, die beim Updatevorgang berücksichtigt wird).
Löschen Sie den vorhandenen Datensatz.
Fügen Sie einen neuen Datensatz mit den bereitgestellten neuen Werten ein, einschließlich des neuen Primärschlüssels.
Die ursprüngliche Updateprozedur sieht folgendermaßen aus:
create procedure [sp_MSupd_Mem_Table] @c1 int = NULL, @c2 float = NULL, @c3 decimal(10,2) = NULL, @c4 nvarchar(5) = NULL, @pkc1 int = NULL, @bitmap binary(1) as begin if (substring(@bitmap,1,1) & 1 = 1) begin update [dbo].[Mem_Table] set [c1] = case substring(@bitmap,1,1) & 1 when 1 then @c1 else [c1] end, [c2] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [c2] end, [c3] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [c3] end, [c4] = case substring(@bitmap,1,1) & 8 when 8 then @c4 else [c4] end where [c1] = @pkc1 if @@rowcount = 0 if @@microsoftversion>0x07320000 exec sp_MSreplraiserror 20598 end else begin update [dbo].[Mem_Table] set [c2] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [c2] end, [c3] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [c3] end, [c4] = case substring(@bitmap,1,1) & 8 when 8 then @c4 else [c4] end where [c1] = @pkc1 if @@rowcount = 0 if @@microsoftversion>0x07320000 exec sp_MSreplraiserror 20598 end end go
Der Primärschlüssel sollte nie für einen Verleger aktualisiert werden. Kommentieren Sie das Update solcher Spalten in der Updateprozedur wie folgt aus:
create procedure [sp_MSupd_Mem_Table] @c1 int = NULL, @c2 float = NULL, @c3 decimal(10,2) = NULL, @c4 nvarchar(5) = NULL, @pkc1 int = NULL, @bitmap binary(1) as begin if (substring(@bitmap,1,1) & 1 = 1) begin update [dbo].[Mem_Table] set -- [c1] = case substring(@bitmap,1,1) & 1 when 1 then @c1 else [c1] end, [c2] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [c2] end, [c3] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [c3] end, [c4] = case substring(@bitmap,1,1) & 8 when 8 then @c4 else [c4] end where [c1] = @pkc1 if @@rowcount = 0 if @@microsoftversion>0x07320000 exec sp_MSreplraiserror 20598 end else begin update [dbo].[Mem_Table] set [c2] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [c2] end, [c3] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [c3] end, [c4] = case substring(@bitmap,1,1) & 8 when 8 then @c4 else [c4] end where [c1] = @pkc1 if @@rowcount = 0 if @@microsoftversion>0x07320000 exec sp_MSreplraiserror 20598 end end go
Um Updates des Primärschlüssels zu unterstützen, ändern Sie die Updateprozedur wie folgt
create procedure [sp_MSupd_Mem_Table] @c1 int = NULL, @c2 float = NULL, @c3 decimal(10,2) = NULL, @c4 nvarchar(5) = NULL, @pkc1 int = NULL, @bitmap binary(1) as begin if (substring(@bitmap,1,1) & 1 = 1) begin select @c1 = case substring(@bitmap,1,1) & 1 when 1 then @c1 else [c1] end, @c2 = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [c2] end, @c3 = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [c3] end, @c4 = case substring(@bitmap,1,1) & 8 when 8 then @c4 else [c4] end from [dbo].[Mem_Table] where [c1] = @pkc1 if @@rowcount <> 0 begin delete [dbo].[Mem_Table] where [c1] = @pkc1 if @@rowcount <> 0 insert into [dbo].[Mem_Table]([c1], [c2], [c3], [c4]) values ( @c1, @c2, @c3, @c4 ) end if @@rowcount = 0 if @@microsoftversion>0x07320000 exec sp_MSreplraiserror 20598 end else begin update [dbo].[Mem_Table] set [c2] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [c2] end, [c3] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [c3] end, [c4] = case substring(@bitmap,1,1) & 8 when 8 then @c4 else [c4] end where [c1] = @pkc1 if @@rowcount = 0 if @@microsoftversion>0x07320000 exec sp_MSreplraiserror 20598 end end go
Erstellen Sie eine Abonnentendatenbank mithilfe der Option "Elevate to Momentaufnahme Isolation", und legen Sie die Standardsortierung auf Latin1_General_CS_AS_KS_WS fest, falls Nicht-Unicode-Zeichendatentypen verwendet werden.
CREATE DATABASE [Sub] CONTAINMENT = NONE ON PRIMARY ( NAME = [Sub], FILENAME = [C:\Program Files\Microsoft SQL Server\MSSQL12\MSSQL\DATA\Sub.mdf]), FILEGROUP [mem] CONTAINS MEMORY_OPTIMIZED_DATA ( NAME = [mem], FILENAME = [C:\Program Files\Microsoft SQL Server\MSSQL12\MSSQL\DATA\Sub]) LOG ON ( NAME = [Sub_log], FILENAME = [C:\Program Files\Microsoft SQL Server\MSSQL12\MSSQL\DATA\Sub.ldf]) COLLATE Latin1_General_CS_AS_KS_WS; ALTER DATABASE [Sub] SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON; GO
Wenden Sie das Schema auf die Datenbank eines Abonnenten an, und speichern Sie das Schema für die zukünftige Verwendung.
Laden Sie die Verlegerdaten (Quelldaten) in den Abonnenten. Die Daten dürfen beim Verleger nicht geändert werden, bis Sie ein Abonnement hinzufügen. Sie können BCP verwenden, wie unten veranschaulicht:
bcp Pub.dbo.Mem_Table out Mem_Table.bcp -S. -T -C1252 -n bcp Sub.dbo.Mem_Table in Mem_Table.bcp -S. -T -C1252 -n
Konfigurieren Sie den Artikel neu, um Schemaänderungen beim Abonnenten zu deaktivieren:
EXEC sp_changearticle @publication = N'Publication1', @article = N'Mem_Table', @property = N'schema_option', @value = 0, @force_invalidate_snapshot = 1, @force_reinit_subscription = 1; GO
Hinzufügen eines "No sync"-Abonnements
Fügen Sie ein "No sync"-Abonnement hinzu.
EXEC sp_addsubscription
@publication = N' Publication1',
@subscriber = @@ServerName,
@destination_db = N'Sub',
@subscription_type = N'Push',
@sync_type = N'replication support only',
@article = N'all',
@update_mode = N'read only',
@subscriber_type = 0;
GO
Speicheroptimierte Tabellen empfangen nun Updates vom Verleger.
Beschränkungen
Es wird nur die unidirektionale Transaktionsreplikation unterstützt. Die Peer-zu-Peer-Transaktionsreplikation wird nicht unterstützt.
Speicheroptimierte Tabellen können nicht veröffentlicht werden.
Replikationstabellen auf dem Verteiler können nicht als speicheroptimierte Tabellen konfiguriert werden.
Die Mergereplikation kann speicheroptimierte Tabellen einschließen.
Auf dem Abonnenten können die Tabellen, die bei einer Transaktionsreplikation berücksichtigt werden, als speicheroptimierte Tabellen konfiguriert werden. Die Abonnententabellen müssen jedoch die Anforderungen für speicheroptimierte Tabellen erfüllen. Dies erfordert folgende Einschränkungen.
Zum Erstellen einer speicheroptimierten Tabelle auf einem Transaktionsreplikationsabonnenten müssen die Momentaufnahme-Schemadateien, mit denen die speicheroptimierten Tabellen erstellt werden, manuell geändert werden. Weitere Informationen finden Sie unter Ändern einer Schemadatei.
Tabellen, die mit speicheroptimierten Tabellen auf einem Abonnenten repliziert werden, sind auf das Limit von 8060 Byte pro Zeile für speicheroptimierte Tabellen beschränkt.
Tabellen, die mit speicheroptimierten Tabellen auf Abonnenten repliziert werden, sind auf die Datentypen beschränkt, die für speicheroptimierte Tabellen zulässig sind. Weitere Informationen finden Sie unter Unterstützte Datentypen.
Es gelten Einschränkungen für das Aktualisieren des Primärschlüssels von Tabellen, die mit einer speicheroptimierten Tabelle auf einem Abonnenten repliziert werden. Weitere Informationen finden Sie unter Replizieren von Änderungen an einem Primärschlüssel.
Fremdschlüssel, UNIQUE-Einschränkung, Trigger, Schemaänderungen, ROWGUIDCOL, berechnete Spalten, die Datenkomprimierung, Aliasdatentypen, Versionsverwaltung und Sperren werden in speicheroptimierte Tabellen nicht unterstützt. Weitere Informationen finden Sie unter Transact-SQL Constructs Not Supported by In-Memory OLTP .
Ändern einer Schemadatei
Gruppierte Indizes werden nicht unterstützt. Ändern Sie alle gruppierten Indizes in nicht gruppierte Indizes.
Alle Spalten im Schlüssel eines Indexes müssen als
NOT NULL
angegeben werden.Bei Verwendung der Option für speicheroptimierte Tabellen
DURABILITY = SCHEMA_AND_DATA
muss die Tabelle einen nicht gruppierten Primärschlüsselindex aufweisen.ANSI_PADDING muss auf ON festgelegt sein.
Replizieren von Änderungen eines Primärschlüssels
Der Primärschlüssel einer speicheroptimierten Tabelle kann nicht aktualisiert werden. Wenn Sie ein Primärschlüsselupdate auf einem Abonnenten replizieren möchten, ändern Sie die gespeicherte Updateprozedur so, dass der Updatevorgang als DELETE/INSERT-Paar übermittelt wird.