如何将SQL Server LocalDB升级到新版本?

53

能否将 SqlServer 的 localDB 从2012升级到2014?

我们目前使用的是 SQL Server 2012 版本中的11号版本。我需要将其升级到 SQL Server 2014 版本中的12号版本。

我希望在升级后不丢失我的表格和数据。

我安装了一个新的 localDB ,但是我没有我的数据了。它还有另一个名称,由于这是一个团队项目,因此无法真正更改配置文件。

我尝试使用命令行 sqlLocalDB 工具创建一个名为v11.0的2014年版本,但它仍然在旧的2012版本中创建了它。

C:\Program Files\Microsoft SQL Server\120\Tools\Binn>sqllocaldb create v11.0
LocalDB instance "v11.0" created with version 11.0.3000.0.

C:\Program Files\Microsoft SQL Server\120\Tools\Binn>sqllocaldb create v12.0
LocalDB instance "v12.0" created with version 12.0.2000.8.

C:\Program Files\Microsoft SQL Server\120\Tools\Binn>sqllocaldb create aaaaa
LocalDB instance "aaaaa" created with version 12.0.2000.8.

将其命名为v11.0,为什么会改变使用的版本?

我该如何升级现有的v11.0?


你正在告诉它使用 v11.0 创建一个 11.0 版本的数据库。从命令行键入 sqllocaldb /? 并阅读有关 create 的说明。 - Ken White
2
不行。v11.0是本地数据库名称。我可以在版本11中创建一个名为v12.0的数据库,但我无法在版本12中创建v11.0o。C:\ Program Files \ Microsoft SQL Server \ 120 \ Tools \ Binn> sqllocaldb create v12.0 11.0 使用版本11.0.3000.0创建了LocalDB实例“v12.0”。C:\ Program Files \ Microsoft SQL Server \ 120 \ Tools \ Binn> sqllocaldb create v11.0 12.0 由于以下错误,无法创建LocalDB实例“v11.0”: LocalDB Instance API方法的参数不正确。请参阅API文档。 - Don Chambers
不是的。v11.0 是你要创建的版本,如果你按照我让你做的去做,就会发现这一点。阅读文档,在这种情况下,只需要从命令提示符中执行我说的操作即可。 - Ken White
1
当然,与其争论我是否正确,你可以尝试两件简单的事情:1)阅读文档,其中指出create参数后面加上一个数字表示所需版本,2)再试一次,将数字更改为其他值(如'v999.99'),看看会发生什么。 - Ken White
1
我已经阅读了文档。第一个参数是实例名称,然后是可选的版本号。在这种情况下,v11.0是实例名称。我创建了v999.99,它创建了一个名为该版本的实例12。 - Don Chambers
C:\Program Files\Microsoft SQL Server\120\Tools\Binn>sqllocaldb create v999.99 已创建本地数据库实例“v999.99”,版本为12.0.2000.8。 - Don Chambers
6个回答

73

更新:

Visual Studio 2022附带Microsoft SQL Server 2019 15.0.4153.1 LocalDB。如果您已安装Visual Studio 2022,但之前使用过早期版本的Visual Studio,则可以跳转到下面的命令sqllocaldb versions进行升级。

https://developercommunity.visualstudio.com/t/visual-studio-2022-installs-old-version-of-sql-ser/1466986

Translated:

自从Visual Studio 2019仍然使用Microsoft SQL Server 2016 (13.1.4001.0) LocalDB,我就做了以下操作。

我需要这样做是因为我尝试添加级联删除的Temporal表格失败了。

https://learn.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-ver15

执行DbCommand失败(31ms)[参数=[], CommandType ='Text',CommandTimeout ='30'] ALTER TABLE Text SET (SYSTEM_VERSIONING = ON(HISTORY_TABLE = History.Text));
由于表'Project.Repository.dbo.Text'具有级联DELETE或UPDATE的外键,因此设置SYSTEM_VERSIONING为ON失败。
据了解,这个错误只影响SQL Server 2016,而不是2017及更高版本。
当前表上不允许使用ON DELETE CASCADE和ON UPDATE CASCADE。换句话说,当时间表引用外键关系中的表(对应于sys.foreign_keys中的parent_object_id)时,不允许使用CASCADE选项。要解决此限制,请使用应用程序逻辑或在主键表(对应于sys.foreign_keys中的referenced_object_id)中使用after触发器来维护删除的一致性。如果主键表是时间表,而引用表是非时间表,则没有此限制。
此限制仅适用于SQL Server 2016。从CTP 2.0开始,SQL Database和SQL Server 2017支持CASCADE选项。

https://dev59.com/cloU5IYBdhLWcg3wLEwM#54591579

https://learn.microsoft.com/en-us/sql/relational-databases/tables/temporal-table-considerations-and-limitations?view=sql-server-2017

enter image description here

您可以在 Powershell 中运行命令 sqllocaldb info 来获取有关当前本地数据库的信息。

这是一份相当不错的升级指南,但我选择以稍微不同的方式进行一些操作。

https://medium.com/cloudnimble/upgrade-visual-studio-2019s-localdb-to-sql-2019-da9da71c8ed6

下载{{SQL Server Express 2019 LocalDB}}或更新版本并运行exe文件。

https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/sql-server-express-localdb?view=sql-server-ver15

选择下载媒体:

enter image description here

本地数据库:

enter image description here

从下载的exe安装:

enter image description here

我的建议是在此之后重新启动您的计算机,但我不确定是否需要。无论如何,我已经这样做了。
对于我来说,检查sqllocaldb版本引发了异常Windows API调用“RegGetValueW”返回错误代码:0。

enter image description here

使用这个答案解决了问题:

https://dev59.com/01MI5IYBdhLWcg3wN4vi#58275480

