Если кто-нибудь сталкивался с необходимостью работать с БД MySQL из MS SQL Server Integration Services, наверняка у него были вопросы, ответов на которые не было ни в Интернет, ни у тренеров по SQL Server.

Как не блокировать таблицы при извлечении данных?

Допустим, Вы извлекаете данные из таблиц системы, которая постоянно меняет их в MySQL. Даже если Вас устроило бы "грязное чтение", Вы не сможете понизить уровень изоляции транзакций, во всяком случае, у меня не получилось — ни .NET провайдер, ни ODBC не воспринимают параметр Transation Isolation на уровне контейнеров SSIS, указание SET TRANSACTION ISOLATION LEVEL в запросе в ADO NET Source тоже не помогло.

Используйте модификатор SQL_BUFFER_RESULT в выражении SELECT, это означает, что MySQL буферизует данные и снимет блокировки, а не будет держать их всё время, пока SSIS получает данные.

Какого выбрать провайдера — ODBC или .NET?

Поскольку официального OLE DB провайдера для MySQL нет, остаётся выбрать из двух. Если Вы собираетесь писать в БД MySQL или использовать параметры при выборке — используйте ODBC, иначе .NET.

.NET провайдер MySQL не понимает параметризованные запросы (в SSIS по крайней мере). Вы сможете использовать его в лучшем случае на чтение. Кроме того, Вы не можете подключить произвольную библиотеку C# внутри SSIS (это разумно), поэтому не сможете использовать Script компонент для работы с .NET провайдером.

Есть OLE DB провайдер за деньги тут - http://cherrycitysoftware.com/ccs/providers/ProvMySQL.aspx. Но там кривая инсталляция. Кроме того, Вы платите не за копию ПО, а за активацию, и на другую машину Вы пакет не перенесете. Я этим не пользуюсь.

Все остальные советы касаются ODBC.

Используйте для разработки пользовательский ODBC DSN

В Business Intelligence Development Studio из Connection Manager Вы не увидите (почему-то) системные DSN. Создайте пользовательский с таким же именем и выберите его.

Рекомендации по настройке ODBC DSN

В настройках ODBC DSN указывайте (в Initial Statement) выражение SET SESSION sql_mode="ANSI_QUOTES"; Вы могли бы выполнить этот запрос из SSIS, но, это противоречит рекомендации по настройке Connection Manager (см. ниже). К тому же, ODBC может незаметно восстановить порвавшееся соединение где-нибудь в середине выполнения вашего пакета.

Если БД (таблица) MySQL хранит данные в кодировке cp1251, нужно подключаться так же в cp1251. Это указывается в настройках DSN. В этом случае, SSIS будет правильно интерпретировать размеры колонок и не будет предупреждений "Truncation may occur..". SSIS увидит колонки как Unicode string [DT_WSTR], но преобразование в cp1251 произойдет на уровне драйвера MySQL.

Рекомендации по настройке Connection Manager

В SSIS в настройках менеджера подключения, если используете ODBC, установите RetainSameConnection = False, особенно если Вы синхронизируете много данных, иначе распараллеливание выполнения приводит к отключению соединения со стороны БД MySQL (или драйвера - точно не понял).

На сервере установите 64-х и 32-х разрядный драйвер ODBC

Пакеты SSIS могут запускаться на SQL Server в 32-х разрядном окружении. Во всяком случае, 64 вам понадобится, чтоб настроить системный DSN (т.е. по-любому, без этого "Администратор источников данных ODBC" не увидит драйвер), а 32 будет работать с тем же DSN, в соответствующем Runtime.

Есть ли альтернатива?

Хочу сказать, что СУБД MySQL самая неудобная с точки зрения использования SSIS. C Oracle, и MS SQL нам даны несколько способов. С PostgreSQL можно работать через OLE DB провайдера, который можно купить за деньги (тут - http://www.pgoledb.com/) - проверено, работает отлично!

Дополнение от 28.09.2013

Больше не мучайтесь! Используйте Devart dotConnect for MySQL. Это .NET провайдер.

Да, проблема с передачей параметров в запросы к MySQL была и есть при всех способах подключения — для этого приходится писать C#, но Devart самый лучший. Серьезно. Достаточно бесплатной Express редакции.

Почитайте ещё про Devart в FAQ по коннекторам SSIS для Oracle.