SSIS Data flow не записывает первые несколько пакетов - PullRequest
0 голосов
/ 20 марта 2019

У меня есть поток данных в SSIS, который не будет случайным образом импортировать записи.Я работал над этим в течение нескольких недель, поэтому на данный момент у меня есть rowcount s в пакете SSIS, count(*) в SQL для проверки вставленных строк, триггеры в таблицу для записи того, что было вставлено, когда и вход в систему пакета SSIS при вставках.

Эта проблема возникает ЧРЕЗВЫЧАЙНО случайно.Это не может происходить в течение нескольких дней, а затем внезапно случиться утром, днем ​​и в любое время.

Итак, вот мой поток:

  1. Данные поступают из нескольких плоских файлов через одно соединение с одним плоским файлом и источником.
  2. Я использую rowcount для подсчета строк.Например, скажем, это 1000 строк.
  3. Я добавляю производный столбец в поток
  4. Я снова использую rowcount для подсчета строк.Это всегда соответствует # 2
  5. Затем я анализирую строку с помощью сценария ac # (не спрашиваю, почему я не просто делим, не релевантен, а не причина, и файл ненадежен).

    РЕДАКТИРОВАТЬ: Так как это было задано - сценарий c # имеет несколько попыток перехвата для разбора, и строки ошибок перехватываются и добавляются выходные данные об ошибках вместо обычных.Я проверил это, и он работает, как ожидалось.У меня также есть rowcount с ошибкой вывода.Это было 0 во всех случаях, когда возникла проблема, о которой я говорю.В других случаях он имеет значения (плохой синтаксический анализ XML), но это не относится к этой проблеме и не может быть исправлено, так как сам файл является плохим.После ошибки rowcount я массово вставляю эти строки в другую таблицу - эта вставка получает правильные значения во всех случаях.

  6. Я использую rowcount для подсчета строк.Этот номер до сих пор всегда также соответствовал # 2

  7. Запись вставляется в таблицу с использованием назначения OLE DB.Блокировка таблицы отключена, Проверьте, включены ли ограничения, Сохранить нулевые значения отключены, Сохранить идентификационные данные равны нулю, максимальный размер фиксации составляет 3500, а количество строк в пакете пустое.Вывод ошибки настроен на перенаправление.a Я использую пакет SSIS Log для проверки, и в журнале будет указано, что это ЕЩЕ 1000 строк
  8. Я использую вывод ошибок для rowcount, это число 0
  9. У меня есть дополнительные повторные вставки сболее низкие коммиты и т. д. Никакая другая работа с таблицей не выполняется, и поскольку на выходе # 8 каждый раз выводится ошибка 0, эти части даже не попадают, поэтому опять - не релевантно.
  10. Следующее в задачепоток выполняет подсчет (*) для таблицы и других журналов (см. ниже), он будет иметь меньшее число, то есть 700.

Теперь некоторая интересная информация из собранных мною журналов

  • Используя некоторую здоровенную запись в журнал, я использую соединение вставок, чтобы получить конкретные строки в таблице SQL, которые относятся к каждому вставленному файлу.Файлы, которые были вставлены первыми, будут иметь только одну (1) запись. Почему один - я не уверен. Обычно это происходит для двух-трех файлов.После этого следующий файл может иметь часть или весь файл - то есть 120 строк файла из 200 строк

  • Если я посмотрю на результаты данных триггера, журнал триггера покажет то же самоевещь: первые несколько вставок имеют только 1 строку, за которой следует примерно половина обычной вставки при следующей вставке (обычно мой поток данных имеет 450 записей в пакете, так что, например, это может быть около 200 записей).После этого оставшиеся партии имеют все 450 строк до последней партии (по очевидной причине не хватает строк для вставки).

Вывод:

По какой-то причине по какой-то причине вставки вставят только одну строку в первые несколько партий, а затем продолжатзаписать все записи в оставшиеся партии.Проблема в том, что SSIS, очевидно, ДУМАЕТ, что вставляет все строки (так как в журнале пакетов указано, что все строки были вставлены, и есть 0 строк ошибок, но count(*) для таблицы показывает по-разному).

Причины, по которым я пришел:

  • Это что-то вроде оператора Use database или какого-то другого оператора, который должен выполняться до того, как произойдет вставка, и по какой-то причине SSIS не ожидает этого?Я запустил трассировку SQL, и единственные операторы, которые я могу найти на том же spid до начала вставки, это

     exec [sys].sp_bcp_dbcmptlevel [DBNAME]
     set fmtonly on
     select * from [dbo].[TableName]
     set fmtonly off
    

