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

(一)事故背景sql

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

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

語句已終止。 測試

生產數據庫的insert操做沒法執行成功,通過確認,是與開啓了事物複製有關。spa

 

(二)緣由分析翻譯

SQL SERVER報錯信息已經告訴咱們,與參數「max text repl size」有關,對於該參數,官方文檔解釋以下:code

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.server

翻譯爲中文:max text repl size (作大文本複製尺寸) 選項是指在執行INSERT, UPDATE, WRITETEXT,或者 UPDATETEXT 的時候,對於數據類型text, ntext, varchar(max), nvarchar(max), varbinary(max), xmlimage 能夠被添加到複製列或者捕獲列的最大長度。默認值是65536,若是設置爲」-1」,則長度無限制。xml

 

簡而言之,當參數max text repl size爲65536時,若是發佈數據庫(主庫)在執行INSERT, UPDATE, WRITETEXT, UPDATETEXT操做時,列的字符長度超過了65536,就會產生複製操做失敗,同時主庫的INSERT, UPDATE, WRITETEXT, UPDATETEXT也會失敗。blog

 

(三)事故重現

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

相關文章
相關標籤/搜索