#python #sql-server #oracle #ssis #etl
#python #sql-сервер #Oracle #ssis #etl
Вопрос:
У меня есть сценарий переноса таблиц SQL Server (30-40 таблиц) в Oracle. Я не могу зависеть от служб SSIS, поскольку количество таблиц, подлежащих переносу в Oracle, будет регулярно меняться, и я не всегда могу создать или обновить DFT при любом изменении схемы. Есть ли какой-либо другой способ, при котором перемещение данных может обрабатываться динамически и работать эффективно? Нравится использовать Python или любые другие языки программирования?
Комментарии:
1. Одним из решений является подключение серверов и использование команд базы данных в SQL Server для отправки данных в Oracle.
2. @GordonLinoff Я пробовал это. Но перемещение 40 ГБ данных занимает много времени, и у нас есть ограничение по времени, поскольку этот процесс должен выполняться ежедневно.
3. Вы изучали репликацию? learn.microsoft.com/en-us/sql/relational-databases/replication /…
4. Хорошо @Srikarmogaliraju итак, теперь, когда мы знаем, что создаем постоянный механизм перемещения данных, создать такой ETL, который прозрачно реагировал бы на изменения в обоих источниках данных, — это огромная задача, и SSIS, к сожалению, не та вещь, которая работала бы без серьезных усилий. Попробуйте убедить тех, кто мечтал об этом, не делать этого с помощью SSIS, но, возможно, Alooma, или, в худшем случае, использовать BIML для динамической генерации пакета в коде (программно) перед каждым его запуском.
5. Спасибо за предложения @Arthur . Я знал о BIML. Рассмотрим Alooma.
Ответ №1:
Подход C # — библиотека SchemaMapper
Поскольку вы открыты для решения, использующего язык программирования, я думаю, вам может пригодиться библиотека классов SchemaMapper, проект с открытым исходным кодом, опубликованный на GitHub. Полное описание можно найти в файле Readme по ссылке выше.
Важное примечание: Вчера я добавил поддержку чтения данных из баз данных (SQL Server, Oracle …) и возможность экспорта данных в Oracle.
В этом ответе я предоставлю информацию об импорте таблиц SQL Server, создам соответствующий класс SchemaMapper для каждой из них (поскольку они имеют разную схему, и вам нужно импортировать их в разные схемы), и как экспортировать данные в Oracle.
//First of all list the tables names need to import
string[] TableNameFilter = new[] { "Table1", "Table2" };
//Create an instance of the oracle import class
SchemaMapper.Exporters.OracleExport expOracle = new SchemaMapper.Exporters.OracleExport(oracleconnectionstring);
//Create an SQL Server import class
using (SchemaMapper.Converters.SqlServerCeImport ssImport = new SchemaMapper.Converters.SqlServerCeImport(sqlconnectionstring))
{
//Retrieve tables names
ssImport.getSchemaTable();
//loop over tables matching the filter
foreach(DataRow drRowSchema in ssImport.SchemaTable.AsEnumerable().Where(x =>
TableNameFilter.Contains(x["TABLE_NAME"].ToString())).ToList())
{
string SQLTableName = drRowSchema["TABLE_NAME"].ToString();
string SQLTableSchema = drRowSchema["TABLE_SCHEMA"].ToString();
DataTable dtSQL = ssImport.GetDataTable(SQLTableSchema, SQLTableName);
//Create a schema mapping class
using (SchemaMapper.SchemaMapping.SchemaMapper sm = new SchemaMapper.SchemaMapping.SchemaMapper(SQLTableSchema, SQLTableName))
{
foreach (DataColumn dc in dtSQL.Columns)
{
SchemaMapper_Column smCol = new SchemaMapper_Column();
smCol.Name = dc.ColumnName;
smCol.Name = dc.ColumnName;
smCol.DataType = smCol.GetCorrespondingDataType(dc.DataType.ToString(), dc.MaxLength);
sm.Columns.Add(smCol);
}
//create destination table in oracle
expOracle.CreateDestinationTable(sm);
//Insert data
expOracle.InsertUsingOracleBulk(sm, dtSQL);
//there are other methods such as :
//expOracle.InsertIntoDb(sm, dtSQL);
//expOracle.InsertIntoDbWithParameters(sm, dtSQL);
}
}
}
Примечание: это проект с открытым исходным кодом: он не полностью протестирован и поддерживаются не все типы данных, если вы столкнулись с некоторыми ошибками, не стесняйтесь оставить отзыв или добавить проблему в GitHub
Другой подход — Мастер импорта и экспорта SQL Server
Если вы можете сделать это без планирования задания, то вы можете использовать мастер импорта и экспорта, который позволяет импортировать несколько таблиц в Oracle без необходимости сборки пакетов вручную. Он создаст пакеты, целевые таблицы, столбцы карты и импортирует данные.
Комментарии:
1. Приятно!, но устанавливать соединение на экспортере лучше так же, как вы делали на импортере
2. @amd я согласен с этим. Я отредактирую это как можно скорее
3. @миссия amd завершена
4. @Hadi Поскольку SQL server и Oracle находятся на двух разных серверах и передача данных занимает больше времени, чем ожидалось при использовании подхода C #, я решил использовать другой подход. Шаг 1: Сбросьте таблицы Sql в плоские файлы. Шаг 2: Перенесите файлы на сервер назначения. Шаг 3: Загрузите данные из файлов в Oracle с помощью Sql Loader. Для одной таблицы объемом 8 ГБ выполнение вышеуказанных 3 шагов занимает 11 минут.
5. @Srikarmogaliraju вы должны написать это как ответ и принять его.
Ответ №2:
Вот подход, который я решил использовать, учитывая временные ограничения (использование C # занимает больше времени).Для таблицы объемом 8 ГБ требуется 11 минут, чтобы переместить данные SQL в Oracle.
Шаги:
- Сбросьте данные таблиц SQL в плоские файлы.(Используется BIML для автоматизации создания DFT)
- Перенесите эти плоские файлы на сервер назначения.
- Использование SQL * Loader для загрузки данных из плоских файлов в Oracle.