КОРЕКЦИЯ: Получавате съобщения за грешка или данните са повредени, след като изпълните SSIS пакет, който съдържа задача за поток от данни в ситуация с недостатъчно количество памет в SQL Server 2005 или SQL Server 2008

Microsoft разпространява корекциите на Microsoft SQL Server 2008 като един файл за изтегляне. Тъй като корекциите са кумулативни, всяко ново издание съдържа всички актуални поправки и корекции на защитата, които са били включени в предишното издание на корекция на SQL Server 2008.

Симптоми

Имайте предвид сценария, описан по-долу:

  • Изпълнявате пакет на услугите за интеграция на SQL Server (SSIS) в SQL Server 2005 или SQL Server 2008.

  • SSIS пакетът съдържа задача за поток от данни.

  • SSIS пакета се изпълнява на компютър, който има малко налична памет. Състоянието на недостатъчна памет може да възниква временно или периодично.

  • Когато изпълните SSIS пакета, буферите за данни се записват на диска поради състоянието на недостатъчна памет.

В този случай може да изпитате един или няколко от следните симптоми:

Симптом 1

Данните се повреждат, преди данните да достигнат местоназначението на потока от данни. Откривате, че данните в местоназначението на потока от данни неочаквано стават следните стойности.

  • "" : NULL, празен или празен низ
  • 0: Нулева стойност или нулева стойност, която има по-висока точност и мащаб.
  • 0-0-0 0:0:0 : Стойност на нулева дата с прекъснат ред

Забележка: Няма да получите съобщение за грешка, когато усетите този симптом.

Симптом 2

Получавате едно от следните съобщения за грешка при конвертиране на типа данни:

Съобщение за грешка 1

Забележка

DTS_E_OLEDBERROR. Възникна грешка в OLE базата данни. Код на грешка: 0x80004005.

Наличен е запис на OLE база данни. Източник: "Microsoft SQL Native Client" Hresult: 0x80004005 Описание: "Невалидна стойност на знак за спецификация за прехвърляне".

Съобщение за грешка 2

Забележка

DTS_E_COLUMNSTATUSERROR. Възникна грешка с входна колона "ИмеНаКолона" (IDnumber) при въвеждане на "Вход на местоназначение за OLE база данни" (IDNumber). Върнатото състояние на колоната беше: "Неуспешно преобразуване, тъй като стойността на данните препълни зададения тип.".

Симптом 3

Получавате следното съобщение за грешка за нарушение на ограничение:

Забележка

DTS_E_OLEDBERROR. Възникна грешка в OLE базата данни. Код на грешка: 0x80004005.

Наличен е запис на OLE база данни. Източник: "Microsoft SQL Native Client" Hresult: 0x80004005 Описание: "Командата е прекратена.".

Наличен е запис на OLE база данни. Източник: "Microsoft SQL Native Client" Hresult: 0x80004005 Описание: "Нарушение на ограничението PRIMARY KEY "PrimaryKeyName". Не може да се вмъкне дублиран ключ в обекта "TableName".".

Освен това, ако изпълните отново същия SSIS пакет, когато паметта е налична, този проблем няма да възникне.

Причина

Когато до ядрото за потока от данни се изпрати известие за недостиг на ресурс от памет, ядрото за поток от данни записва временно буферите за данни на диска. Този проблем възниква, защото стойностите на данните са зададени на NULL или нула неправилно, когато ядрото за поток от данни записва буфери за данни на диск. По тази причина, когато ядрото за поток от данни чете данни от буфери за данни и след това записва данни в местоназначението на потока от данни, местоназначението на потока от данни ще съдържа повредени стойности на данни. Повредените стойности на данните могат да доведат до грешки при преобразуване на типа данни или нарушение на ограничения.

Решение

Кумулативна информация за актуализацията

Версията на изданието на SQL Server 2008

Корекцията за този проблем е издадена за първи път в кумулативна актуализация 6. За допълнителна информация как да получите този сборен пакет за актуализация за SQL Server 2008, щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

