SQL Server 2017 数据库降级到 SQL Server 2014(目标在虚拟机中)
SQL Server 2017 database downgrade to SQL Server 2014 (the target is in a Virtual Machine)
我一直在尝试通过多种方式将一个非常大的数据库迁移到较早的 SQL 服务器,我开始做一个 .bak
文件,但我发现它不兼容它应该是相同的 SQL 服务器版本。
然后我选择了任务 - 生成脚本,创建一个包含所有模式和数据的 .sql
文件,但文件有 24gb 大!尽管使用 sqlcmd
文件真的很大,但我还是设法执行了它。但它从未成功执行完毕,它抛出了多种类型的错误,例如:
Msg 156, Level 15, State 1:
Incorrect syntax near the keyword '...'
Msg 105, Level 15, State 1
Unclosed quotation mark after the character string
然后我发现这个评论有2个解决方案,我试了第一个但仍然抛出第二个错误,我试了第二个并且成功了!现在一切都运行顺利,但后来我又遇到了另一个错误...
此错误:
Sqlcmd: Error: Internal error at ReadText (Reason: An attempt was made
to move the file pointer before the beginning of the file).
所以现在这个问题与 sqlcmd
命令有关??
我应该继续尝试使用生成的脚本迁移数据库吗?有没有更好的方法让它与早期的 SQL 服务器版本兼容?
需要澄清的事情
我首先创建了一个仅包含模式信息的脚本,但是当我尝试为数据生成一个单独的脚本时,SSMS 却抛出了一个错误。所以用这种方式我不能或者我不知道如何用简单的方法导出所有数据。我知道您可以为每个表导出数据,但是数据库有 200 多个表,这不可行。
此外,该脚本需要一个多小时,如果该过程能够正确完成,可能会比那个时间长很多。
最后,在尝试使用 bacpac 文件后,由于 windows 用户、外部对象引用等一系列错误,我也无法创建它...
解决此问题的最佳方法是创建一个 .dacpac 文件。从SSMS 2012到最新版本的dacpac文件,你现在可以包含你所有表的数据了。
并且要解决不兼容问题,您可以使用 AllowIncompatiblePlatform 属性 允许在发布到目标服务器时部署到不同版本的 SQL 服务器。
所以首先您需要使用 SqlPackage.exe 从 sql 服务器的 bin 文件夹中提取,在我的例子中是文件夹:C:\Program Files (x86)\Microsoft SQL Server0\DAC\bin
然后 运行 具有提取操作的命令:
SqlPackage /Action:Extract /SourceDatabaseName:"<database-name>" /SourceServerName:"<server-name>" /SourceUser:"sa" /SourcePassword:"<password>" /TargetFile:"<dacpac-file-path>" /p:ExtractAllTableData=True
然后在另一台服务器 运行 SqlPackage.exe 程序的正确 bin 文件夹中执行此命令:
SqlPackage /Action:Publish /SourceFile:" <dacpac file path>\filename.dacpac" /TargetDatabaseName:"<database name>" /TargetServerName:"<ServerName>" /TargetUser:"<username>" /TargetPassword:"<password>(if needed)" /p:AllowIncompatiblePlatform=true /p:CreateNewDatabase=true
如果您想从 scrath 创建数据库。
/p:CreateNewDatabase=true
我希望这可以帮助任何人解决这个问题,使用大型数据库,并从更大的 sql 服务器版本导入。
我一直在尝试通过多种方式将一个非常大的数据库迁移到较早的 SQL 服务器,我开始做一个 .bak
文件,但我发现它不兼容它应该是相同的 SQL 服务器版本。
然后我选择了任务 - 生成脚本,创建一个包含所有模式和数据的 .sql
文件,但文件有 24gb 大!尽管使用 sqlcmd
文件真的很大,但我还是设法执行了它。但它从未成功执行完毕,它抛出了多种类型的错误,例如:
Msg 156, Level 15, State 1:
Incorrect syntax near the keyword '...'Msg 105, Level 15, State 1
Unclosed quotation mark after the character string
然后我发现这个评论有2个解决方案,我试了第一个但仍然抛出第二个错误,我试了第二个并且成功了!现在一切都运行顺利,但后来我又遇到了另一个错误...
此错误:
Sqlcmd: Error: Internal error at ReadText (Reason: An attempt was made to move the file pointer before the beginning of the file).
所以现在这个问题与 sqlcmd
命令有关??
我应该继续尝试使用生成的脚本迁移数据库吗?有没有更好的方法让它与早期的 SQL 服务器版本兼容?
需要澄清的事情
我首先创建了一个仅包含模式信息的脚本,但是当我尝试为数据生成一个单独的脚本时,SSMS 却抛出了一个错误。所以用这种方式我不能或者我不知道如何用简单的方法导出所有数据。我知道您可以为每个表导出数据,但是数据库有 200 多个表,这不可行。
此外,该脚本需要一个多小时,如果该过程能够正确完成,可能会比那个时间长很多。
最后,在尝试使用 bacpac 文件后,由于 windows 用户、外部对象引用等一系列错误,我也无法创建它...
解决此问题的最佳方法是创建一个 .dacpac 文件。从SSMS 2012到最新版本的dacpac文件,你现在可以包含你所有表的数据了。
并且要解决不兼容问题,您可以使用 AllowIncompatiblePlatform 属性 允许在发布到目标服务器时部署到不同版本的 SQL 服务器。
所以首先您需要使用 SqlPackage.exe 从 sql 服务器的 bin 文件夹中提取,在我的例子中是文件夹:C:\Program Files (x86)\Microsoft SQL Server0\DAC\bin
然后 运行 具有提取操作的命令:
SqlPackage /Action:Extract /SourceDatabaseName:"<database-name>" /SourceServerName:"<server-name>" /SourceUser:"sa" /SourcePassword:"<password>" /TargetFile:"<dacpac-file-path>" /p:ExtractAllTableData=True
然后在另一台服务器 运行 SqlPackage.exe 程序的正确 bin 文件夹中执行此命令:
SqlPackage /Action:Publish /SourceFile:" <dacpac file path>\filename.dacpac" /TargetDatabaseName:"<database name>" /TargetServerName:"<ServerName>" /TargetUser:"<username>" /TargetPassword:"<password>(if needed)" /p:AllowIncompatiblePlatform=true /p:CreateNewDatabase=true
如果您想从 scrath 创建数据库。
/p:CreateNewDatabase=true
我希望这可以帮助任何人解决这个问题,使用大型数据库,并从更大的 sql 服务器版本导入。