zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SVN安装
    MS SQL Server 查询元数据
    MS SQL Server 时间函数
    Codeforces 666E Forensic Examination (后缀自动机 + 线段树合并)
    2020牛客暑期多校训练营(第八场) H Hard String Problem
    2020牛客暑期多校训练营(第四场) B Count New String
    2020牛客暑期多校训练营(第四场) A Ancient Distance
    2020杭电多校第三场 1007 Tokitsukaze and Rescue
    codeforces 1037H
    2020牛客暑期多校训练营(第三场) H Sort the Strings Revision
  • 原文地址:https://www.cnblogs.com/lijiaman/p/12182229.html
Copyright © 2011-2022 走看看