Vấn đề độ trễ nhân rộng giao dịch


7

Tôi được thừa hưởng hệ thống cơ sở dữ liệu như thế này. Hiện tại tôi có cơ sở dữ liệu nhà xuất bản ở chế độ tương thích SQL Server 2005 trên Windows Server 2008 R2 với máy chủ SQL Server 2008R2 SP2. Nhà phân phối là trên cùng một máy. Thuê bao là 2008R2 SP2 và cơ sở dữ liệu ở chế độ tương thích SQL Server 2008. Chúng tôi đang sử dụng nhân rộng giao dịch. Mức cô lập được đọc Cam kết. Nhà phân phối cư trú trên Nhà xuất bản. Mặc dù khi tôi nhấp chuột phải vào xuất bản và mặc dù đăng ký hiển thị dưới dạng đăng ký kéo, tôi nghĩ sẽ không có vấn đề gì vì nhà phân phối cư trú trên chính nhà xuất bản. Xin hãy sửa tôi nếu tôi sai. Hệ thống lưu trữ là IBM flex được chia sẻ bởi năm máy chủ bao gồm nhà xuất bản và thuê bao.

Kể từ vài ngày, tôi thấy độ trễ của vài giờ, nó bắt kịp vào buổi sáng và bắt đầu tăng trở lại vào buổi chiều. Tôi đã theo dõi https://www.mssqltips.com/sqlservertip353898/troubledh Boot-transactional-replication-latency-issues-in-sql-server/ để xem chính xác những gì đang xảy ra. Tôi chạy theo truy vấn.

USE distribution 
go 
EXEC Sp_browsereplcmds 
@xact_seqno_start = '<seq#>' -- seq# is same for start and end
,@xact_seqno_end = '<seq#>'
,@publisher_database_id = <publisher database id --this is different than database_id

Tôi thấy rằng có những cập nhật lớn được cho là đang được thực hiện trên một vài bảng liên quan đến sao chép và Log Reader chỉ là quét nhật ký giao dịch, không thể sao chép bất cứ điều gì cho đến khi giao dịch hoàn tất. Thật thú vị, tôi không thể thấy bất kỳ sự chặn nào trên cả nhà xuất bản và / hoặc người đăng ký. Việc thay đổi mức cô lập thành Đọc cách ly Ảnh chụp nhanh được cam kết (RCSI) có giúp ích ở đây không? Nó có giúp thay đổi khoảng thời gian bỏ phiếu thành 1 và kích thước readbatchsize thành 1000 hoặc 5000. Lệnh nào để thay đổi cài đặt đó không?

Tôi đã thay đổi hồ sơ mặc định của Log Reader Agent như sau. Khoảng thời gian bỏ phiếu từ 5 đến 1 và ReadBatchSize đến 5000. Điều này mang lại độ trễ từ 13 giờ đến 0 gần như ngay lập tức. Nhưng tôi thấy rằng nó đã trở lại 13 giờ.

Bản sao được đồng bộ hóa và tôi không có một manh mối nào cho nguyên nhân gốc thực sự gây ra độ trễ và bây giờ nó đã biến mất.

Câu trả lời:


7

Cuối cùng tôi đã phải gọi cho bộ phận hỗ trợ của Microsoft và chỉ một lệnh đơn giản có tên DBCC LOG INFO trên nhà xuất bản đã tiết lộ nguyên nhân gốc rễ có thể xảy ra. Tôi đã thấy hơn 8600 VLF! và đây là nguyên nhân của độ trễ đó. Ngoài ra, tệp nhật ký của chúng tôi được chia thành 538GB.

Bản sao đã không đồng bộ gần 19 giờ trước khi tôi nhận được cuộc gọi theo dõi từ Microsoft trợ giúp 4:00 chiều ngày hôm sau sau khi tôi mở trường hợp với Microsoft. Các bước để được thực hiện rất đơn giản. Sao lưu nhật ký db nhà xuất bản vài lần và cố gắng thu nhỏ tệp nhật ký. Đặt hệ số tăng cho tệp nhật ký là 8GB hoặc 12GB thay vì tỷ lệ phần trăm hoặc 500MB. Vì vậy, khi tệp nhật ký tiếp theo phát triển, nó sẽ tạo 16 VLF trên 8GB hoặc 12GB tùy thuộc vào hệ số tăng của bạn.

