Служба SSIS не может сохранить пакеты и перезагружает Visual Studio - PullRequest
2 голосов
/ 22 марта 2019

Это мой первый опыт работы с SSIS, так что терпите меня ... Я использую SSIS для переноса таблиц из Oracle в SSMS, я пытаюсь перенести несколько очень больших таблиц (более 50 миллионов строк). SSIS теперь полностью зависает и перезагружается VS, когда я просто пытаюсь сохранить пакет (даже не запуская его). Он продолжает возвращать ошибки из-за недостатка памяти, однако я работаю на удаленном сервере, который имеет много памяти, необходимой для запуска этого пакета.

Сообщение об ошибке при попытке сохранить

Error Message when trying to save

Единственное, о чем я могу думать, это когда этот пакет пытается работать, мои скорости Ethernet кбит / с достигают предела, когда пакет запускается. Может быть, нужно обновить мой конвейер?

График Ethernet

Ethernet Graph

Кроме того, моя самая большая таблица не будет работать при импорте из-за размеров BYTE (опять же, почти не используя всю память на сервере). Мы используем ODBC Source, так как это был единственный способ получить другие большие таблицы для загрузки более 1 миллиона строк.

Я попытался создать временный буферный файл, чтобы помочь с нехваткой памяти, но это не изменилось. Я изменил AutoAdjustBufferSize на True, без изменений в результатах. также изменились DefaultBufferMaxRows и DefaultBufferSize .. без изменений.

ОШИБКИ ПРИ РАБОТЕ БОЛЬШОГО СТОЛА:

Информация: 0x4004300C в SRC_STG_ TABLENAME , SSIS. Трубопровод: Выполнить фаза начинается.

Информация: 0x4004800D на SRC_STG_ TABLENAME : менеджер буфера Сбой вызова выделения памяти для 810400000 байт, но не удалось поменять любые буферы, чтобы уменьшить нагрузку на память. 2 буфера были и 2 были заперты.

Либо недостаточно памяти доступно для конвейера, потому что нет установлено достаточно, другие процессы использовали его, или слишком много буферы заблокированы.

Информация: 0x4004800F по адресу SRC_STG_ TABLENAME : менеджер буфера выделено 1548 мегабайт (-ов) в 2 физических буферах.

Информация: 0x40048010 в SRC_STG_ TABLENAME : компонент "ODBC" Source "(60) принадлежит 775 мегабайт (ы) физического буфера.

Информация: 0x4004800D на SRC_STG_ TABLENAME : менеджер буфера Сбой вызова выделения памяти для 810400000 байт, но не удалось поменять любые буферы, чтобы уменьшить нагрузку на память. 2 буфера были рассмотрели и 2 были заперты.

Либо недостаточно памяти доступно для конвейера, потому что нет установлено достаточно, другие процессы использовали его, или слишком много буферы заблокированы.

Информация: 0x4004800F в SRC_STG_ TABLENAME : менеджер буфера выделено 1548 мегабайт (-ов) в 2 физических буферах.

Информация: 0x40048010 в SRC_STG_ TABLENAME : Компонент "ODBC Source "(60) принадлежит 775 мегабайт (ы) физического буфера.

Информация: 0x4004800D в SRC_STG_ TABLENAME : менеджер буфера Сбой вызова выделения памяти для 810400000 байт, но не удалось поменять любые буферы, чтобы уменьшить нагрузку на память. 2 буфера были рассмотрели и 2 были заперты.

Либо недостаточно памяти доступно для конвейера, потому что нет установлено достаточно, другие процессы использовали его, или слишком много буферы заблокированы.

Информация: 0x4004800F по адресу SRC_STG_ TABLENAME : менеджер буфера выделено 1548 мегабайт (-ов) в 2 физических буферах.

Информация: 0x40048010 в SRC_STG_ TABLENAME : компонент "ODBC" Source "(60) принадлежит 775 мегабайт (ы) физического буфера.

Ошибка: 0xC0047012 в SRC_STG_ TABLENAME : сбой буфера при выделение 810400000 байт.

Ошибка: 0xC0047011 в SRC_STG_ TABLENAME : система сообщает 26 процент загрузки памяти. Есть 68718940160 байт физической памяти.с 50752466944 байт бесплатно.Есть 4294836224 байта виртуальной памяти с 914223104 байтами свободной.Файл подкачки имеет 84825067520 байт и 61915041792 байт свободно.