971490 Сборен пакет за актуализация 6 за SQL Server 2008Note Тъй като компилациите са кумулативни, всяка нова корекция съдържа всички актуални поправки и корекции на защитата, които са включени в предишното издание на корекция на SQL Server 2008. Препоръчваме ви да помислите за прилагане на най-новото издание на корекцията, което съдържа тази гореща корекция. За допълнителна информация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

956909 Компилациите на SQL Server 2008, които са издадени след издаването на SQL Server 2008

SQL Server 2008 Service Pack 1 (SP1)

Важно: Трябва да инсталирате тази корекция, ако използвате SQL Server 2008 Service Pack 1 (SP1).

 Корекцията за този проблем е издадена и в сборна актуализация 3 за SQL Server 2008 Service Pack 1. За допълнителна информация относно този пакет за кумулативна актуализация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

971491 Сборен пакет за актуализация 3 за SQL Server 2008 Service Pack 1Note Тъй като компилациите са кумулативни, всяко ново издание на корекции съдържа всички актуални поправки и корекции на защитата, които са били включени в предишното издание на корекция SQL Server 2008. Microsoft препоръчва да обмислите прилагането на най-новото издание на корекцията, което съдържа тази гореща корекция. За допълнителна информация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

970365 Компилациите на SQL Server 2008, които са издадени след издаването на SQL Server 2008 Service Pack 1
 Актуалните поправки на Microsoft SQL Server 2008 се създават за конкретни сервизни пакети на SQL Server. Трябва да приложите актуална корекция за SQL Server 2008 Service Pack 1 към инсталация на SQL Server 2008 Service Pack 1. По подразбиране всяка актуална корекция, предоставена в сервизен пакет на SQL Server, се включва в следващия сервизен пакет на SQL Server.

SQL Server 2005 Service Pack 2 (SP2)

Важно: Трябва да инсталирате тази корекция, ако използвате SQL Server 2005 Service Pack 2.

Корекцията за този проблем е издадена за първи път в сборна актуализация 15 за SQL Server 2005 Service Pack 2. За допълнителна информация относно този пакет за кумулативна актуализация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

972510 Сборен пакет 15 за SQL Server 2005 Service Pack 2Note Тъй като компилациите са кумулативни, всяко ново издание на корекции съдържа всички актуални поправки и корекции на защитата, които са включени в предишното издание на корекция на SQL Server 2005. Microsoft препоръчва да обмислите прилагането на най-новото издание на корекцията, което съдържа тази гореща корекция. За допълнителна информация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

937137 Компилациите на SQL Server 2005, които са издадени след издаването на SQL Server 2005 Service Pack 2
Актуалните корекции на Microsoft SQL Server 2005 се създават за конкретни сервизни пакети на SQL Server. Трябва да приложите актуална корекция за SQL Server 2005 Service Pack 2 към инсталация на SQL Server 2005 Service Pack 2. По подразбиране всяка актуална корекция, предоставена в сервизен пакет на SQL Server, се включва в следващия сервизен пакет на SQL Server.

SQL Server 2005 Service Pack 3 (SP3)

Важно: Трябва да използвате тази корекция, ако използвате SQL Server 2005 Service Pack 3.

Корекцията за този проблем е издадена и в сборна актуализация 5 за SQL Server 2005 Service Pack 3. За допълнителна информация относно този пакет за кумулативна актуализация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

972511 Сборен пакет за актуализация 5 за SQL Server 2005 Service Pack 3Note Тъй като компилациите са кумулативни, всяко ново издание на корекции съдържа всички актуални поправки и корекции на защитата, които са включени в предишното издание на корекция SQL Server 2005. Microsoft препоръчва да обмислите прилагането на най-новото издание на корекцията, което съдържа тази гореща корекция. За допълнителна информация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