Sau khi tôi sao lưu nhật ký, tôi có thể thu nhỏ tệp nhật ký thành 350 GB và tổng số VLF vào khoảng 5300. Vẫn cao hơn. Độ trễ không giảm mặc dù. Nó đã đi đến 22 giờ. Tôi bắt đầu tự hỏi liệu số lượng VLF chỉ là một trong những nguyên nhân. Tuy nhiên, khoảng 11:30 tối, độ trễ giảm xuống còn khoảng 7h30m và tôi đã giải phóng thêm không gian trong khoảng thời gian đó, giảm VLF xuống còn 2001. Đến 2 giờ sáng, việc sao chép đã đồng bộ. Tôi đã nhanh chóng sao lưu và sao lưu nhật ký hai lần và thu nhỏ tệp nhật ký thành 10 GB và tăng trở lại khoảng 248 GB. Tổng số VLF tính đến thời điểm hiện tại là 184 và nhân rộng được đồng bộ hóa kể từ đó. Phù! Tệp nhật ký gần như trống rỗng.

Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi về điều này. Tôi vui mừng giúp đỡ. Hy vọng rằng ai đó không phải gọi cho Microsoft về vấn đề này.


Câu trả lời này không làm tôi ngạc nhiên. Chúng tôi nhận thấy sự cố nhật ký với một số tính năng "sử dụng nhật ký" sau khi bật CDC. Việc khắc phục tất cả độ trễ là giải quyết vấn đề VLF trên cơ sở dữ liệu chính và từ đó tôi đã thực hiện kiểm tra các thói quen bảo trì của chúng tôi.
Steve Mangiameli

6

Việc thay đổi mức cô lập thành Đọc cách ly Ảnh chụp nhanh được cam kết (RCSI) có giúp ích ở đây không?

Đây không phải là một thay đổi thẳng về phía trước và nó đi kèm với hình phạt tempdb bổ sung. Tôi sẽ không đề nghị bạn chỉ thay đổi mức cô lập thành RCSI mà không kiểm tra đúng cách và thấy lợi ích trong môi trường của bạn. Tin tôi đi, đây là một cách tiếp cận búa tạ.

Gần đây chúng tôi đã gặp phải vấn đề tương tự

cập nhật lớn đang được thực hiện trên một vài bảng liên quan đến sao chép và Log Reader chỉ là quét nhật ký giao dịch

Dưới đây là cách tôi giải quyết vấn đề:

  • Làm cho các bài viết được sao chép thành BATCHED (Thay đổi này là động và không yêu cầu khởi tạo lại) :

    • Điều này có thể được thực hiện bằng cách xuất bản nhấp chuột phải -> tạo tập lệnh -> kiểm tra @statusgiá trị. Bất kỳ giá trị nào dưới 16 chỉ ra rằng nó được đặt để sao chép bằng TSQL ==> KHÔNG Batched!
    • Ngay cả khi 1 bài viết không được đặt thành BATCH, không có bài viết nào sẽ bị BATCHED khi áp dụng các thay đổi cho người đăng ký.

    • Sử dụng bên dưới TSQL

          EXEC sp_changearticle @publication = N'<pub name>'  -- your publication Name
                              , @article = N'<article name>'  -- your article Name
                              , @property = 'status'
                              ,  @value = 'parameters'
  • Tạo một chỉ mục không rõ ràng trên cơ sở dữ liệu phân phối:

    USE [distribution]
    GO
    CREATE NONCLUSTERED INDEX [nc_MSrepl_commands_DBA]
    ON [dbo].[MSrepl_commands] ([publisher_database_id],[article_id],[xact_seqno])
    INCLUDE ([type],[originator_id])
    GO

Để biết thêm điều chỉnh trước, bạn có thể tham khảo Nâng cao hiệu suất sao chép giao dịch đặc biệt là Thông số phân phối và Trình đọc nhật ký.

Dưới đây là tập lệnh mà tôi đang sử dụng để tìm trạng thái Sao chép T-Rep:

USE [distribution]
-- Ref: http://www.sqlservercentral.com/blogs/basits-sql-server-tips/2012/07/25/t-sql-script-to-monitor-transactional-replication-status/

IF OBJECT_ID('Tempdb.dbo.#ReplStats') IS NOT NULL  
    DROP TABLE #ReplStats 