У меня на вставке отключено Validate external metadata, поэтому я не уверенпочему он вообще делает этот шаг или как его остановить или если это даже необходимо.

  • Есть ли какая-то блокировка?Возможно - но почему он последовательно блокирует только первые несколько вставок и почему одна запись все еще вставляется из пакета?Если бы это было блокирование, я подозревал, что никакие записи не будут вставлены.Кроме того, при настройке таблицы не должно быть никаких блокировок для этих записей (проверяется родительская таблица на предмет того, что можно вставить).

  • Foreign Keys?Какое-то другое ограничение?Нет - FK не существует, и единственным ограничением является значение по умолчанию getdate() для столбца.

  • Ошибка в SQL и / или SSIS?Мой уровень исправлений для SQL - SQL Server 2008 R2 (Sp3) - 10.50.6220.0. Версия для служб SSIS - 2008.

  • Какой-то конфликт памяти?Память на машине обычно используется только на 50%.Я не видел огромных всплесков на нем.

Другая информация:

  • Сервер запускает пакет служб SSIS и SQL Server нана том же сервере, SQL Server имеет предел памяти, установленный таким образом, чтобы не вступать в конфликт с использованием памяти пакетом служб SSIS.

Я видел множество других вопросов, заданных в нескольких местах - ближайшийэто звучит так же, как мои проблемы, кажется, здесь , где они просто предлагают перестроить задачу потока данных.Возможно, я просто анал, но я хочу знать, почему это происходит, прежде чем я начну это делать, поскольку я не хочу всегда проверять каждый пакет SSIS, который я делаю, чтобы убедиться, что «эй!записать все строки, которые он пишет ".

EDIT : Журнал пакета потока данных из прогона, в котором произошла ошибка.У меня есть OnError, OnInformation, OnPreExecute, OnPostExecute, OnProgress, OnTaskFailed, BufferSizeTuning.

У меня не было OnWarning раньше, я только что добавил это и обновлю это, если / когда проблема возникнет снова, если какая-либо информация предупреждениядано.

<Messages>
  <Message StartTime="2019-03-19T12:09:14">The processing of file "D:\636885940052243508" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:14">Execute phase is beginning.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The total number of data rows processed for file "D:\636885940052243508" is 1020.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940052243508" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940088814813" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The total number of data rows processed for file "D:\636885940088814813" is 3.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940088814813" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940056841575" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The total number of data rows processed for file "D:\636885940056841575" is 1077.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940056841575" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940090153045" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The total number of data rows processed for file "D:\636885940090153045" is 5.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940090153045" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:15">The processing of file "D:\636885940052788627" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The total number of data rows processed for file "D:\636885940052788627" is 1005.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The processing of file "D:\636885940052788627" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The processing of file "D:\636885940089158218" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The total number of data rows processed for file "D:\636885940089158218" is 2.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The processing of file "D:\636885940089158218" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The processing of file "D:\636885940046337791" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The total number of data rows processed for file "D:\636885940046337791" is 962.
</Message>
  <Message StartTime="2019-03-19T12:09:16">The processing of file "D:\636885940046337791" has ended.
</Message>

... пропуск, потому что это сотни строк (да, счетчики совпадают, если бы я их добавил)

  <Message StartTime="2019-03-19T12:09:38">The final commit for the data insertion in "component "Insert" (1886)" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:38">The final commit for the data insertion  in "component "Insert" (1886)" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:38">The final commit for the data insertion in "component "Retry Insert" (2051)" has started.
</Message>
  <Message StartTime="2019-03-19T12:09:38">The final commit for the data insertion  in "component "Retry Insert" (2051)" has ended.
</Message>
  <Message StartTime="2019-03-19T12:09:38">Post Execute phase is beginning.
</Message>
  <Message StartTime="2019-03-19T12:09:38">"component "Malformed - Bad Parse" (10)" wrote 0 rows.
</Message>
  <Message StartTime="2019-03-19T12:09:38">"component "Insert" (1886)" wrote 36581 rows.
</Message>
  <Message StartTime="2019-03-19T12:09:38">"component "Retry Insert RBAR" (1933)" wrote 0 rows.
</Message>
  <Message StartTime="2019-03-19T12:09:38">"component "Malformed - Failed Insert" (1994)" wrote 0 rows.
</Message>
  <Message StartTime="2019-03-19T12:09:38">"component "Retry Insert" (2051)" wrote 0 rows.
</Message>
  <Message StartTime="2019-03-19T12:09:38">Cleanup phase is beginning.
</Message>
</Messages>
...