SQL server事物復制報錯:要復制的 LOB 數據的長度(xxxxx)超出了配置的最大值 65536


(一)事故背景

最近在SQL Server 2012生產數據庫上配置完事物復制(發布訂閱)后,生產數據庫業務出現了報錯信息:

要復制的 LOB 數據的長度(xxxxx)超出了配置的最大值 65536。請使用存儲過程 sp_configure 為 max text repl size 選項(默認值為 65536)增加配置的最大值。配置值為 -1 表示無限制,其他值表示由數據類型施加限制。

語句已終止。

生產數據庫的insert操作無法執行成功,經過確認,是與開啟了事物復制有關。

 

(二)原因分析

SQL SERVER報錯信息已經告訴我們,與參數“max text repl size”有關,對於該參數,官方文檔解釋如下:

The max text repl size option specifies the maximum size (in bytes) of text, ntext, varchar(max), nvarchar(max), varbinary(max), xml, and image data that can be added to a replicated column or captured column in a single INSERT, UPDATE, WRITETEXT, or UPDATETEXT statement. The default value is 65536 bytes. A value of -1 indicates that there is no size limit, other than the limit imposed by the data type.

翻譯為中文:max text repl size (做大文本復制尺寸) 選項是指在執行INSERT, UPDATE, WRITETEXT,或者 UPDATETEXT 的時候,對於數據類型text, ntext, varchar(max), nvarchar(max), varbinary(max), xmlimage 可以被添加到復制列或者捕獲列的最大長度。默認值是65536,如果設置為”-1”,則長度無限制。

 

簡而言之,當參數max text repl size為65536時,如果發布數據庫(主庫)在執行INSERT, UPDATE, WRITETEXT, UPDATETEXT操作時,列的字符長度超過了65536,就會產生復制操作失敗,同時主庫的INSERT, UPDATE, WRITETEXT, UPDATETEXT也會失敗。

 

(三)事故重現

STEP1:創建測試表test01

create table test01
(
id int not null primary key,
value nvarchar(max)
);

STEP2:向表中插入數據,要求value字段長度超過65536

insert into test01 values(1,
'Ea user must be granted the ALTER SETTINGS server-level permission. The ALTER SETTINGS 
... 省略N字符  ....
permission is implicitly held by the sysadmin and serveradmin fixed server roles.
Execute p
');
-- 查看字符長度
select DATALENGTH(id),DATALENGTH(value) from test01;
---- ------
4    89612

STEP3:配置事物復制,配置完成后,確認備庫test01表數據是否正常

select DATALENGTH(id),DATALENGTH(value) from test01;
---- ------
4    89612
經過確認,事物復制配置無異常。

STEP4:主庫添加新紀錄,要求長度大於65530,這里insert長度依然是89612

insert into test01 values(2,
'Ea user must be granted the ALTER SETTINGS server-level permission. The ALTER SETTINGS 
... 省略N字符  ....
permission is implicitly held by the sysadmin and serveradmin fixed server roles.
Execute p
');

發現主庫插入數據失敗,報錯如下:

消息 7139,級別 16,狀態 1,第 1 行

要復制的 LOB 數據的長度(89612)超出了配置的最大值 65536。請使用存儲過程 sp_configure 為 max text repl size 選項(默認值為 65536)增加配置的最大值。配置值為 -1 表示無限制,其他值表示由數據類型施加限制。

語句已終止。

在主庫上確認是否插入成功,發現插入失敗了。

STEP5:修改主庫的參數,不用修改備庫。將max text repl size(最大文本復制尺寸)改為: 89613。可以使用SMSS,也可以使用T-SQL,具體操作如下:

方法1:使用SMSS

image

 

方法2:使用T-SQL

GO  
EXEC sp_configure 'show advanced options', 1 ;   
RECONFIGURE ;   
GO  
EXEC sp_configure 'max text repl size', 89613 ;   
GO  
RECONFIGURE;   
GO

STEP6:再次執行第五步失敗的SQL語句,執行成功

 

(四)總結

如果使用了SQL SERVER的復制功能,建議把max text repl size(最大文本復制尺寸)直接改為“-1”,可以可以確保復制不會影響到生產業務。max text repl size修改后直接生效,無需重啟數據庫。

 

參考文檔:https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/configure-the-max-text-repl-size-server-configuration-option?redirectedfrom=MSDN&view=sql-server-ver15


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM