Yeni anlık görüntü oluşturmadan işlem yayınına makale ekleme


23

Çekme aboneleriyle SQL 2008 R2 işlemsel çoğaltma kullanarak, bir makale eklediğimizde, tüm bir anlık görüntü oluşturmak zorunda kalmaktan kaçınmak istiyorum (db ~ 80 GB, bu yüzden bu saatler sürer).

Gönderen bu makalede , ben immediate_sync kapalı ayarlayarak kısmi anlık ile bunun nasıl gördün, ama bu bizim için çalışma yoktu.

İdeal olarak, tabloyu oluşturmak için bunu sadece db betiğimizin bir parçası olarak çalıştırmak istiyorum, bu yüzden eğer kopyalanmasını istiyorsak:

Create Table ...    
sp_addArticle ...    
sp_PushThisToOurSubscribersNow    

Yanıtlar:


13

GUI'yi kullanarak makaleyi SSMS üzerinden ekleyebilir ve hatta filtreler uygulayabilirsiniz. Makalenin diğer özelliklerinden hiçbirini değiştirmediğiniz sürece, tam bir anlık görüntü oluşturmanız gerekmez.

Eğer (makale ekledikten sonra) yayın GUI'sinde Tamam vurmak, bu yeniden başlatmak için uyarmadan kapanacak - bu eğer does yeniden başlatmak istemi, bir TAM anlık gerektirir o zaman değişti şey. Bu durumda, iptal düğmesine basın ve tekrar deneyin.

Makaleyi ekledikten sonra anlık görüntü işini başlatabilirsiniz ve yalnızca yeni makale için anlık görüntü oluşturduğunu fark edeceksiniz (mini anlık görüntü).

Ardından dağıtım işinizi kontrol edin ve masanın abonede oluşturulduğunu ve verilerinizin toplu olarak kopyalandığını unutmayın.

İyi şanslar ve daha fazla yardıma ihtiyacınız olursa haberim olsun.


Bu cevapta açıklanan her şeyi yaptım ama yine de kendimi senkronize etmek için çoğaltılmış veritabanını beklerken buldum. Yeni makaleler ekledikten sonra yeniden başlatmam istenmedi, ancak yine de tam bir başlatma yaptı. Dikkatli ol.
JzInqXc9Dg

7
  1. Yayın özelliği pencerenize yeni makaleler ekleyin (listedeki Yalnızca işaretli makaleleri göster seçeneğinin işaretini kaldırın)
  2. Tam aynı Yayın düğümünü tıklayın ve "gidin Görünüm anlık görüntü Aracısı Durumu "
  3. tık başlatmak ve sadece bu yeni makale yalnızca senkronize edilir gösterileri aynı pencerelerde günlüğünü dikkat
  4. Kısa bir süre sonra, yeni makaleler daha önce senkronize edilmiş olanların hepsini başlatmadan abonelerde senkronize edilecektir.

görüntü tanımını buraya girin


3

Aynı soruyu sordum ve bir süredir DBA olmama rağmen, bu konuda tamamen rahat olacak kadar derinlemesine bir çoğaltma yapmadım, bu yüzden aşağıdaki kaynakları ve rehberleri faydalı buldum:

  • Sürecin iyi bir özetini sunan bu blog . Ayrıca, mevcut geniş bir yayınınız varsa ve seçeneğinin "anlık_sync" olarak ayarlanmış olması durumunda, bir makaleyi her eklediğinizde veya değiştirdiğinizde tamamen yeni bir anlık görüntünün hazırlanmasına neden olacağını hatırlatır. Bu seçeneği kullanarak, bu seçeneği değiştirmek için kullanışlı bir ipucu varsp_changePublication @publication='MyPub', @property='immediate_sync', @value='false';

  • "Repltalk" deki MSDN blog yazısı (genel olarak iyi bir kaynak gibi geliyor!) - "doğrudan doğrudan" değil, ancak yine de yararlı

  • @ Brandon-Williams'ın bir Çekme aboneliği olması durumunda, onu kullanarak da yenilemeniz gerektiğine işaret ettiği bu sorusp_refreshSubscriptions @publication = 'MyPub'

  • SSMS Çoğaltma Monitörü - kılavuzu takip ederken ajanları (anlık görüntü, günlük okuyucu) durdurmak ve başlatmak için uygun bir yol.

