Прошу допомоги гуру в області SSIS для експорту даних з MS SQL Server на MySQL

Потрідно перекинути деякі дані з MS SQL Server на MySQL. Сам MySQL знаходиться доволі далеко й не гігант в плані ресурсів, тому використання linked server себе не виправдало — могло залягати на години.

Вирішив використовувати SSIS.

Використовую VS Community 2015, поставив SSDT. Стоїть екземпляр SQL Server 2012.

Суть всього процесінга полягає в тому, що потрібно на MS SQL Server підготувати дані (із базової таблиці вибрати шматок (по даті), підігнати по формату й типах даних, залити все в тимчасову таблицю), далі з MySQL видалити дані за цю ж дату, оскільки там воно вже може бути не актуальним і залити в кінець з тимчасової. Задача тривіальна.

Створюю проект:
Перший таск: «Execute SQL» — організовую тестову таблицю на MS SQL Server. З’єднання працює, все чудово, перевіряю в базі — все є.
Другий таск: «Execute SQL» — видаляє неактуальні дані з MySQL. Створюю з’єднання через ODBC Driver (прочитав, як тут — stackoverflow.com/...​pying-table-to-sql-server)). Все працює, дані з MySQL видаляються.
Третій таск: «Data Flow» — власне, перенесення на MySQL. Для джерела беру OLE DB, для призначення — ADO.NET, який читає раніше створене ODBC з’єднаня... плачу(
Отримую помилку: [SSIS.Pipeline] Ошибка: Код ошибки служб SSIS DTS_E_PROCESSINPUTFAILED. Метод ProcessInput в компоненте «Назначение ADO NET» (53) завершился сбоем с кодом ошибки 0xC020844B при обработке входа «Вход назначения ADO NET» (60). Указанный компонент возвращает ошибку при вызове метода ProcessInput. Данная ошибка относится к компоненту, но является неустранимой и приводит к остановке выполнения задачи потока данных. Возможно, до этого были выданы сообщения об ошибках, в которых содержатся более подробные сведения о причине сбоя.

Вже декілька днів нічого не можу зробити. Всі гуглозапити видають тривіальні відповіді й приклади, які не допомагають.

До речі, створював з’єднання для MySQL також і через .NET Framework MySQL Provider — також помилка, така ж.

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Timeout? Latency between MySQL and MSSQL ?
Switch Ado.net to OLE DB ?

выполни на MySQL сервере

mysql> set global sql_mode=’ANSI’;

еще тут
blogs.msdn.microsoft.com/...mysql-database-from-ssis

и сразу после этого регрессионное тестирование всего mysql-related кода :)
ихмхо безопаснее менять параметры сессии.

Не уверен, что эта проблема и ее решение еще актуальны, т.к. реализовывал экспорт в MySQL средствами MS SQL лет 5 назад, но тем не менее попробуйте.
Перед Data Flow нужно вызвать следующий SQL script на MySQL (Execute SQL Task). Без него некорректно обрабатываются кавычки, генерируемые SSIS для destination:

set sql_mode=’STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ANSI_QUOTES’

ODBC connection использеушь а попробовать ODBC destination не попробовал ?

Вроде как. Что так удивляет ?

Использую NativeClient соединение для источника OLE DB и использую ODBC соединение через драйвер для назначения ADO.NET => ваша фраза абсолютно профанская

Коллега если у Вас пару дней ничего не получается и Вы бьетесь над элементарной задачой (а она правда простая для DBA)
то поднятие вопроса о профанации звучит как минимум странно.
Возможно кто — то не видит слона ?

Сначала учись искать проблемы у себя. Это к слову.

По сути вопроса.
1. установить MySQL Connector
2. создать DSN
3 Создать ODBC connection over being created DSN
4. в Dataflow task юзать
OLEDB +NCLI for Source (MSSQL)
ODBC Destination ( based on ODBC connection ) for MySQL

PS ADO destination/source непопулярны в мире ETL с использованием SSIS

ODBC Destination не существует. Нужно создать ADO.NET Destination и присоединиться через ODBC — что и сделано

И то правда. где же он msdn.microsoft.com/...-us/library/hh758691.aspx
www.crushthesoul.com/node/43

ЗЫ Максим. Уберите SSIS скил из вашего профайла. Хотя бы на пару лет.

Хоча вже більше трьох років не заглядав у MS SQL... Тим не менше, але точно знаю що SSIS вміє без проблем переганяти дані у txt чи csv-файл і перекидати їх по FTP у місце призначення. Ну а MySQL теж легко справляється з цими форматами. Такий варіант ви не розглядаєте?

Тобто, якщо затор виник через перенесення даних через ODBC, то передавайте дані через FTP, причому вам не прийдеться додатково щось робити на боці MySQL, окрім як через таски SSIS.

Я не адмініструю сервер MySQL і на жаль, проблематично знайти людину, яка цим займається, як це не дивно звучить.... Це можна буде провернути без них?

Так вам і не треба ніякого додаткового знання по адмініструванню MySQL. Якщо ви вже маєте доступ, необхідний для вставки даних в цільову таблицю MySQL, то вам залишається отримати доступ до розшареного каталогу на цільовій машині, і зробити таск на SSIS, щоб MySQL дивився в ту шару й брав дані... хоча мабуть вам треба ще розібратись «яким запитом можна брати дані з файлу», але це гуглиться дуже добре...

Думаю, спробую, дякую)

Як буде час, зможете приблизно описати, як це працює? Мені кинуть на панель FTP Task ? З її допомогою можна закинути туди файли і там сказати, щоб MySQL його проковтнув?

Скажу, що я колись пробував користуватись LOAD DATA INFILE(MySQL-скрипт), але на нього в мого юзера нема прав, а як було скзано вище — вагома проблема в моєму контексті(

Таск FTP перекидає лише файл на шару цільової машини. Далі вам треба створити новий таск, який через ваше ODBC просто виконує запит по вставці даних із щойно перенесеного файла у таблицю. Але, звичайно ж, права до шари (на рівні файлової системи) у вашого користувача повинні бути.

не гуру...
проте раджу дююююже уважно перевірити Data Conversion-Transformation та/і Data Types
—> якийсь час тому частенько ловив різного роду ексцепшени від проблем із невідповідними дата-типами у соурс та дестінейшн.

Дуже вже детально все перевірив і... ні
Використовуючи це ж з’єднання, вирішив створити тестові таблиці з одним полем int, аналогічна помилка(

Підписатись на коментарі