(一)事故背景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), xml, image 能夠被添加到複製列或者捕獲列的最大長度。默認值是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
方法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修改後直接生效,無需重啓數據庫。