it-swarm-eu.dev

Přidat článek do transakční publikace bez generování nového snímku

Při použití transakční replikace SQL 2008 R2 s odběrateli vyžádání, když přidáme článek, nechtěl bych vytvořit celý snímek (db je ~ 80 GB, takže to zabere hodiny).

Z tento článek jsem viděl, jak to udělat s částečným snímkem vypnutím okamžitého_sync, ale to pro nás nefungovalo.

V ideálním případě bych to chtěl spustit jako součást našeho skriptu db pro vytvoření tabulky, takže pokud to chceme replikovat, uděláme:

Create Table ...    
sp_addArticle ...    
sp_PushThisToOurSubscribersNow    
24
user175528

Článek můžete přidat pomocí SSMS pomocí GUI a dokonce na něj použít filtry. Pokud nezměníte žádné další vlastnosti článku, nebudete muset generovat úplný snímek.

Když stisknete OK v publikačním GUI (po přidání článku), zavře se bez výzvy k opětovné inicializaci - pokud nemá Výzva k opětovné inicializaci, pak jste změnili něco, co vyžaduje FULL snímek. Pokud k tomu dojde, stiskněte zrušit a zkuste to znovu.

Po přidání článku můžete jednoduše spustit úlohu snímku a všimnete si, že vygeneruje pouze snímek pro nový článek (nazývaný mini-snímek).

Poté zkontrolujte distribuční úlohu a všimněte si, že vytvořila tabulku u odběratele a hromadně zkopírovala vaše data.

Hodně štěstí a dejte mi vědět, pokud budete potřebovat další pomoc.

13
NTDLS
  1. V okně vlastností Publikace přidejte nové články (zrušte zaškrtnutí políčka Zobrazit pouze zaškrtnuté články v seznamu)
  2. klikněte pravým tlačítkem na stejný uzel publikace a přejděte na „ Zobrazit stav agenta snímku
  3. klikněte na start a poznamenejte si, že protokol ve stejných oknech ukazuje, že tento nový článek je synchronizován pouze
  4. po krátké době budou nové články synchronizovány s odběrateli, aniž by bylo nutné inicializovat všechny dříve synchronizované

enter image description here

8
Iman Abidi

Měl jsem stejnou otázku, ai když jsem byl DBA na chvíli, opravdu jsem se nezabýval replikací dostatečně hluboko, abych jí byl úplně v pohodě, takže jsem si myslel, že následující zdroje a návody jsou užitečné:

  • Tento blog , který poskytl dobrý přehled procesu. Také nám to připomíná, že pokud máte rozsáhlou existující publikaci a její možnost je nastavena na „okamžité_sync“, způsobí, že při každém přidání nebo změně článku bude připravena zcela nová snímek. Má tedy užitečný tip, jak tuto možnost změnit pomocí sp_changePublication @publication='MyPub', @property='immediate_sync', @value='false';

  • MSDN blog post v "repltalk" (zní jako dobrý zdroj obecně!) - ne "přímo přímo" související, ale stále užitečné

  • Tato otázka, kde @ Brandon-Williams poukázal na to, že pokud je to předplatné Pull , měli byste jej také aktualizovat pomocí sp_refreshSubscriptions @publication = 'MyPub'

  • SSMS Replication Monitor - pohodlný způsob, jak zastavit a spustit agenty (snímek, čtečka protokolů), když se řídíte průvodcem.

