执行 SSMA 控制台 (Db2ToSQL)

Microsoft提供了一组可靠的脚本文件命令来执行和控制SQL Server 迁移助手 (SSMA) 活动。 随后的各节详细介绍相同的内容。 控制台应用程序使用本部分中枚举的某些标准脚本文件命令。

项目脚本文件命令

Project 命令可用于创建项目,打开、保存和退出项目。

create-new-project 命令

创建新的 SSMA 项目。

Script

  • project-folder。 指示项目创建的文件夹。

  • project-name。 指示项目的名称。 {string}

  • overwrite-if-exists。 可选属性。 指示是否应覆盖现有项目。 {boolean}

project-type 命令

可选属性。 指示项目类型,即,、sql-server-2016sql-server-2017sql-server-2019sql-server-2022sql-server-2025sql-azure。 默认值为 sql-server-2016

语法示例

<create-new-project
   project-folder="<project-folder>"
   project-name="<project-name>"
   overwrite-if-exists="<true/false>"   (optional)
   project-type="<sql-server-2016 | sql-server-2017 | sql-server-2019 | sql-server-2022 | sql-azure>"   (optional)
/>

默认情况下,属性为 overwrite-if-exists>false

默认情况下,属性为 project-type>sql-server-2016

open-project 命令

打开现有项目。

Script

  • project-folder 指示创建项目的文件夹。 如果指定的文件夹不存在,此命令将失败。 {string}

  • project-name 指示项目名。 如果指定的项目不存在,此命令将失败。 {string}

语法示例

<open-project
   project-folder="<project-folder>"
   project-name="<project-name>"
/>

SSMA for Db2 控制台应用程序支持向后兼容性。 可以打开由旧版本的 SSMA 创建的项目。

save-project 命令

保存迁移项目。

语法示例

<save-project/>

close-project 命令

关闭迁移项目。

语法示例

<close-project
   if-modified="<save/error/ignore>"   (optional)
/>

数据库连接脚本文件命令

“数据库连接”命令可以帮助连接到数据库。

控制台不支持 UI 的浏览功能。

有关详细信息,请参阅 “创建脚本文件”。

connect-source-database 命令

连接到源数据库,并加载源数据库的简要元数据,而不是加载所有元数据。

如果无法与源建立连接,将会生成错误,并且控制台应用程序将停止进一步执行。

Script

从服务器连接文件或脚本文件的服务器部分中为每个连接定义的名称属性中检索服务器定义。

语法示例

<connect-source-database  server="<server-unique-name>"/>

force-load-source-database/force-load-target-database

加载源元数据。

非常适合离线处理迁移项目。

如果无法建立与源/目标的连接,则会生成错误,控制台应用程序停止执行

Script

需要将一个或多个元数据库节点用作命令行参数。

语法示例

<force-load object-name="<object-name>"
  metabase="<source/target>"/>

或者:

<force-load>
   <metabase-object object-name="<object-name>"/>
</force-load>

reconnect-source-database

重新连接到源数据库,但与 connect-source-database 命令不同,此命令并不加载任何元数据。

如果无法(重新)与源建立连接,将会生成错误,并且控制台应用程序将停止进一步执行。

语法示例

<reconnect-source-database  server="<server-unique-name>"/>

connect-target-database

连接到目标 SQL Server 数据库,并加载目标数据库的简要元数据,而不是加载所有元数据。

如果无法与目标建立连接,将会生成错误,并且控制台应用程序将停止进一步执行。

Script

从为每个连接定义的名称属性中检索服务器定义,该名称属性位于服务器连接文件的服务器部分或脚本文件中。

语法示例

<connect-target-database  server="<server-unique-name>"/>

reconnect-target-database

重新连接到目标数据库,但与 connect-target-database 命令不同,此命令并不加载任何元数据。

如果无法(重新)与目标建立连接,将会生成错误,并且控制台应用程序将停止进一步执行。

语法示例

<reconnect-target-database  server="<server-unique-name>"/>

报告脚本文件命令

“报表”命令生成有关各种 SSMA 控制台活动性能的报告。

generate-assessment-report