CREATE TABLE [dbo].[#ReplStats](
    [DistributionAgentName] [nvarchar](100) NOT NULL,
    [DistributionAgentStartTime] [datetime] NOT NULL,
    [DistributionAgentRunningDurationInSeconds] [int] NOT NULL,
    [IsAgentRunning] [bit] NULL,
    [ReplicationStatus] [varchar](14) NULL,
    [LastSynchronized] [datetime] NOT NULL,
    [Comments] [nvarchar](max) NOT NULL,
    [Publisher] [sysname] NOT NULL,
    [PublicationName] [sysname] NOT NULL,
    [PublisherDB] [sysname] NOT NULL,
    [Subscriber] [nvarchar](128) NULL,
    [SubscriberDB] [sysname] NULL,
    [SubscriptionType] [varchar](64) NULL,
    [DistributionDB] [sysname] NULL,
    [Article] [sysname] NOT NULL,
    [UndelivCmdsInDistDB] [int] NULL,
    [DelivCmdsInDistDB] [int] NULL,
    [CurrentSessionDeliveryRate] [float] NOT NULL,
    [CurrentSessionDeliveryLatency] [int] NOT NULL,
    [TotalTransactionsDeliveredInCurrentSession] [int] NOT NULL,
    [TotalCommandsDeliveredInCurrentSession] [int] NOT NULL,
    [AverageCommandsDeliveredInCurrentSession] [int] NOT NULL,
    [DeliveryRate] [float] NOT NULL,
    [DeliveryLatency] [int] NOT NULL,
    [TotalCommandsDeliveredSinceSubscriptionSetup] [int] NOT NULL,
    [SequenceNumber] [varbinary](16) NULL,
    [LastDistributerSync] [datetime] NULL,
    [Retention] [int] NULL,
    [WorstLatency] [int] NULL,
    [BestLatency] [int] NULL,
    [AverageLatency] [int] NULL,
    [CurrentLatency] [int] NULL
) ON [PRIMARY]


INSERT INTO #ReplStats 
SELECT da.[name] AS [DistributionAgentName]
      ,dh.[start_time] AS [DistributionAgentStartTime]
      ,dh.[duration] AS [DistributionAgentRunningDurationInSeconds]
      ,md.[isagentrunningnow] AS [IsAgentRunning]
      ,CASE md.[status]
        WHEN 1 THEN '1 - Started'
        WHEN 2 THEN '2 - Succeeded'
        WHEN 3 THEN '3 - InProgress'
        WHEN 4 THEN '4 - Idle'
        WHEN 5 THEN '5 - Retrying'
        WHEN 6 THEN '6 - Failed'
       END AS [ReplicationStatus]
      ,dh.[time] AS [LastSynchronized]
      ,dh.[comments] AS [Comments]
      ,md.[publisher] AS [Publisher]
      ,da.[publication] AS [PublicationName]
      ,da.[publisher_db] AS [PublisherDB]
      ,CASE 
         WHEN da.[anonymous_subid] IS NOT NULL 
            THEN UPPER(da.[subscriber_name])
       ELSE UPPER (s.[name]) END AS [Subscriber]
      ,da.[subscriber_db] AS [SubscriberDB]
      ,CASE da.[subscription_type]
        WHEN '0' THEN 'Push'  
        WHEN '1' THEN 'Pull'  
        WHEN '2' THEN 'Anonymous'  
       ELSE CAST(da.[subscription_type] AS [varchar](64)) END AS [SubscriptionType]
      ,md.[distdb] AS [DistributionDB]
      ,ma.[article]    AS [Article]
      ,ds.[UndelivCmdsInDistDB] 
      ,ds.[DelivCmdsInDistDB]
      ,dh.[current_delivery_rate] AS [CurrentSessionDeliveryRate]
      ,dh.[current_delivery_latency] AS [CurrentSessionDeliveryLatency]
      ,dh.[delivered_transactions] AS [TotalTransactionsDeliveredInCurrentSession]
      ,dh.[delivered_commands] AS [TotalCommandsDeliveredInCurrentSession]
      ,dh.[average_commands] AS [AverageCommandsDeliveredInCurrentSession]
      ,dh.[delivery_rate] AS [DeliveryRate]
      ,dh.[delivery_latency] AS [DeliveryLatency]
      ,dh.[total_delivered_commands] AS [TotalCommandsDeliveredSinceSubscriptionSetup]
      ,dh.[xact_seqno] AS [SequenceNumber]
      ,md.[last_distsync] AS [LastDistributerSync]
      ,md.[retention] AS [Retention]
      ,md.[worst_latency] AS [WorstLatency]
      ,md.[best_latency] AS [BestLatency]
      ,md.[avg_latency] AS [AverageLatency]
      ,md.[cur_latency] AS [CurrentLatency]
FROM [distribution]..[MSdistribution_status] ds 
INNER JOIN [distribution]..[MSdistribution_agents] da
    ON da.[id] = ds.[agent_id]                          
INNER JOIN [distribution]..[MSArticles] ma 
    ON ma.publisher_id = da.publisher_id 
        AND ma.[article_id] = ds.[article_id]