960598 Компилациите на SQL Server 2005, които са издадени след издаването на SQL Server 2005 Service Pack 3
Актуалните корекции на Microsoft SQL Server 2005 се създават за конкретни сервизни пакети на SQL Server. Трябва да приложите актуална корекция за SQL Server 2005 Service Pack 3 към инсталация на SQL Server 2005 Service Pack 3. По подразбиране всяка актуална корекция, предоставена в сервизен пакет на SQL Server, се включва в следващия сервизен пакет на SQL Server.

Заобиколно решение

За да заобиколите този проблем, отстранете състоянието на недостатъчна памет. Минималното количество памет, което може да предизвика този проблем, варира от компютъра на компютъра. По принцип това количество е между 32 мегабайта (МБ) и 64 МБ налична памет. Затова ви препоръчваме да конфигурирате сървъра да разпределя повече от 64 МБ свободна памет за SSIS.

Размерът по подразбиране на наличната памет, който сигнализира за събитие за известие за малко ресурс на паметта, е приблизително от 32 МБ на 4 гигабайта (ГБ) до максимум 64 МБ на 4 ГБ. За повече информация посетете следния уеб сайт на Microsoft Developer Network (MSDN):

https://msdn.microsoft.com/library/aa366541(vs.85).aspx
        
Но е трудно напълно да предотвратите този проблем, тъй като може да се колебае силно наличната памет на заети производствени сървъри. Освен това паметта може да се намали поради различни причини в рамките на обичайните дейности. За да намалите честотата на този проблем, използвайте един от следните методи:

Метод 1

Добавете още физическа памет към компютъра.

Метод 2

Изпълнете SSIS пакета на компютър, различен от компютъра, на който се изпълнява екземплярът на SQL Server.

Метод 3

Ако изпълните SSIS пакета на същия компютър, на който се изпълнява екземплярът на SQL Server, задайте по-малка стойност опцията за конфигуриране на максималната сървърна памет за екземпляра, за да увеличите свободната памет на компютъра.

Метод 4

Излезте от стресиращите приложения, които консумират много памет, когато изпълнявате SSIS пакети, които съдържат задачи за потока от данни.

Метод 5

Изпълнявайте SSIS пакетите и задачите за потока от данни серийно вместо паралелно, за да намалите общото потребление на паметта.

Метод 6

Използвайте метода, описан в подраздела "Следене на потреблението на памет за SSIS" в раздела "Повече информация", за отстраняване на неизправности при недостатъчна памет и след това оптимизиране на използването на паметта за SSIS.

Състояние

Microsoft потвърждава, че това е проблем в продуктите на Microsoft, които са изброени в раздела „Важи за“.

Повече информация

Повече подробности за симптомите

Симптом 1

Ако откриете повредени стойности на данни в местоназначението на потока от данни, повредените стойности на данни може да се показват като различни представяния в зависимост от типа на данните. Например следните типове данни се показват като различни различни представяния на повредени стойности на данни:

DT_STR = "" Стойности на NULL, празен или празен низ
DT_I4 = 0 Нулева стойност на целочисления тип данни
DT_UI1 = 0 Нулева стойност на типа данни "беззнаково цяло число"
DT_NUMERIC = 000000000000000000000000000000000000000 Нулева стойност, която има по-висока точност и мащаб.
DT_DBTIMESTAMP = 0-0-0 0:0:0 Стойност на нулева дата с прекъсната линия

В повечето сценарии всички колони и редове са с повредени стойности на данни или значителна част от колоните и редовете са с повредени стойности. Освен това общият брой редове, които достигат до местоназначението, обикновено отговаря на броя на очакваните редове в местоназначението, дори когато данните са повредени. Това се дължи на проблем с буфера. Може да се отрази цял буфер или набор от буфери в изпълняваната задача за потока от данни. В зависимост от размера на буфера и размера на данните на ред, всеки буфер може да съдържа стотици редове.