为源数据库生成评估报告。

如果在执行此命令之前未连接到源数据库,将会生成错误,控制台应用程序将退出。

如果在命令执行期间未能连接到源数据库服务器,也会导致控制台应用程序终止。

Script

  • conversion-report-folder:指定可以存储评估报告的文件夹。 (可选属性)

  • object-name:指定用于生成评估报表的对象(它可以具有单个对象名称或组对象名称)。

  • object-type:指定对象名称属性中指定的对象的类型(如果指定对象类别,则对象类型为 category)。

  • conversion-report-overwrite:指定是否覆盖评估报告文件夹(如果已存在)。

    默认值:false。 (可选属性)

  • write-summary-report-to:指定生成摘要报告的路径。

    如果只提及文件夹路径,将使用名称 AssessmentReport<n>.XML 创建文件。 (可选属性)

    报告创建操作还有两个子类别:

    • report-errors true或者false,默认值为 false (可选属性)
    • verbose true或者false,默认值为 false (可选属性)

语法示例

<generate-assessment-report
   object-name="<object-name>"
   object-type="<object-category>"
   write-summary-report-to="<file>"   (optional)
   verbose="<true/false>"   (optional)
   report-errors="<true/false>"   (optional)
   assessment-report-folder="<folder-name>"   (optional)
   conversion-report-overwrite="<true/false>"   (optional)
/>

或者:

<generate-assessment-report
   conversion-report-folder="<folder-name>"   (optional)
   conversion-report-overwrite="<true/false>"   (optional)
>
      <metabase-object object-name="<object-name>"
         object-type="<object-category>"/>
</generate-assessment-report>

迁移脚本文件命令

“迁移”命令用来将目标数据库架构转换为源架构,并将数据迁移到目标服务器。 迁移命令的默认控制台输出设置是“完整”输出报告,不包含详细的错误报告:只包含源对象树根节点的摘要。

convert-schema

执行从源架构到目标架构的架构转换。

如果在执行此命令之前未执行源或目标数据库连接,或者在执行命令期间与源或目标数据库服务器的连接失败,则会生成错误,控制台应用程序退出。

Script

  • conversion-report-folder:指定可以存储评估报告的文件夹。 (可选属性)

  • object-name:指定用于转换架构的源对象(它可以具有单个对象名称或组对象名称)。

  • object-type:指定对象名称属性中指定的对象的类型(如果指定对象类别,则对象类型为 category)。

  • conversion-report-overwrite:指定是否覆盖评估报告文件夹(如果已存在)。

    默认值:false。 (可选属性)

  • write-summary-report-to:指定生成摘要报告的路径。

    如果只提到文件夹路径,则会按名称 SchemaConversionReport<n>.XML 创建文件。 (可选属性)

    报告创建操作还有两个子类别:

    • report-errors true或者false,默认值为 false (可选属性)

    • verbose true或者false,默认值为 false (可选属性)

语法示例

<convert-schema
   object-name="<object-name>"
   object-type="<object-category>"
   write-summary-report-to="<file-name/folder-name>"   (optional)
   verbose="<true/false>"   (optional)
   report-errors="<true/false>"   (optional)
   conversion-report-folder="<folder-name>"   (optional)
   conversion-report-overwrite="<true/false>"   (optional)
/>

或者:

<convert-schema
   conversion-report-folder="<folder-name>"   (optional)
   conversion-report-overwrite="<true/false>"   (optional)
      <metabase-object object-name="<object-name>"
         object-type="<object-category>"/>
</convert-schema>

migrate-data 命令

将源数据迁移到目标。

Script

  • conversion-report-folder:指定可以存储评估报告的文件夹。 (可选属性)

  • object-name:指定考虑迁移数据的源对象(它可以具有单个对象名称或组对象名称)。

  • object-type:指定对象名称属性中指定的对象的类型(如果指定对象类别,则对象类型为 category)。

  • conversion-report-overwrite:指定是否覆盖评估报告文件夹(如果已存在)。

    默认值:false。 (可选属性)

  • write-summary-report-to:指定生成摘要报告的路径。

    如果只提及文件夹路径,则按名称 DataMigrationReport<n>.xml 创建文件。 (可选属性)

    报告创建操作还有两个子类别:

    • report-errors true或者false,默认值为 false (可选属性)
    • verbose true或者false,默认值为 false (可选属性)