Zde jsou skutečné kroky, které jsem následoval, které fungovaly dobře a splňovaly schválení mého dohledového DBA:

  1. Otevřete Replication Monitor, vyberte publikaci, přejděte na Agenti, klikněte pravým tlačítkem myši na Agent Reader Reader, klikněte na Zastavit.
  2. Nastavte publikaci tak, aby neumožňovala anonymní ani okamžitou synchronizaci pomocí sp_changePublication - ano, jak zdůrazňuje @cody_konior, je to zdokumentováno, ale v mém případě to fungovalo dobře. YMMV
  3. Tabulku jsme vytvořili u předplatitele ručně pomocí skriptu, vyplněného daty pomocí dotazu na propojený server (protože to bylo malé). Mohli byste také použít SSIS, BCP nebo jiné prostředky k tomu. A nemusí to být nutné, pokud jste v pořádku, když to uděláte za vás. Chtěl jsem to poprvé připravit ručně.
  4. Přidejte článek (tabulku) pomocí sp_addArticle
  5. Přidejte všechny sloupce tabulky pomocí sp_articleColumn (specifikovaná publikace a článek, DIDN'T zadat sloupce -> znamená VŠECHNY sloupce)
  6. Exec'd sp_refreshSubscriptions pro tuto publikaci obnovte tahač
  7. Znovu otevřete Replication Monitor, vyberte hospodu, jděte na Agenti, klikněte pravým tlačítkem na Snapshot Agent, klikněte na "Start". Spustí se jednou a vytvoří nový snímek.
  8. Klepněte pravým tlačítkem myši na Agent protokolu čtenářů a klikněte na "Start". Spustí se a bude pokračovat jako obvykle a vaše replikace by nyní měla znovu fungovat.

A i když ano, můžete děláte většinu změn pomocí SSMS GUI, považuji za užitečné skriptovat vše tak, aby to mohlo být A) pod kontrolou zdroje (změna kontroly), a B) nasazeny opakovaně nebo do více instancí. Bohužel jsem nestrávil čas skriptováním agentových zastávek/startů, ale to by nemělo být příliš těžké, protože jsou to jen SQL Agent Jobs. Musíte prostě udělat celý ten trik „najít identifikátor JobID pomocí názvu úlohy“ (dotaz sysjobs - opravdu, MS?) ...

Doufám, že to pomůže budoucím čtenářům!

3
NateJ

Jak je uvedeno v Přidávání článků a zrušení článků ze stávajících publikací , musíte * vytvořit novou snímek publikace.

Chcete-li se vyhnout generování snímku pro všechny články při přidávání nového článku, vlastnost publikace immediate_sync musí být nastaveno na 0. Volat sp_addarticle, pak sp_addsubscription. Pokud jsou předplatné vyžádána, musíte také zavolat sp_refreshsubscriptions. Poté vygenerujte snímek a vygeneruje se pouze snímek pro nově přidaný článek.

* Toto je doporučený přístup v SQL Server Books Online. Problém s vaším přístupem je v tom, že je náchylný k chybám.

3
Brandon Williams

Hlavní úprava Toto je úplné přepsání této odpovědi (s ohledem na platnou kritiku, že předchozí verze byla náchylná k chybám a způsobila by problémy)

Také zveřejnil ukázku, jak to aplikovat na: Youtube - SQL Server Replication: Jak přidat článek bez pořízení snímk .

