【问题标题】:How to transfer data from a newer to an older MS SQL server using cmd?如何使用 cmd 将数据从较新的 MS SQL 服务器传输到较旧的 MS SQL 服务器?
【发布时间】:2014-08-03 18:12:54
【问题描述】:

我有一个数据库服务器(我们称之为 S),其中有一些数据在运行 MS SQL 2012。在世界的另一端,有运行 MS SQL 2012 EXPRESS 的平板电脑(我们称它们为 TS)。部分数据必须从 S 传输到 TS。由于许多原因,唯一的通信方式是将文件从 S 发送到代理服务器,以便稍后由 TS 接收。

目前我正在使用备份文件 (.BAK),因此我可以简单地创建 S 数据库的部分备份并在 TS 上恢复它。

现在问题来了:

S 可能会在一段时间内切换到 MS SQL 2014。无法在 TS 上安装 2014,因为我无法直接访问它们。在这种情况下,S 仍然能够在 TS 上恢复使用 SQL 2012 创建的数据,但不能反过来,因为无法从较旧的 SQL 版本上恢复备份。所以这就是我需要帮助的地方。

我尝试使用 S 上的服务器管理工​​具导出数据,而不是在 TS 上创建备份和导入所有内容。这很好用,但必须根据命令行自动进行导出。旧的 sqlpubwiz 不是一个选项,因为它已停产,只能在 2008 R2 版本之前使用。

所以我需要了解如何使用 cmd/powershell 从 S 导出并在 TS 上导入仅使用文件进行通信,即使它们运行不同版本的 MS SQL Server。

【问题讨论】:

    标签: sql-server database import cmd export


    【解决方案1】:

    我以前使用过分离的数据库将数据库分发到笔记本电脑。导入它们比备份要快得多,但我不确定版本间兼容性。

    您可以编写一个工具,将其打包为一个包含 CSV 文件的 exe 和一个使用 Bcp.exe 的加载器脚本

    【讨论】:

    • 谢谢你。被贬值的数据库也受到版本冲突的影响:(你的第二点可能有效,但是导出数百个表和所有数据很麻烦。另外我不知道一年后数据库会是什么样子,那里可能是新表。如果没有更好的方法,这是我将采取的解决方案。
    【解决方案2】:

    问题解决了! Powershell 可以解决问题,但速度太慢了。最后,我仍然使用 BCP。 BCP 意味着要编写大量脚本,但工作速度比使用 powershell 快 30 倍。但是,这是我使用的 powershell 脚本:

    set-psdebug -strict
    $DirectoryToSaveTo='...' #path where to save the data
    $ServerName='...' #Hostname\Instance
    $Database='...' #database to export
    $ErrorActionPreference = "stop"
    Trap {
        $err = $_.Exception
        write-host $err.Message
        while( $err.InnerException ) {
            $err = $err.InnerException
            write-host $err.Message
        };
        break
    }
    $v = [System.Reflection.Assembly]::LoadWithPartialName( 'Microsoft.SqlServer.SMO')
    if ((($v.FullName.Split(','))[1].Split('='))[1].Split('.')[0] -ne '9') {
        [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMOExtended') | out-null
    }
    $My='Microsoft.SqlServer.Management.Smo'
    $s = new-object ("$My.Server") $ServerName
    $Server=$s.netname -replace '[\\\/\:\.]',' '
    $instance = $s.instanceName -replace '[\\\/\:\.]',' '
    $DatabaseName =$database -replace '[\\\/\:\.]',' '
    $DirectoryToSaveTo=$DirectoryToSaveTo+'\'+$Instance+'\'
    $CreationScriptOptions = new-object ("$My.ScriptingOptions")
    $CreationScriptOptions.ExtendedProperties= $true
    $CreationScriptOptions.DRIAll= $true
    $CreationScriptOptions.Indexes= $true
    $CreationScriptOptions.Triggers= $true
    $CreationScriptOptions.ScriptBatchTerminator = $true
    $CreationScriptOptions.Filename = "$($DatabaseName)_Schema.sql";
    $CreationScriptOptions.IncludeHeaders = $true;
    $CreationScriptOptions.ToFileOnly = $true # no need of string output as well
    $CreationScriptOptions.IncludeIfNotExists = $true # not necessary but it means the script can be more versatile
    $transfer = new-object ("$My.Transfer") $s.Databases[$Database]
    $transfer.options=$CreationScriptOptions # tell the transfer object of our preferences
    $scripter = new-object ("$My.Scripter") $s # script out the database creation
    $scripter.options=$CreationScriptOptions # with the same options
    $scripter.Script($s.Databases[$Database]) # do it
    "USE $Database" | Out-File -Append -FilePath "$($DatabaseName)_Schema.sql"
    "GO" | Out-File -Append -FilePath "$($DatabaseName)_Schema.sql"
    $transfer.options.AppendToFile=$true
    $transfer.options.ScriptDrops=$true
    $transfer.EnumScriptTransfer()
    $transfer.options.ScriptDrops=$false
    $transfer.EnumScriptTransfer()
    "All written to $($DatabaseName)_Schema.sql"
    

    此脚本仅导出架构,但如何导出所有数据应该很明显。

    【讨论】:

      【解决方案3】:

      我会考虑使用内置的复制功能,将 S 设置为快照复制发布者,并将 TS 设置为通过 FTP 的订阅者。 SQL Server Express 可以在复制方案中充当订阅者(但不是发布者)。

      http://msdn.microsoft.com/en-us/library/ms151832.aspx

      如果你想写一个更复杂的场景,你可以考虑Sync Framework

      【讨论】:

      • Publisher/subscriber 的意思是 S 和 TS 必须直接通信吧?这是不可能的:(
      • @MichaelS 快照可以通过 FTP 传送。见technet.microsoft.com/en-us/library/ms146956(v=sql.105).aspx
      • 代理服务器上未运行/不允许 FTP。此外,还会有版本冲突。 :(
      • @MichaelS 那么你是如何传输文件的呢?快照复制可以跨数据库版本工作。
      • 我们正在使用我们自己在 S 中的服务和我们的代理传输文件。通信已加密。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多