语法示例

<migrate-data
   write-summary-report-to="<file-name/folder-name>"
   report-errors="<true/false>"
   verbose="<true/false>">
      <metabase-object object-name="<object-name>"/>
      <metabase-object object-name="<object-name>"/>
      <metabase-object object-name="<object-name>"/>
      <data-migration-connection
         source-use-last-used="true"/source-server="<server-unique-name>"
         target-use-last-used="true"/target-server="<server-unique-name>"/>
</migrate-data>

或者:

<migrate-data
   object-name="<object-name>"
   object-type="<object-category>"
   write-summary-report-to="<file-name/folder-name>"
   report-errors="<true/false>"
   verbose="<true/false>"/>

迁移准备脚本文件命令

迁移准备命令可启动源数据库和目标数据库之间的架构映射。

map-schema 命令

源数据库的架构映射到目标架构。

source-schema 命令

指定要迁移的源架构。

sql-server-schema 命令

指定要在其中迁移的目标架构。

语法示例

<map-schema
   source-schema="<source-schema>"
   sql-server-schema="<target-schema>"/>

map-schema 命令

将源数据库的模式映射到目标模式。

Script

source-schema 指定要迁移的源架构。

sql-server-schema 指定要迁移到其中的目标架构。

语法示例

<map-schema
   source-schema="<source-schema>"
   sql-server-schema="<target-schema>"/>

可管理性脚本文件命令

可管理性命令可帮助用户将目标数据库对象与源数据库同步。

迁移命令的默认控制台输出设置是“完整”输出报告,不包含详细的错误报告:只包含源对象树根节点的摘要。

synchronize-target 命令

将目标对象与目标数据库同步。

如果对源数据库执行此命令,会遇到错误。

如果在执行此命令之前未执行目标数据库连接,或者与目标数据库服务器的连接在执行命令期间失败,则会生成错误,控制台应用程序将退出。

Script

  • object-name:指定考虑与目标数据库同步的目标对象(它可以具有单个对象名称或组对象名称)。

  • object-type:指定对象名称属性中指定的对象的类型(如果指定对象类别,则对象类型为 category)。

  • on-error:指定是将同步错误指定为警告还是错误。 可用于 on-error 的选项:

    • report-total-as-warning
    • report-each-as-warning
    • fail-script
  • report-errors-to:指定同步作的错误报告的位置(可选属性)

    如果只指定文件夹路径,则按名称 TargetSynchronizationReport.xml 创建文件。

语法示例

<synchronize-target
   object-name="<object-name>"
   on-error="<report-total-as-warning/
               report-each-as-warning/
               fail-script>"   (optional)
   report-errors-to="<file-name/folder-name>"   (optional)
/>

或者:

<synchronize-target
   object-name="<object-name>"
   object-type="<object-category>"/>

或者:

<synchronize-target>
   <metabase-object object-name="<object-name>"/>
   <metabase-object object-name="<object-name>"/>
   <metabase-object object-name="<object-name>"/>
</synchronize-target>

refresh-from-database 命令

从数据库刷新源对象。

如果对目标数据库执行此命令,则会生成错误。

Script

需要将一个或多个元数据库节点用作命令行参数。

  • object-name:指定用于从源数据库刷新的源对象(它可以具有单个对象名称或组对象名称)。

  • object-type:指定对象名称属性中指定的对象的类型(如果指定对象类别,则对象类型为 category)。

  • on-error:指定是将刷新错误指定为警告还是错误。 可用于 on-error 的选项:

    • report-total-as-warning
    • report-each-as-warning
    • fail-script
  • report-errors-to:指定同步作的错误报告的位置(可选属性)

    如果只指定文件夹路径,则创建一个按名称 SourceDBRefreshReport.xml 创建的文件。

语法示例