İşte benim adım adım attığım, işe yarayan ve DBA’nın denetimini onaylayan gerçek adımlar:

  1. Replication Monitor'ü açın, yayını seçin, Acentelere gidin, Log Reader Agent'ı sağ tıklayın, Durdur'u tıklayın.
  2. Yayını, izin verilmeyen ve hemen eşitlenmeyecek şekilde ayarlayın, sp_changePublication@cody_konior 'un işaret ettiği gibi - evet, bu belgelenmemiş, ancak benim durumumda iyi çalıştı. YMMV
  3. Bağlantılı sunucu sorgusu kullanılarak verilerle doldurulmuş komut dosyası kullanarak abone olarak tabloyu oluşturdu (çünkü küçüktü). Ayrıca SSIS, BCP veya bunu yapmak için başka bir yol kullanabilirsiniz. Repl-enstantanenin sizin için yapmasıyla sorun yok ise, bu gerekli olmayabilir. Sadece ilk defa elle hazırlamak istedim.
  4. Kullanarak makale (tablo) ekleyin sp_addArticle
  5. Tablonun tüm sütunlarını kullanarak ekleyin sp_articleColumn(belirtilen yayın ve makale, DIDN'T sütunlar belirtin -> TÜM sütunlar anlamına gelir)
  6. sp_refreshSubscriptionsBu yayının çekmeceyi yenilemesi için uygulandı
  7. Replication Monitor'ü tekrar açın, pub'ı seçin, Agent'lara gidin, Snapshot Agent'a sağ tıklayın, "Başlat" a tıklayın. Yeni anlık görüntüyü oluşturarak bir kez çalışır.
  8. Log Reader Agent'ı sağ tıklayın, "Başlat" ı tıklayın. Normal olarak çalışmaya başlayacak ve çalışmaya devam edecektir ve çoğaltmanızın şimdi tekrar çalışması gerekir.

Evet, ederken olabilir ssms GUI ile değişikliklerin çoğunu, ben kaynak kontrolü (değiştir-kontrol), ve B) altındaki tüm dışarı olması, böylece A) mükerrer veya birden çok örneği dağıtılan komut de yararlı . Ne yazık ki, Ajan komut dosyasını durdurmak için zaman harcamamıştım / başlıyor, ancak bunlar sadece SQL Ajan İşleri oldukları için çok zor olmamalı. Tüm bu "İş Adı ile İş ID'sini bul" hilesini yapmanız gerekiyor (sorgu sysjobs- gerçekten, MS?) ...

Gelecekteki okuyucular yardımcı olur umarım!


3

Mevcut Yayınlardan Makale Ekleme ve Makale Bırakma bölümünde belirtildiği gibi , yayın için * yeni bir görüntü oluşturmanız gerekir.

Yeni bir yazı eklerken tüm makaleler için anlık üreten önlemek için, yayın özelliği immediate_sync0. Çağrısı olarak ayarlanması gerekir sp_addarticle, sonra sp_addsubscription. Abonelikler çekilirse ayrıca aramanız gerekir sp_refreshsubscriptions. Ardından bir anlık görüntü oluşturun ve yeni eklenen makale için yalnızca bir anlık görüntü oluşturulur.

* SQL Server Books Online'da önerilen yaklaşım budur. Yaklaşımınızdaki sorun, hatalara eğilimli olmasıdır.


2

Ana düzenleme Bu, bu cevabın tam bir tekrarı (önceki versiyonun hataya eğilimli olduğu ve sorunlara yol açabileceği konusunda geçerli eleştiriler alarak)

Ayrıca, bunun nasıl uygulanacağına dair bir demo yayınladı: Youtube - SQL Server Çoğaltma: Anlık görüntü almadan bir makale nasıl eklenir .

ÖNEMLİ: Bu DEĞİL bunu, do çalışma alma konusunda kendi başınıza olacak böylece, Microsoft'tan önerilen bir yaklaşım DEĞİL önemli izole testleri olmadan üretim ortamında doğrudan uygulamak ve adımlarla kendinizi rahat oluyor!

Takip edilecek adımlar:

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)

