如何将 SQL Server localDB 升级到较新版本?
Posted
技术标签:
【中文标题】如何将 SQL Server localDB 升级到较新版本?【英文标题】:How do I upgrade SQL Server localDB to a newer version? 【发布时间】:2015-01-09 21:44:43 【问题描述】: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
的说明。
没有。 v11.0 是 localDB 名称。我可以在版本 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 instance "v11.0" 由于以下错误而创建失败:LocalDB Instance API 方法的参数不正确.请查阅 API 文档。
没有。 v11.0
是您告诉它创建的版本,因为您会看到您是否按照我的要求执行。 阅读文档,在这种情况下,这就像我在命令提示符下所说的那样简单。
当然,与其争论我是否正确,您可以尝试两个简单的事情:1) 阅读文档,它在@987654326 后面写了一个数字@ 参数表示所需的版本,并且 2) 再试一次,将数字更改为 'v999.99' 之类的其他值,看看会发生什么。
我已阅读文档。第一个参数是实例名称,然后是可选的版本号。在这种情况下,v11.0 是实例名称。我创建了 v999.99,它创建了一个名为 12 的实例。
【参考方案1】:
更新:
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
原文:
这是我所做的,因为 Visual Studio 2019 仍然附带 Microsoft SQL Server 2016 (13.1.4001.0) LocalDB
。
我需要这样做,因为我尝试使用失败的级联删除添加 Temporal tables
。
https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-ver15
执行 DbCommand 失败 (31ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] ALTER TABLE 文本集(SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.Text));
将 SYSTEM_VERSIONING 设置为 ON 失败,因为表 'Project.Repository.dbo.Text' 有一个带有级联删除的外键 或更新。
阅读后发现此错误仅影响 SQL Server 2016,而不影响 2017 及更高版本。
ON DELETE CASCADE 和 ON UPDATE CASCADE 不允许在 当前表。换句话说,当临时表正在引用时 表中的外键关系(对应 parent_object_id in sys.foreign_keys) 不允许使用 CASCADE 选项。 要解决此限制,请使用应用程序逻辑或之后 触发器以保持主键表中删除的一致性 (对应于 sys.foreign_keys 中的 referenced_object_id)。如果 主键表是临时的,引用表是非临时的, 没有这样的限制。
此限制仅适用于 SQL Server 2016。级联选项是 从 CTP 2.0 开始在 SQL 数据库和 SQL Server 2017 中受支持。
https://***.com/a/54591579/3850405
https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-table-considerations-and-limitations?view=sql-server-2017
您可以通过在 Powershell 中运行命令 sqllocaldb info
来获取有关当前 localDB 的信息。
这是一个很好的升级指南,但我选择做一些不同的事情。
https://medium.com/cloudnimble/upgrade-visual-studio-2019s-localdb-to-sql-2019-da9da71c8ed6
下载SQL Server Express 2019 LocalDB
或更新版本并运行exe。
https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/sql-server-express-localdb?view=sql-server-ver15
选择下载媒体:
本地数据库:
从下载的exe安装:
我的建议是在此之后重新启动您的计算机,但我不确定是否需要这样做。反正我做到了。
检查sqllocaldb versions
导致我出现异常Windows API call "RegGetValueW" returned error code: 0.
。
用这个答案解决了:
https://***.com/a/58275480/3850405
这是Registry Editor
(regedit) 在非工作示例中的样子:
更改文件夹名称后一切正常:
在此之后备份您当前 localdb 中的数据库。这可能不需要,因为我们稍后会将您当前 localdb 中的所有数据库附加到新版本,但如果您有敏感数据,建议这样做。
我有来自 Visual Studio 的标准名称 MSSQLLocalDB
,所以我的示例将使用它。如前所述,您可以使用sqllocaldb info
命令查看您当前的版本。
从 powershell 运行这三个命令:
sqllocaldb stop mssqllocaldb
sqllocaldb delete mssqllocaldb
sqllocaldb create MSSQLLocalDB
如果一切正常,最后一个命令应该生成类似LocalDB instance "mssqllocaldb" created with version 15.0.2000.5.
然后通过 SSMS (localdb)\mssqllocaldb
或类似程序登录到您的新 LocalDB 并附加您的旧数据库。通常存放在%UserProfile%
文件夹中。
LocalDB 现已更新,希望您的所有数据库都能正常工作。
【讨论】:
我正在寻找的最伟大和最有用的答案之一...感谢分享!! 我希望我能加 10 个赞!非常感谢! 我来找铜的时候发现了金子。谢谢,描述性很强,效果很好。【参考方案2】:正如 MSDN (Not too well chosen title...) 的此链接中所述,只需双击 .mdf 文件即可触发转换...在我的情况下没有发生这种情况(可能是因为必须拥有 Sql Server Management Studio 软件或类似的软件,这是事实)。
所以,这里有一个替代程序:
在 Visual Studio 中打开“服务器资源管理器”
点击左上角的“连接数据库”图标
在列表中选择“Microsoft SQL Server”并按下一步
将此作为服务器名称写入:(LocalDB)\MSSQLLocalDB
在下面的选项中选择“附加数据库文件”,然后浏览到您的 .mdf 文件
继续,这应该会显示一个对话框,询问您是否触发转换
就是这样。一点也不直观,但很有效。除了前面提到的链接之外,我没有找到任何关于它的文档,所有其他步骤都是纯粹的直觉,但对我有用,我也希望对你有用。
【讨论】:
在 Visual Studio 2015 中,我完全按照您的描述进行了操作。在升级我的 mdf 文件后,作为最后一步,我删除了新连接并在 web.config "(LocalDb)\v11.0" 中替换为 "(LocalDB)\MSSQLLocalDB",然后我可以使用我现有的连接字符串。 【参考方案3】:要针对特定版本的 LocalDb,请使用 12.0 或 11.0 作为参数。例如:
sqllocaldb create "mydb" 12.0
您的命令失败的原因是您错误地引用了版本。这在 -?信息。
使用“v12.0”作为第一个参数只是设置实例名称。如果没有给出第二个版本参数,则使用默认版本。
【讨论】:
我明白这一点。但是,我似乎无法使用版本 12 创建一个名为 v11.0 的实例。它适用于所有其他名称。 您是否尝试过先停止并删除v11.0版本? 如果名称遵循默认格式,在确定版本时似乎也要注意实例名称。除了最新安装的版本之外,我无法创建“mssqllocaldb”。【参考方案4】:升级 SQL Server LocalDb 实例的一种简单方法是从 %LocalAppData%\Microsoft\Microsoft SQL Server Local DB\Instances\
目录中删除实例数据目录。下次使用该实例时,它将使用最新安装的版本重新创建。
【讨论】:
在此之后不要忘记重新附加您的数据库。【参考方案5】:v11.0
似乎是 LocalDB 2012 automatic 实例的特殊名称。它与此版本严格绑定。而 2014 和 2016 版本为此使用相同的 MSSQLLocalDB
名称。
More about LocalDB instances
【讨论】:
名字无所谓【参考方案6】:我还要补充 @Ogglas
的回答,如果你想在你的软件中自动迁移它,你可以按照这个步骤。
升级时执行以下步骤(升级步骤或升级代码):
-
读取数据库的当前物理路径:
use dbName; SELECT physical_name FROM sys.database_files WHERE name = 'dbName'
检查数据库的当前 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
-
如果第 2 步中的 @dbversion 是旧版本(例如,对于 SQL LocalDB 2014 为 12),则使用第 1 步中记录的物理路径重新附加数据库。
CREATE DATABASE [dbName]
ON PRIMARY (NAME=dbName, FILENAME = 'dbPath')
for attach;
-
可选:升级数据库的兼容性级别(因为重新附加 MDF 将保留旧的兼容性级别)。
EXEC('ALTER DATABASE db_name SET COMPATIBILITY_LEVEL = 150'); -- or whatever version you are upgrading to
【讨论】:
对于没有 VS 或 SSMS 等 GUI 工具的情况非常有用。以上是关于如何将 SQL Server localDB 升级到较新版本?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 SQL Server LocalDB 数据库移动到新计算机
将 SQL Server 身份验证与 localdb 一起使用
如何使数据库转到 SQL Server 而不是 localDB?