INNER JOIN [distribution]..[MSreplication_monitordata] md
    ON [md].[job_id] = da.[job_id]
INNER JOIN [distribution]..[MSdistribution_history] dh
    ON [dh].[agent_id] = md.[agent_id] 
        AND md.[agent_type] = 3
INNER JOIN [master].[sys].[servers]  s
    ON s.[server_id] = da.[subscriber_id] 
--Created WHEN your publication has the immediate_sync property set to true. This property dictates 
--whether snapshot is available all the time for new subscriptions to be initialized. 
--This affects the cleanup behavior of transactional replication. If this property is set to true, 
--the transactions will be retained for max retention period instead of it getting cleaned up
--as soon as all the subscriptions got the change. 
WHERE da.[subscriber_db] <> 'virtual' 
    AND da.[anonymous_subid] IS NULL
    AND dh.[start_time] = (SELECT TOP 1 start_time
                            FROM [distribution]..[MSdistribution_history] a
                            JOIN [distribution]..[MSdistribution_agents] b
                            ON a.[agent_id] = b.[id] AND b.[subscriber_db] <> 'virtual'
                            WHERE [runstatus] <> 1
                            ORDER BY [start_time] DESC)
    AND dh.[runstatus] <> 1

SELECT 'Transactional Replication Summary' AS [Comments];
SELECT [DistributionAgentName]
      ,[DistributionAgentStartTime]
      ,[DistributionAgentRunningDurationInSeconds]
      ,[IsAgentRunning]
      ,[ReplicationStatus]
      ,[LastSynchronized]
      ,[Comments]
      ,[Publisher]
      ,[PublicationName]
      ,[PublisherDB]
      ,[Subscriber]
      ,[SubscriberDB]
      ,[SubscriptionType]
      ,[DistributionDB]
      ,SUM([UndelivCmdsInDistDB]) AS [UndelivCmdsInDistDB]
      ,SUM([DelivCmdsInDistDB]) AS [DelivCmdsInDistDB]
      ,[CurrentSessionDeliveryRate]
      ,[CurrentSessionDeliveryLatency]
      ,[TotalTransactionsDeliveredInCurrentSession]
      ,[TotalCommandsDeliveredInCurrentSession]
      ,[AverageCommandsDeliveredInCurrentSession]
      ,[DeliveryRate]
      ,[DeliveryLatency]
      ,[TotalCommandsDeliveredSinceSubscriptionSetup]
      ,[SequenceNumber]
      ,[LastDistributerSync]
      ,[Retention]
      ,[WorstLatency]
      ,[BestLatency]
      ,[AverageLatency]
      ,[CurrentLatency]
FROM #ReplStats
GROUP BY [DistributionAgentName]
        ,[DistributionAgentStartTime]
        ,[DistributionAgentRunningDurationInSeconds]
        ,[IsAgentRunning]
        ,[ReplicationStatus]
        ,[LastSynchronized]
        ,[Comments]
        ,[Publisher]
        ,[PublicationName]
        ,[PublisherDB]
        ,[Subscriber]
        ,[SubscriberDB]
        ,[SubscriptionType]
        ,[DistributionDB]
        ,[CurrentSessionDeliveryRate]
        ,[CurrentSessionDeliveryLatency]
        ,[TotalTransactionsDeliveredInCurrentSession]
        ,[TotalCommandsDeliveredInCurrentSession]
        ,[AverageCommandsDeliveredInCurrentSession]
        ,[DeliveryRate]
        ,[DeliveryLatency]
        ,[TotalCommandsDeliveredSinceSubscriptionSetup]
        ,[SequenceNumber]
        ,[LastDistributerSync]
        ,[Retention]
        ,[WorstLatency]
        ,[BestLatency]
        ,[AverageLatency]
        ,[CurrentLatency]

SELECT 'Transactional Replication Summary Details' AS [Comments];
SELECT [Publisher]
      ,[PublicationName]
      ,[PublisherDB]
      ,[Article]
      ,[Subscriber]
      ,[SubscriberDB]
      ,[SubscriptionType]
      ,[DistributionDB]
      ,SUM([UndelivCmdsInDistDB]) AS [UndelivCmdsInDistDB]
      ,SUM([DelivCmdsInDistDB]) AS [DelivCmdsInDistDB]
FROM #ReplStats
GROUP BY [Publisher]
        ,[PublicationName]
        ,[PublisherDB]
        ,[Article]
        ,[Subscriber]
        ,[SubscriberDB]
        ,[SubscriptionType]
        ,[DistributionDB]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.