В настоящее время я обновляю наше хранилище данных с SQL 2012 до SQL 2016. У меня есть как старый, так и новый DW, работающие параллельно.
Мой процесс ETL (среда, разработанная в службах SSIS сторонней организацией) успешно выполняется более 2 лет в 2012 году, но не работает в 2016 году. Пока базы данных и процесс ETL идентичны.
Оба Сервера являются Виртуальными машинами, работающими на VMWare. Старый сервер - это Win 2008 с 24 ГБ оперативной памяти. SQL 2012 Std. Max mem установлен на 16Gb. Новый сервер - Win 2012 с 64 ГБ оперативной памяти. SQL 2016 dev. Max mem установлен на 50Gb. Новый DW работает под управлением версии 13.0.1601.5 RTM Developer Edition (64-разрядная версия).
Во время выполнения моего ETL-процесса шаги загрузки, использующие SQL-слияние в таблицу измерений или фактов, завершаются неудачно со следующей ошибкой.
Полный текст:
ОПИСАНИЕ: SQL Server Утверждение: File:, line = 951 Failed Assertion = 'IS_OFF (BUF_MINLOGGED, m_buf-> bstat) || pageModifyType! = PageModifyType_Contents || GetPagePtr () -> IsTextPage () '. Эта ошибка может быть связана с синхронизацией. Если ошибка повторяется после повторного выполнения оператора, используйте DBCC CHECKDB, чтобы проверить целостность базы данных, или перезапустите сервер, чтобы убедиться, что структуры данных в памяти не повреждены.
В соответствии с рекомендациями я запустил DBCC, и ошибок не было найдено. Я также перезапустил SQL. Затем я перезапустил процесс ETL и получил ту же ошибку.
Мои поиски этой ошибки показывают, что это известная ошибка в SQL 2008, 2012 и 2014 и исправленная в последующих исправлениях и накопительных обновлениях. поэтому я немного удивлен, увидев его в 2016 году.
Ссылки, которые я нашел, говорят, что это влияет на SSIS при попытке выполнить вставку, если база данных находится в модели восстановления Simple или Bulk Logged. (Я работаю в простой модели восстановления)
Предлагаемый обходной путь - изменить модель восстановления Db на FULL. Я пробовал это, и это работает, но это не так уж много решений для хранилища данных.
Кто-нибудь еще сталкивался с этим с 2016 года?
Кто-нибудь может предложить альтернативные обходные пути?
Обновления:
26/7/2016: я применил критическое обновление KB3164398 (v13.0.1708.0), и проблема все еще существует.
27.07.2016: Я применил накопительное обновление CU1 KB3164674 (v13.0.2149.0).
08.03.2016: Ошибка произошла быстро на нашем самом маленьком кубе. CU1 не решил проблему. Сегодня я сообщил об ошибке в MS Connect. Я также записал в службу поддержки Microsoft.
8/12/2016: MS-Support ответила изначально, но ответ был «У нас нет решения для этого». Парень из службы поддержки собирался обсудить это со своими коллегами и вернуться ко мне. 8 дней спустя я ничего не слышал от него.
Хотя у меня нет «исправления», мы нашли способ, который нас устроил. Смотрите мой ответ.
29/9/2016. Я применил CU2 на прошлой неделе. В четверг мы случайно запустили старую версию слияния, которая снова провалилась с той же ошибкой. Так что .. CU2 тоже не починил.
23/1/2017 : Я применил 2016 SP1 CU1 и считаю, что это решило проблему. Конкретно KB3205964
источник
Я считаю, что это было решено в 2016 году SP1 CU1.
В частности, по KB3205964
источник
Это исправлено путем применения накопительного обновления 1 (CU1) для MSSQL2016, см. Ссылку https://support.microsoft.com/en-us/kb/3164674.
источник
Я считаю, что мы нашли другой обходной путь. Я публикую свой ответ, так как считаю, что он может быть полезен, и он достаточно отличается от предложения wBob.
Мы изменили часть вставки оператора слияния, чтобы она вставлялась во временную таблицу, а не в исходную цель.
Как только оператор слияния выполняется, мы вставляем из #table в цель.
Это не идеально, но, по крайней мере, объединение все еще обрабатывает сложность 'upsert', отмечая строки, которые были удалены / истекли.
Мы обнаружили, что это приемлемый компромисс по сравнению с полным переписыванием слияния в виде отдельных вставок и обновлений.
источник