В някои разширени проекти не всички колони в задачата за поток от данни са засегнати. Ако данните се обработват в рамките на задачата за поток от данни с помощта на трансформации, като например изрази, трансформация на производна колона и трансформация на справка, някои колони от данните може да останат същите като очакваните от тях стойности. Това е така, защото SSIS замества повредените данни по време на задачата за потока от данни с тези преобразувани стойности.

В други разширени проекти някои редове може да бъдат загубени. Поради гъвкавия характер на посоката на данните в проектите за поток от данни на SSIS, повредените данни може да бъдат насочени към неочаквано местоназначение, ако неочакваните стойности на данните се възприемат в условната колона от проекта. Когато използвате трансформации, като например условни разделени трансформации или справочни трансформации, някои редове може да бъдат загубени, когато трансформацията пренасочи повредени стойности на данни. Например в справочни трансформации, ако повредените редове не съответстват на никакви референтни данни, редовете ще бъдат отхвърлени.

Симптом 2

Тъй като нулевите стойности не са валидни стойности в някои типове данни, е възможно да възникнат грешки при преобразуване на типа данни, когато доставчикът на OLE база данни преобразува типове данни. Понякога може да се получи препълване с тип данни. Например колона от тип данни "датачас" има стойност "0-0-0 0:0:0". Тази невалидна стойност ще предизвика този тип грешка, защото доставчикът на OLE база данни не може да форматира нулите във валидна стойност за дата за доставчика на OLE база данни за SQL Native Client.

Симптом 3

Нарушения на ограниченията може да възникнат, защото дублиращи се стойности на първичен ключ са вмъкнати в местоназначението на потока от данни. Например няколко нулеви стойности се вмъкват в колона от целочислен тип данни или няколко NULL стойности се вмъкват в колона от типа данни varchar. По същия начин релацията с външен ключ може да бъде нарушена, когато в целевата таблица се вмъкнат дублирани стойности на ключ.

Как да определите дали се сблъсквате с този проблем

Следните индикатори могат да се използват, за да се определи дали се сблъсквате с този проблем:

  • Можете да наблюдавате брояча на спулирани буфери за обекта SQL Server:SSIS Pipelineperformance, за да определите дали ядрото на потока от данни записва буфери за данни на диска поради известие за недостиг на ресурс от памет.

  • Можете също да прегледате DTS.tmp файла, намиращ се във временната директория, която е указана в свойството BufferTempStoragePath на задачата за потока от данни. Ако забележите, че размерът на файла на DTS.tmp се увеличава, ядрото за поток от данни записва буфери за данни на диска.

  • Ако искате да определите дали съществуващ SSIS пакет има този проблем, можете да добавите мултикаст трансформация към задачата за поток от данни в SSIS пакета, за да насочите копие на данните към местоназначение с неструктуриран файл за по-лесно наблюдение.

  • Друг признак за изключително малко налична памет е, че следното съобщение е регистрирано в регистрационния файл на SSIS пакета:

    Забележка

    DTS_I_CANTRELIEVEPRESSURE Диспечерът на буферите откри, че системата няма достатъчно виртуална памет, но не успя да смени буферите. Разгледани са 8 буфера, а 8 са заключени. Или няма достатъчно памет за конвейера, защото не е инсталирана достатъчно, или я използват други процеси, или твърде много буфери са заключени.

Как да следите потреблението на памет за SSIS

Следете паметта, за да измерите пиковото използване за различни изпълними процеси на услугите за интеграция на SQL Server, за да изчислите максималното използване на паметта

Наблюдавайте пиковото използване на паметта на различните изпълними процеси на SQL Server Integration Services, като например DTExec.exe и DTSHost.exe процеси, с помощта на брояча на частни байтове на обекта Process в монитора на производителността.

Когато пакетите на услугите за интеграция на SQL Server се изпълняват, намиране на максималната стойност за брояча на частни байтове на обекта "Процес" в монитора на производителността. Да разгледаме сценария, в който няколко пакета се изпълняват паралелно. В този случай добавете максималните стойности на всички процеси, които се изпълняват, за да получите максимално използване на паметта.