<refresh-from-database
   object-name="<object-name>"
   on-error="<report-total-as-warning/
               report-each-as-warning/
               fail-script>"   (optional)
   report-errors-to="<file-name/folder-name>"   (optional)
/>

或者:

<refresh-from-database
   object-name="<object-name>"
   object-type="<object-category>"/>

或者:

<refresh-from-database>
   <metabase-object object-name="<object-name>"/>
</refresh-from-database>

脚本生成脚本文件命令

脚本生成命令执行双重任务:将控制台输出保存在脚本文件中;并根据指定的参数将 T-SQL 输出记录到控制台或文件。

save-as-script 命令

用于将对象的脚本保存到 metabase=target 提到的文件中。 这是同步命令的替代方法,在该命令中,我们获取脚本并在目标数据库上执行相同的脚本。

Script

需要将一个或多个元数据库节点用作命令行参数。

  • object-name:指定要保存其脚本的对象。 (它也可以具有单独的对象名或组对象名)

  • object-type:指定对象名称属性中指定的对象的类型(如果指定对象类别,则对象类型为 category)。

  • metabase:指定它是源元数据库还是目标元数据库。

  • destination:指定脚本必须保存的路径或文件夹。如果未给定文件名,则使用格式为 (object_name 属性值).out 的文件名。

  • overwrite:如果 true 存在相同的文件名,则覆盖它。 它可以具有值 (true/false)。

语法示例

<save-as-script
   metabase="<source/target>"
   object-name="<object-name>"
   object-type="<object-category>"
   destination="<file/folder>"
   overwrite="<true/false>"   (optional)
/>

或者:

<save-as-script
   metabase="<source/target>"
   destination="<file/folder>"
      <metabase-object object-name="<object-name>"
         object-type="<object-category>"/>
</save-as-script>

convert-sql-statement 命令

  • context 指定架构名称。

  • destination 指定输出是否应存储在文件中。

    如果未指定此属性,则会在控制台上显示转换后的 T-SQL 语句。 (可选属性)

  • conversion-report-folder 指定可以存储评估报告的文件夹。 (可选属性)

  • conversion-report-overwrite 指定是否覆盖评估报告文件夹(如果已存在)。

    默认值:false。 (可选属性)

  • write-converted-sql-to 指定要存储转换的 T-SQL 的文件(或)文件夹路径。 指定随附 sql-files 属性的文件夹路径时,每个源文件都将在指定文件夹下创建相应的目标 T-SQL 文件。 指定文件夹路径和 sql 属性时,转换后的 T-SQL 将写入指定文件夹下命名 Result.out 的文件。

  • sql 指定要转换的 Db2 SQL 语句,可以使用“;”分隔一个或多个语句

  • sql-files 指定必须转换为 T-SQL 代码的 SQL 文件的路径。

  • write-summary-report-to 指定生成报表的路径。 如果只提及文件夹路径,则按名称 ConvertSQLReport.xml 创建文件。 (可选属性)

    报告创建操作还有两个子类别:

    • report-errorstruefalse,默认值为 false (可选属性)
    • verbosetruefalse,默认值为 false (可选属性)

Script

需要将一个或多个元数据库节点用作命令行参数。

语法示例

<convert-sql-statement
   context="<schema-name>"
   conversion-report-folder="<folder-name>"
   conversion-report-overwrite="<true/false>"
   write-summary-report-to="<file-name/folder-name>"   (optional)
   verbose="<true/false>"   (optional)
   report-errors="<true/false>"   (optional)
   destination="<stdout/file>"   (optional)
   file-name="<file-name>"
   sql="SELECT 1 FROM DUAL;">
   <output-window suppress-messages="<true/false>" />
</convert-sql-statement>

或者:

<convert-sql-statement
   context="<schema-name>"
   conversion-report-folder="<folder-name>"
   conversion-report-overwrite="<true/false>"
   write-summary-report-to="<file-name/folder-name>" (optional)
   verbose="<true/false>" (optional)
   report-errors="<true/false>"
   destination="<stdout/file>"   (optional)
   write-converted-sql-to="<file-name/folder-name>"
   sql-files="<folder-name>\*.sql" />

或者:

