Перенос данных нескольких таблиц с SQL Server на Oracle

#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.

Шаги:

  1. Сбросьте данные таблиц SQL в плоские файлы.(Используется BIML для автоматизации создания DFT)
  2. Перенесите эти плоские файлы на сервер назначения.
  3. Использование SQL * Loader для загрузки данных из плоских файлов в Oracle.