以下是非工作示例中 注册表编辑器(regedit)的外观:

enter image description here

更改文件夹名称后,一切正常:

enter image description here

enter image description here

在此之后,备份当前localdb的数据库。由于我们稍后将附加当前localdb的所有数据库到新版本中,因此可能不需要此操作,但如果您有敏感数据,则建议这样做。

我从Visual Studio获得了标准名称MSSQLLocalDB,因此我的示例将使用此名称。如前所述,您可以使用sqllocaldb info命令查看当前版本。

从powershell运行这三个命令:

sqllocaldb stop mssqllocaldb
sqllocaldb delete mssqllocaldb
sqllocaldb create MSSQLLocalDB

如果一切正常,最后一个命令应该生成类似于使用版本15.0.2000.5创建了LocalDB实例“mssqllocaldb”。的内容。

enter image description here

然后通过SSMS (localdb)\mssqllocaldb或类似的程序登录到您的新LocalDB,然后附加您的旧数据库。通常存储在%UserProfile%文件夹中。

enter image description here

LocalDB已更新,希望您的所有数据库正常工作。


15
我非常感谢您的分享!这是我一直在寻找的最好且最有用的答案之一。 - SandroRiz
4
我希望我能添加10个赞!非常感谢! - Laurent
2
我本来是来找铜的,结果却发现了金子。谢谢,非常详细并且运行良好。 - G.Dimov
1
你救了我的一天!我对SQL服务器很新,但是你的回答让我能够理解(这可不是一件小事!)。 - cytek04

17

如此MSDN上的链接所述(标题不太恰当...),转换应该在双击 .mdf 文件时触发...但在我的情况下没有发生这种情况(可能是因为需要拥有 Sql Server Management Studio 或类似软件才能实现)。

因此,以下是替代步骤:

  • 在 Visual Studio 中打开"服务器资源管理器"

  • 单击左上角的"连接到数据库"图标

  • 在列表中选择"Microsoft SQL Server"并按"下一步"

  • 将此写为服务器名称:(LocalDB)\MSSQLLocalDB

  • 在下面的选项中选择"附加数据库文件"并浏览到您的 .mdf 文件

  • 继续操作,这应该显示一个对话框,询问您是否要触发转换

就这样了,不是非常直观,但很有效。我没有找到任何关于它的文档,除了之前提到的链接外,所有其他步骤都是纯直觉,但对我有效,希望对您也有效。


在Visual Studio 2015中,我按照您描述的步骤进行了操作。在升级我的mdf文件后,最后一步是删除新连接,并在web.config中将“(LocalDb)\v11.0”替换为“(LocalDB)\MSSQLLocalDB”,然后我就可以使用现有的连接字符串了。 - firepol

9

要针对特定版本的LocalDb,请将12.0或11.0用作参数。例如:

sqllocaldb create "mydb" 12.0

你的命令失败的原因是因为你引用了错误的版本。这在-?信息中并不十分清晰。

使用“v12.0”作为第一个参数仅设置实例名称。如果没有给出第二个版本参数,则使用默认版本。


1
我理解这个问题。但是,我似乎无法创建一个版本为12的名为v11.0的实例。它可以使用其他所有名称。 - Don Chambers
你尝试过先停止并删除V11.0版本吗? - Diogo Gomes
1
它似乎在确定版本时也注意实例名称,如果名称遵循默认格式。我无法将“mssqllocaldb”创建为除最新安装版本以外的任何内容。 - shannon

4
一个简单的升级 SQL Server LocalDb 实例的方法是删除 %LocalAppData%\Microsoft\Microsoft SQL Server Local DB\Instances\ 目录中实例数据目录。下次使用该实例时,它将重新创建并使用最新安装的版本。

别忘了在此之后重新附加你的数据库。 - DeveTho

2

看起来v11.0是LocalDB 2012自动实例的特殊名称。而且它严格绑定在此版本上。 而2014和2016版本则共享相同的MSSQLLocalDB名称。

关于LocalDB实例的更多信息


名字不重要 - Andrii

1
我还要补充@Ogglas的答案,如果你想在软件中自动迁移它,可以按照以下步骤进行。 升级时执行以下步骤(升级步骤或升级代码):
  1. 读取您的数据库当前物理路径: use {dbName}; SELECT physical_name FROM sys.database_files WHERE name = '{dbName}'
  2. 检查您的数据库的当前SQL版本-通过SQLLocalApi实用程序类或通过在单独进程中运行sqllocaldb i your_db或类似方法运行。
DECLARE @dbversion nvarchar(128)

SET @dbversion = CAST(serverproperty('ProductVersion') AS nvarchar)
SET @dbversion = SUBSTRING(@dbversion, 1, CHARINDEX('.', @dbversion) - 1)

SELECT @dbversion -- this will give you the major version (eg. 12 or whatever is your old version)
...

作为原始答案建议的一部分运行(或使用您自定义的数据库名称)
sqllocaldb stop mssqllocaldb
sqllocaldb delete mssqllocaldb
sqllocaldb create MSSQLLocalDB
  1. 如果步骤2中的@dbversion是旧版本(例如 SQL LocalDB 2014 的版本为12),请使用步骤1记录的物理路径重新附加数据库。
CREATE DATABASE [{dbName}]
    ON PRIMARY (NAME={dbName}, FILENAME = '{dbPath}')
    for attach;
  1. 可选:升级数据库的兼容性级别(因为重新附加MDF文件会保留旧的兼容性级别)。
EXEC('ALTER DATABASE {db_name} SET COMPATIBILITY_LEVEL = 150'); -- or whatever version you are upgrading to

1
非常有用的情况是当你没有GUI工具,如VS或SSMS。 - Vertigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接