Информация: 0x4004800F в SRC_STG_ TABLENAME : диспетчеру буфера выделено 1548 мегабайт (-ов) в 2 физических буферах.

Информация: 0x40048010 в SRC_STG_ TABLENAME : Компоненту "Источник ODBC" (60) принадлежит 775 мегабайт (ы) физического буфера.

Ошибка: 0x279 в SRC_STG_ TABLENAME , источник ODBC [60]: не удалось добавить строку в буфер вывода.

Ошибка: 0x384 в SRC_STG_ TABLENAME , источник ODBC [60]: Произошла ошибка подключения к базе данных (ODBC).

Ошибка: 0xC0047038 в SRC_STG_ TABLENAME , SSIS.Pipeline: Код ошибки SSIS DTS_E_PRIMEOUTPUTFAILED.Метод PrimeOutput в ODBC Source возвратил код ошибки 0x80004005.Компонент возвратил код ошибки, когда механизм конвейера вызвал PrimeOutput ().Значение кода ошибки определяется компонентом, но ошибка является фатальной, и конвейер перестал выполняться.Перед этим могут быть сообщения об ошибках с дополнительной информацией о сбое.

Это действительно задерживает мою работу.ПОМОГИТЕ!

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Я предлагаю читать данные кусками:

Вместо загрузки всей таблицы попробуйте разбить данные на куски и импортировать их в SQL Server. Через некоторое время я ответил на аналогичный ответ, связанный с SQLite , я постараюсь воспроизвести его в соответствии с синтаксисом Oracle:


Пошаговое руководство

В этом примере каждый блок содержит 10000 строк.

  1. Объявить 2 переменные типа Int32 (@[User::RowCount] и @[User::IncrementValue])
  2. Добавьте Execute SQL Task, который выполняет команду select Count(*), и сохраните набор результатов в переменную @[User::RowCount]

enter image description here

enter image description here

  1. Добавить цикл For со следующими предпочтениями:

enter image description here

  1. Внутри контейнера цикла добавьте Data flow task
  2. Внутри задачи потока данных добавьте ODBC Source и OLEDB Destination
  3. В источнике ODBC выберите параметр SQL Command и напишите запрос SELECT * FROM TABLE * (только для получения метаданных`
  4. Сопоставить столбцы между источником и пунктом назначения
  5. Вернитесь к Control flow, нажмите Data flow task и нажмите F4 , чтобы просмотреть окно свойств
  6. В окне свойств перейдите к выражению и присвойте следующее свойство свойству [ODBC Source].[SQLCommand]: (подробнее см. Как передать переменные SSIS в выражении ODBC SQLCommand? )

    "SELECT * FROM MYTABLE ORDER BY ID_COLUMN
    OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
    

Где MYTABLE - имя исходной таблицы, а IDCOLUMN - ваш первичный ключ или идентификационный столбец.

Снимок экрана Control Flow

enter image description here

Ссылки


Обновление 1 - другие возможные обходные пути

При поиске похожих проблем я нашел несколько дополнительных способов, которые вы можете попробовать:

(1) Изменение максимальной памяти SQL Server

(2) Включить именованные каналы

(3) При использовании SQL Server 2008 установите исправления


Обновление 2 - Понимание ошибки

В следующем MSDN link причина ошибки была описана следующим образом:

Виртуальная память - это расширенный набор физической памяти. Процессы в Windows, как правило, не указывают, какие они должны использовать, поскольку это (в значительной степени) препятствует многозадачности Windows. SSIS выделяет виртуальную память. Если Windows в состоянии, все эти выделения хранятся в физической памяти, где доступ быстрее. Однако если SSIS запрашивает больше памяти, чем физически доступно, эта виртуальная память перетекает на диск, что заставляет пакет работать на порядок медленнее. И в худшем случае, если в системе недостаточно виртуальной памяти, пакет не будет работать.

0 голосов
/ 22 марта 2019

Вы запускаете свои пакеты параллельно?Если да, измените на serie.

Вы также можете попытаться разделить эту большую таблицу на подмножества, используя операцию, например по модулю.См. Этот пример:

http://henkvandervalk.com/reading-as-fast-as-possible-from-a-table-with-ssis-part-ii

(в примере он работает параллельно, но вы можете поставить это в серии)

Также, есливы запускаете пакет служб SSIS на компьютере, на котором запущен экземпляр SQL Server, при запуске пакета установите для параметра Максимальная память сервера для экземпляра SQL Server меньшее значение.Это увеличивает доступную память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...