DŮLEŽITÉ: Toto je [~ # ~] není [~ # ~] doporučený přístup od Microsoftu, takže budete sami, pokud jde o to, aby to fungovalo, ano [~ # ~] ne [~ # ~] aplikovat přímo na vaše produkční prostředí bez významného izolovaného testování a získat si pohodlí s kroky!

Postupujte následovně:

Planning steps:
    * Choose Publication that article will be added to
    * Gather information about the publication 
        exec sp_helppublication '[Name of Publication]'
        https://msdn.Microsoft.com/en-us/library/ms189782(v=sql.105).aspx
        - replication frequency = 0 - this is Transactional replication (THIS IS A REQUIREMENT FOR THIS METHOD)
        - replicate_ddl = 1 - means ALTER TABLES will apply SQL Server generated repl procs
        - independent_agent = 1 - means that you will only affect tables in this publication when deploying
    * Identify which subscribers are going to be affected

Pre-deployment steps (can be done at any time)
    1. Create table on subscribers
    2. Create custom replication procs on subscribers
       (Customisation will ignore if the IUD has already been applied to subscriber - because you have manually sync'd the data)

Deployment/Potential impact:
    3. Stop Distribution Agents to all subscribers for this publication
    4. Add article to publication on publisher
    5. Sync data from publisher to subscriber
    6. Start Distribution Agents to all subscribers for this publication
    7. Monitor/Verify all data has arrived

Optional follow on:
    8. Apply standard repl procs (removing if not exists checks)
       This is optional as the generated repl scripts should be fine for the most part

Note:  When ALTER table scripts are applied on the Publisher (when replicate_ddl = 1) repl procs will automatically be recreated by the Distribution Agent (so any customisation will be lost)

Potvrdit:

  • provést vložení na vydavatele - ověřte, že řádek dorazí na odběratele
  • provést aktualizaci na vydavateli - ověřte, že změna přijde na odběratele
  • provést smazání na vydavateli - ověří řádek odstraněný u odběratele
  • ověřte, že dorazilo posledních n řádků a shodujte se mezi vydavatelem a odběratelem

PŘÍKLAD Proces

A) Vytvořte si u svého vydavatele tabulku:

/* Deliberately applying IDENTITY, DEFAULT & INDEX to demonstrate usage on subscriber */
CREATE TABLE [dbo].[TableNotUsingSnap](
    [Id] [int] NOT NULL IDENTITY(1,1),
    [Note_Text] [varchar](4096) NOT NULL,
    [CreatedDate] [datetime] NULL,
    [LoggedDate] [datetime] NOT NULL CONSTRAINT DF_TableNotUsingSnap_LoggedDate DEFAUlT GETUTCDATE(),
 CONSTRAINT [PK_TableNotUsingSnap] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO 

CREATE NONCLUSTERED INDEX [IDX_NC_TableNotUsingSnap_LoggedDate]  ON [dbo].[TableNotUsingSnap]
(
    [LoggedDate] ASC
) INCLUDE ([Note_Text])
GO

B) Vytvořte si úlohu/proc/skript, abyste v [TableNotUsingSnap] provedli některé vložení/aktualizaci/odstranění (pak můžete pomocí této metody ověřit, jak je předplatitel správně synchronizován pomocí této metody.

Předběžné kroky:

1. Vytvořte tabulku na odběrateli

/* example script to add a table to a publication without running the snapshot agent 
Steps: 
    Pre steps: 
    1. Create table on subscribers
    2. Create replication procs on subscribers

    Deployment/Potential impact:
    3. Stop Distribution Agents to all subscribers for this publication
    4. Add article to publication on publisher
    5. DTS data from publisher to subscriber
    6. Start Distribution Agents to all subscribers for this publication
    7. Monitor/Verify all data has arrived

=========================================================
Notes:
    * Drop unnecessary FK's, Indexes
    * Do NOT have IDENTITY(1,1), DEFAULTS
    * Do have a Clustered PK
    * Create appropriate indexes for your subscribers use case */ 

-- RUN ON SUBSCRIBER
IF OBJECT_ID('dbo.TableNotUsingSnap') IS NOT NULL
    exec sp_rename 'dbo.TableNotUsingSnap', 'TableNotUsingSnap_20170127'
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TableNotUsingSnap](
    [Id] [int] NOT NULL,
    [Note_Text] [varchar](4096) NOT NULL,
    [CreatedDate] [datetime] NULL,
    [LoggedDate] [datetime] NOT NULL,
 CONSTRAINT [PK_TableNotUsingSnap] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

2. Vytvořte si uložené procedury replikace (aktualizace/vložení/smazání) - na předplatiteli

Můžete vytvořit repliku procs:

  • Ručně (buďte opatrní, protože je velmi snadné udělat chybu!)
  • Přidejte článek pomocí metody MS Snapshot na stroji Dev a skript vypněte replikaci procs (připraven pro přidání vylepšení)
  • Vytvořit/najít nějaký generátor

Změna, kterou budete muset použít:

  • sp_MSinsIF NOT EXISTS (SELECT 'row already exists' FROM [Schema].[TableName] dest WITH (NOLOCK) WHERE dest.Id = @c1) a nevkládejte jej, pokud již existuje
  • sp_MSupd_ [Schéma] [Název_tabulky] - Komentujte IF @@rowcount = 0 ... exec sp_MSreplraiserror ... a ignorujte aktualizaci, která se neaplikuje (protože záznam mohl být odstraněn na vydavateli před synchronizací dat)
  • sp_MSdel_ [Schéma] [Název_tabulky] - Komentujte IF @@rowcount = 0 ... exec sp_MSreplraiserror ... a ignorujte smazání, které nebude použito (protože záznam mohl být odstraněn na vydavateli před synchronizací dat)

sp_MSins_dboTableNotUsingSnap:

/* Customised Replication insert proc utilized to support adding to replication without a snapshot. */
create procedure [dbo].[sp_MSins_dboTableNotUsingSnap]     
    @c1 int,     
    @c2 varchar(4096),     
    @c3 datetime
AS 
BEGIN
    IF NOT EXISTS (SELECT 'row already exists' FROM [dbo].[TableNotUsingSnap] dest WITH (NOLOCK) WHERE dest.Id = @c1)
    BEGIN
        insert into [dbo].[TableNotUsingSnap]
            ([Id],
            [Note_Text],
            [Repl_Upsert_UTC]) 
        values 
            (@c1,
            @c2,
            @c3)  
    END
END
GO

sp_MSupd_dboTableNotUsingSnap:

/* Customised Replication insert proc utilized to support adding to replication without a snapshot. */
create procedure [dbo].[sp_MSupd_dboTableNotUsingSnap]     
    @c1 int = NULL,     
    @c2 varchar(4096) = NULL,     
    @c3 datetime = NULL, 
    @pkc1 int = NULL, 
    @bitmap binary(1)
AS 
BEGIN
    declare @primarykey_text nvarchar(100) = '' 

    if (substring(@bitmap,1,1) & 1 = 1)
    begin 
        update [dbo].[TableNotUsingSnap]
        set [Id] = case substring(@bitmap,1,1) & 1 when 1 then @c1 else [Id] end, 
            [Note_Text] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [Note_Text] end,
            [Repl_Upsert_UTC] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [Repl_Upsert_UTC] END
        WHERE [Id] = @pkc1

        /*  Commented out while adding to publication
        if @@rowcount = 0
            if @@microsoftversion>0x07320000
            Begin
                set @primarykey_text = @primarykey_text + '[id] = ' + convert(nvarchar(100),@pkc1,1)
                exec sp_MSreplraiserror @errorid=20598, @param1=N'[dbo].[TableNotUsingSnap]', @[email protected]_text, @param3=13233
            End */
    END
    ELSE
    BEGIN
        update [dbo].[TableNotUsingSnap]
        set [Note_Text] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [Note_Text] end,
            [Repl_Upsert_UTC] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [Repl_Upsert_UTC] END
        WHERE [Id] = @pkc1

        /*  Commented out while adding to publication
        if @@rowcount = 0
            if @@microsoftversion>0x07320000
            Begin
                set @primarykey_text = @primarykey_text + '[id] = ' + convert(nvarchar(100),@pkc1,1)
                exec sp_MSreplraiserror @errorid=20598, @param1=N'[dbo].[TableNotUsingSnap]', @[email protected]_text, @param3=13233
            End */
    end
END
GO

sp_MSdel_dboTableNotUsingSnap:

/* Customised Replication insert proc utilized to support adding to replication without a snapshot. */
create procedure [dbo].[sp_MSdel_dboTableNotUsingSnap]
    @pkc1 int
as
begin  
    declare @primarykey_text nvarchar(100) = ''

    delete [dbo].[TableNotUsingSnap]
    where [Id] = @pkc1

    /* ignore if the record doesn't exist when deleting it 
    if @@rowcount = 0
        if @@microsoftversion>0x07320000
        Begin
            set @primarykey_text = @primarykey_text + '[Id] = ' + convert(nvarchar(100),@pkc1,1)
            exec sp_MSreplraiserror @errorid=20598, @param1=N'[dbo].[TableNotUsingSnap]', @[email protected]_text, @param3=13234
        End */
end
GO

DEPLOYMENT STEPS

3. Zastavte distribučního agenta - na distributora (Push) nebo předplatitele (Pull)

/*  example script to add a table to a publication without running the snapshot agent
    Steps:
        Pre steps:
        1. Create table on subscribers
        2. Create replication procs on subscribers

        Deployment/Potential impact:
    **  3. Stop Distribution Agents to all subscribers for this publication
        4. Add article to publication on publisher
        5. DTS data from publisher to subscriber
        6. Start Distribution Agents to all subscribers for this publication
        7. Monitor/Verify all data has arrived

    =========================================================
    Note: check your publication settings:
          if @independent_agent = N'false'
            you will need to stop the distribution agent which will affect ALL
            publications going to that subscriber

          if @independent_agent = N'true'
            you will need to stop the publication specific distribution agent 
            (to each subscriber)

          Plan your live release around that knowledge!
*/

-- IF Push REPLICATION: RUN ON DISTRIBUTION SERVER
-- IF PULL REPLICATION: RUN ON SUBSCRIBER SERVER

/* disable the Job first */
exec msdb..sp_update_job @job_name = '[Distribution agent job]', @enabled = 0
GO

/* wait for 10 seconds - precaution ONLY */
WAITFOR DELAY '00:00:10.000'
GO

/* now stop the job */
exec msdb..sp_stop_job @job_name = '[Distribution agent job]'
GO

/* 
    NOTE: You might recieve an error about stopping a job that is already stopped.  You can ignore that error.
                It is up to you to verify that the job has been stopped correctly!
*/

4. Nyní přidejte článek do publikace - Na vydavateli

Klíčové parametry:

  • sp_addarticle - @pre_creation_cmd = N'none' Zvyklý na to, aby agent distribuce řekl, aby nevypustil a nevytvořil vlastní objekty
  • sp_addsubscription - @sync_type = N'none' Používá Distributorovi, že nemusí vytvářet nové snímky, může pouze zarovnat příkazy IUD nahoru

sp_addarticle:

exec sp_addarticle 
    @publication = N'Publication Name',
    @article = N'TableNotUsingSnap',
    @source_owner = N'dbo',
    @source_object = N'TableNotUsingSnap',
    @type = N'logbased',
    @description = N'',
    @creation_script = N'',
    @pre_creation_cmd = N'none',        /* this is a critical flag - tells SQL Server to not drop/recreate the repl procs/object on the subscriber */
    @schema_option = 0x0000000008004093,
    @identityrangemanagementoption = N'none',
    @destination_table = N'TableNotUsingSnap',
    @destination_owner = N'dbo',
    @status = 16,
    @vertical_partition = N'false',
    @ins_cmd = N'CALL [sp_MSins_dboTableNotUsingSnap]',
    @del_cmd = N'CALL [sp_MSdel_dboTableNotUsingSnap]',
    @upd_cmd = N'SCALL [sp_MSupd_dboTableNotUsingSnap]'
GO

-- Adding the transactional subscriptions
exec sp_addsubscription @publication = N'Publication Name',
    @subscriber = N'Subscriber Server',
    @destination_db = N'Subscriber DB',
    @subscription_type = N'Push',
    @sync_type = N'none',               /* tell SQL Server not to sync/snapshot this change to the publication */
    @article = N'all',
    @update_mode = N'read only',
    @subscriber_type = 0
GO

5. Synchronizujte svá data

Nyní musíte zkopírovat data do svého předplatitele, můžete:

  • Vytvořte propojený server a zkopírujte jej
  • Použijte Průvodce exportem/importem
  • Obnovte zálohu a použijte rozdíly
  • Rozbalte tabulku pomocí SSMS Toolpack 'Generate Insert Statement ...

Přesný způsob, který použijete, nechám na čtenáři, záleží také na tom, jak dlouho jste ochotni zastavit distribučního agenta.

EXTRA: Jako další krok ve vašich testech je zde dobré místo ke spuštění skriptu (z kroku (B)) k vytvoření akcí IUD na [ TableNotUsingSnap], abyste mohli získat důvěru v tuto metodu.

6. Restartujte distribučního agenta - na distributora (Push) nebo předplatitele (Pull)

/*  example script to add a table to a publication without running the snapshot agent
    Steps:
        Pre steps:
        1. Create table on subscribers
        2. Create replication procs on subscribers

        Deployment/Potential impact:
        3. Stop Distribution Agents to all subscribers for this publication
        4. Add article to publication on publisher
        5. DTS data from publisher to subscriber
    **  6. Start Distribution Agents to all subscribers for this publication
        7. Monitor/Verify all data has arrived

    =========================================================
    Note: check your publication settings:
          if @independent_agent = N'false'
            you will need to stop the distribution agent which will affect ALL
            publications going to that subscriber

          if @independent_agent = N'true'
            you will need to stop the publication specific distribution agent 
            (to each subscriber)

          Plan your live release around that knowledge!
*/

-- IF Push REPLICATION: RUN ON DISTRIBUTION SERVER
-- IF PULL REPLICATION: RUN ON SUBSCRIBER SERVER

/* disable the Job first */
exec msdb..sp_update_job @job_name = 'Distribution agent job', @enabled = 1
GO

/* wait for 10 seconds - precaution ONLY */
WAITFOR DELAY '00:00:10.000'
GO

/* now stop the job */
exec msdb..sp_start_job @job_name = 'Distribution agent job'
GO

/* 
    Now go and make sure everything is working ok!
*/
2
Andrew Bickerton