将多个表数据从SQL Server迁移到Oracle

时间:2019-03-11 15:08:26

标签: python sql-server oracle ssis etl

我有一个将SQL Server表(30-40个表)迁移到Oracle的方案。我不能依赖SSIS,因为要迁移到Oracle的表的数目会定期更改,并且架构发生变化时,我也不能始终创建或更新DFT。 还有其他方法可以动态处理数据移动并使其有效工作吗?像使用Python或其他任何编程语言一样?

2 个答案:

答案 0 :(得分:2)

C#方法-SchemaMapper库

由于您愿意使用编程语言来解决方案,因此我认为您可以从SchemaMapper class library中受益,Start the SQL Server Import and Export Wizard是在GitHub上发布的一个开源项目。在上面的链接的自述文件中可以找到完整的说明。

重要说明:昨天,我添加了从数据库(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 :(得分:1)

这是我决定考虑时间限制的方法(使用C#会花费更多时间)。对于8 GB的表,将数据SQL移至Oracle需要11分钟。

步骤:

  1. 将SQL表数据转储到平面文件中。(使用BIML进行自动化 DFT创建)
  2. 将这些平面文件传输到目标服务器。
  3. 使用SQL * Loader将平面文件中的数据加载到Oracle。