Наблюдавайте външните процеси, за да намерите върховете и долините

Наблюдавайте пиковото използване на паметта на процеси, различни от услугата SQL Server и SSIS услугата, като използвате брояча на частни байтове на обекта Process в монитора на производителността. Търсете пиковите времена на използване, които може да доведат до недостатъчно памет за услугите за интеграция на SQL Server. Вземете например за пиковите часове, когато множество потребители използват протокола за отдалечен работен плот (RDP), за да се свържат със сървъра, и за времената, когато се изпълнява софтуерът за архивиране.

Наблюдавайте използването на паметта на SQL Server, за да намерите върховете и падините

Ако съобщението "Използване на заключени страници за буферна група." липсва в последния файл на регистрационния файл за грешки, броячът на частни байтове за процеса на Sqlservr.exe може да показва колко памет се използва от SQL Server услуги.

Ако съобщението присъства в последния файл с регистрационния файл за грешки, използвайте брояча на общата сървърна памет (KB) на SQL Server: обекта на производителността на диспечера на паметта, за да измерите използването на паметта от буферната група на SQL Server. Освен това използвайте брояча на частни байтове за Sqlservr.exe процеса, за да намерите разпределената памет извън буферната пул (MemToLeave). Сумата от двете стойности – общата стойност на сървърната памет (КБ) и стойността на MemToLeave – е добра оценка на общото потребление на памет от SQL Server.

Мониторът на производителността и диспечерът на задачите не показват паметта, използвана от тези страници на буферната група, ако е вярно едно от следните неща:

  • Ако потребителското право за заключване на страници в паметта е присвоено на акаунта за стартиране на услугата SQL Server.
  • Ако паметта AWE е разрешена.

Забележка: Ако потребителското право за заключване на страници в паметта не е присвоено на акаунта за стартиране на услугата SQL Server и AWE не е разрешено, броячът на частни байтове за процеса на Sqlservr.exe трябва да показва паметта, използвана от SQL Services за различните SQL Server екземпляри.

Следете минималната стойност на наличната памет в Windows

За да следите наличната памет в Windows, използвайте един от следните методи:

  • Броячът "Налични MBytes" в монитора на производителността.

  • Физическата памет (МБ) – Свободна стойност в раздела "Производителност" на диспечера на задачите.

    Забележка: В някои операционни системи физическата памет (МБ) – безплатна е обозначена като физическа памет (K) – налична.

Справки

За повече информация за свойството MainPipeClass.BufferTempStoragePath посетете следния уеб сайт на Microsoft Developer Network (MSDN):

https://msdn.microsoft.com/library/microsoft.sqlserver.dts.pipeline.wrapper.mainpipeclass.buffertempstoragepath.aspx
За повече информация как да оптимизирате производителността на сървъра с помощта на опциите за конфигуриране на паметта, посетете следния уеб сайт на Microsoft Developer Network (MSDN):

https://msdn.microsoft.com/library/aa178118(sql.80).aspx
За повече информация относно броячите на монитора на представянето посетете следния уеб сайт на Microsoft:

https://technet.microsoft.com/library/cc768048.aspx
За повече информация относно начина на използване на мултикаст обхватите посетете следния уеб сайт на Microsoft:

https://technet.microsoft.com/library/cc758554(ws.10).aspxЗа повече информация относно модела на постъпково обслужване за SQL Server щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

935897 От екипа на SQL Server се предлага модел на постъпково обслужване, който да предоставя актуални корекции за съобщени проблеми

За допълнителна информация относно схемата за именуване на актуализациите на SQL Server щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

822499 Нова схема за именуване на пакетите за актуализация на софтуера на Microsoft SQL Server

За допълнителна информация относно терминологията относно софтуерните актуализации щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

824684 Описание на стандартната терминология, която се използва за описание на софтуерните актуализации на Microsoft