Doğrulamak için:

  • yayıncıda ekleme gerçekleştir - satırın aboneye ulaştığını doğrula
  • yayıncı üzerinde güncelleme yap - aboneye gelen değişikliğin doğrula
  • yayıncıda silme işlemini gerçekleştirme - abonede silinen satırı doğrulama
  • Son n satırının geldiğini ve yayıncı ile abone arasında eşleştiğini doğrulayın

ÖRNEK İşlem

A) Kendinizi yayıncınızda bir masa oluşturun:

/* 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) [TableNotUsingSnap] üzerinde bazı ekler / güncelleme / silme işlemleri yapmak için kendinize bir iş / proc / script oluşturun (daha sonra bunu, abonenin bu yöntemi kullanarak doğru şekilde nasıl senkronize edildiğini doğrulamak için kullanabilirsiniz.

Ön adımlar:

1. Abonede masanızı oluşturun

/* 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. Çoğaltma saklı yordamlarınızı oluşturun (güncelleme / ekleme / silme) - Abone

Repl işlemlerini oluşturabilirsiniz:

  • Elle (bir hata yapmak çok kolay olduğu için dikkatli olun!)
  • Bir Dev makinede MS Snapshot yöntemini kullanarak makaleyi ekleyin ve repl işlemlerini kapatın (tweaks'ınızı eklemeniz için hazır olun)
  • Bir tür jeneratör oluşturun / bulun

Başvurmanız gereken değişiklik:

  • sp_MSins_ [Şema] [TabloAdı] - IF NOT EXISTS (SELECT 'row already exists' FROM [Schema].[TableName] dest WITH (NOLOCK) WHERE dest.Id = @c1)Zaten oradaysa eklemek için ekle
  • sp_MSupd_ [Schema] [TableName] - IF @@rowcount = 0 ... exec sp_MSreplraiserror ...Uygulanmayan bir güncelleştirmeyi yoksaymayla ilgili yorum yapın (kayıt, verileri senkronize etmeden önce yayıncıda silinmiş olabilir)
  • sp_MSdel_ [Schema] [TableName] - IF @@rowcount = 0 ... exec sp_MSreplraiserror ...Uygulanmayan bir silmeyi yoksaymayla ilgili yorum yapın (kayıt, verileri senkronize etmeden önce yayıncıda silinmiş olabilir)

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]', @param2=@primarykey_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]', @param2=@primarykey_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]', @param2=@primarykey_text, @param3=13234
        End */
end
GO

YERLEŞTİRME ADIMLARI

3. Dağıtım aracısını durdurma - Dağıtımcı (Push) veya Abone (Çekme) hakkında

/*  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. Şimdi makaleyi yayına ekleyin - Yayıncı Hakkında

Anahtar parametreler:

  • sp_addarticle- @pre_creation_cmd = N'none'Dağıtım temsilcisine kendi nesnelerini düşürmemesini ve üretmemesini söylemek için kullanılır
  • sp_addsubscription- @sync_type = N'none'Distribütöre yeni bir anlık görüntü oluşturmak zorunda olmadığını söylemek için kullanılır, sadece IUD komutlarını sıraya koyabilir

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. Verilerinizi senkronize edin

Artık verilerinizi aboneliğinize kopyalamanız gerekir, şunları yapabilirsiniz:

  • Bağlantılı bir sunucu oluşturun ve kopyalayın.
  • Verme / Alma Sihirbazı'nı kullanın
  • Bir yedeklemeyi geri yükleyin ve farkları uygulayın
  • SSMS Araç Paketi 'Ekleme İfadeleri Oluştur ...' ile tabloyu açın.

Kullandığınız yöntem tam olarak okuyucuyu terk ediyorum, aynı zamanda Dağıtım Ajansınızın ne kadar süreyle durmasını istediğinize bağlı.

EKSTRA: Testlerinize eklenmiş bir adım olarak, işte bu komutta güvenebilmeniz için [TableNotUsingSnap] üzerinde IUD eylemleri oluşturmak üzere betiğinizi (Adım B'den itibaren) çalıştırmak için iyi bir nokta.

6. Dağıtım aracısını yeniden başlatın - Distribütör (Push) veya Abone (Çekin) hakkında

/*  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!
*/
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.