<convert-sql-statement
   context="<schema-name>"
   conversion-report-folder="<folder-name>"
   conversion-report-overwrite="<true/false>"
   sql-files="<folder-name>\*.sql" />

并行运行 SSMA 控制台

可以通过脚本并行执行 SSMA 控制台实用工具,方法是将数据库名称和相应的文件夹路径指定为输入参数。 在以下示例中,数据库SAMPLE1SAMPLE2及其SAMPLE3各自的文件夹路径作为脚本的输入提供。

SAMPLE1,C:\folder path\SSMA Project1
SAMPLE2,C:\folder path\SSMA Project2
SAMPLE3,C:\folder path\SSMA Project3

以下示例 PowerShell 脚本支持并行执行 SSMA 控制台。

$baseFolder = "C:\folder path\folder1"
$ssmaExe = "C:\folder path\SSMAforDb2Console.exe"
$databaselistPath = Join-Path $baseFolder "Databaselist.txt"
$conversionXmlTemplate = Join-Path $baseFolder "ConversionAndDataMigrationSample.xml"
$variableXmlTemplate = Join-Path $baseFolder "VariableValueFileSample.xml"

# Read all entries
$entries = Get-Content $databaselistPath | Where-Object { $_.Trim() -ne "" }

# Prepare the entries
$preparedEntries = foreach ($entry in $entries) {
    $parts = $entry -split ","
    $dbName = $parts[0].Trim()
    $workingFolder = $parts[1].Trim()
    if ($dbNameCounts.ContainsKey($dbName)) {
        $dbNameCounts[$dbName]++
        $suffix = "_{0:D2}" -f $dbNameCounts[$dbName]
        $fileDbName = "$dbName$suffix"
    }
    else {
        $dbNameCounts[$dbName] = 0
        $fileDbName = $dbName
    }
    [PSCustomObject]@{
        DbName        = $dbName
        WorkingFolder = $workingFolder
        FileDbName    = $fileDbName
    }
}

# Run in parallel
$preparedEntries | ForEach-Object -Parallel {
    $dbName = $_.DbName
    $workingFolder = $_.WorkingFolder
    $fileDbName = $_.FileDbName

    # Update ConversionAndDataMigrationSample.xml
    $convTree = [xml](Get-Content $using:conversionXmlTemplate)
    $convTree.SelectNodes("//initial-catalog") | ForEach-Object { $_.SetAttribute("value", $dbName) }
    $conversionXmlPath = Join-Path $using:baseFolder "ConversionAndDataMigrationSample_$fileDbName.xml"
    $convTree.Save($conversionXmlPath)

    # Update VariableValueFileSample.xml
    $varTree = [xml](Get-Content $using:variableXmlTemplate)
    $nodes = $varTree.SelectNodes('//variable[@name="$WorkingFolder$"]')
    if ($nodes.Count -eq 0) {
        Write-Host "No variable node found for `$WorkingFolder$"
    }
    else {
        $nodes | ForEach-Object { $_.value = $workingFolder }
    }
    $nodes2 = $varTree.SelectNodes('//variable[@name="$Db2InitialCatalog$"]')
    if ($nodes2.Count -eq 0) {
        Write-Host "No variable node found for `$Db2InitialCatalog$"
    }
    else {
        $nodes2 | ForEach-Object { $_.value = $dbName }
    }
    $variableXmlPath = Join-Path $using:baseFolder "VariableValueFileSample_$fileDbName.xml"
    $varTree.Save($variableXmlPath)

    # Prepare output/error file paths
    $outputFile = Join-Path $using:baseFolder "ssma_output_$fileDbName.txt"
    $errorFile = Join-Path $using:baseFolder "ssma_error_$fileDbName.txt"

    # Prepare argument list
    $arguments = "-s `"$conversionXmlPath`" -v `"$variableXmlPath`""

    # Run SSMA console
    Start-Process -FilePath $using:ssmaExe -ArgumentList $arguments -RedirectStandardOutput $outputFile -RedirectStandardError $errorFile -Wait
    Write-Host "Executed command: `"$using:ssmaExe`" $arguments"
}