如何将 SQL Server .bak 文件导入 MySQL?

Posted

技术标签:

【中文标题】如何将 SQL Server .bak 文件导入 MySQL?【英文标题】:How to import a SQL Server .bak file into MySQL? 【发布时间】:2010-09-14 10:50:31 【问题描述】:

标题是不言自明的。有没有办法直接进行这种导入?

【问题讨论】:

还有covered on dba.stackexchange 史诗般的问题兄弟!我终于设法从我糟糕的托管服务提供商那里导入了 bak 文件,那里所有的 SQL 工具都被破坏了。 【参考方案1】:

来自 SQL 服务器的 .BAK 文件采用 Microsoft 磁带格式 (MTF) 参考:http://www.fpns.net/willy/msbackup.htm

bak 文件可能包含 SQL Server 用于存储数据库的 LDF 和 MDF 文件。

您将需要使用 SQL 服务器来提取这些。 SQL Server Express 是免费的,可以完成这项工作。

所以,安装 SQL Server Express 版本,然后打开 SQL Server Powershell。在那里执行sqlcmd -S <COMPUTERNAME>\SQLExpress(以管理员身份登录)

然后发出以下命令。

restore filelistonly from disk='c:\temp\mydbName-2009-09-29-v10.bak';
GO

这将列出备份的内容——你需要的是第一个告诉你逻辑名称的字段——一个是实际的数据库,另一个是日志文件。

RESTORE DATABASE mydbName FROM disk='c:\temp\mydbName-2009-09-29-v10.bak'
WITH 
   MOVE 'mydbName' TO 'c:\temp\mydbName_data.mdf', 
   MOVE 'mydbName_log' TO 'c:\temp\mydbName_data.ldf';
GO

此时您已提取数据库 - 然后将Microsoft's "Sql Web Data Administrator". 与this export tool 一起安装,您将拥有一个包含数据库的 SQL 脚本。

【讨论】:

问题是SQL Server 2008 Express Edition 只能处理10GB 或更小的数据库文件。我有一个 30GB 的文件需要处理。工作时的 Internet 连接速度太慢,无法下载完整的 SQL Server 2008 R2 版本的 4GB .iso 映像,这是我作为学生从 dreampark.com 免费获得的。所以我有这个完全相同的问题。 第一次安装软件链接失效 您确定文件格式是 MTF 吗?当我尝试使用command-line mtf-tool 列出.bak 文件的内容时,出现错误... @MikhailT.当我在将近 10 年前写下这个答案时,我相当确定 MTF 正在被使用;这可能已经改变了。【参考方案2】:

mysql 有一个应用程序可以从 microsoft sql 导入 db。 步骤:

    打开 MySql 工作台 点击“数据库迁移”(如果没有出现,则必须从 MySql 更新中安装) 使用简单的向导遵循迁移任务列表。

【讨论】:

MySql Workbench 很烂。它无法处理足够好的字符编码 @Sean,如果您发现 MySQL Workbench 有问题,请提交错误报告。迁移是一件复杂的事情,因此实现需要几轮才能稳定。【参考方案3】:

我没有设法直接找到方法。

我将 bak 文件导入 SQL Server 2008 Express,然后使用MySQL Migration Toolkit。

工作就像一个魅力!

【讨论】:

是的,导入对我来说效果很好。右键单击“数据库”节点单击导入-首先选择 BAK 文件,然后选择数据库-它会自动从加载的 .bak 文件中获取数据库名称并将其放入列表中。(创建新数据库)选择并单击导入.. 哇哦 - 6 天后! MySQL 迁移工具包已达到 EOL。见dev.mysql.com/downloads/gui-tools/5.0.html “数据库迁移”功能现在是MySQL Workbench的一部分【参考方案4】:

在这个问题中,答案没有及时更新。所以很高兴地说,在 2020 年MsSQL 迁移到 MySQL 非常容易。像RebaseData 这样的在线转换器将一键完成您的工作。您只需上传来自MsSQL.bak 文件,然后将其转换为.sql 可读的MySQL 格式。

附加说明:This 不仅可以转换您的.bak 文件,而且该站点适用于您想要的所有类型的数据库迁移。

【讨论】:

请注意,我们为 RebaseData 付费以访问高级功能(因为免费只允许您处理非常小的文件)并且我们无法让 RebaseData 使用我们近 35GB 的 .bak 文件否不管我们尝试了什么:CLI 工具、通过 API 上传等等。它几乎到处都耗尽了内存(即使我们的服务器有 32GB 内存并且我们已经竭尽所能) 另外值得注意的是,如果您无法转换您的文件,即使我通过电子邮件向支持人员发送了对我们尝试的所有内容的非常详细的解释,并希望他们会成为能够通过 API 查看他们上传的文件,我们在 2 周内仍未收到他们的回复。【参考方案5】:

虽然我的 MySQL 背景有限,但我认为你在这方面运气不佳。但是,您应该能够通过将 db 恢复到 MSSQL 服务器,然后创建 SSIS 或 DTS 包将表和数据发送到 MySQL 服务器来迁移所有数据。

希望对你有帮助

【讨论】:

【参考方案6】:

我非常怀疑。正如 Levi 所说,您可能希望使用 DTS/SSIS 来执行此操作。有人认为您可能想要做的是在不实际导入数据的情况下启动该过程。只需将基本表结构放在一起就足够了。然后,您将要围绕生成的表结构进行更改,因为可能创建的任何结构充其量都是不稳定的。

您可能还需要更进一步,创建一个暂存区域,首先以字符串 (varchar) 形式接收所有数据。然后您可以创建一个执行验证和转换的脚本,以将其放入“真实”数据库中,因为这两个数据库并不总是能很好地协同工作,尤其是在处理日期时。

【讨论】:

【参考方案7】:

我使用的方法包含了 Richard Harrison 的部分方法:

所以,安装 SQL Server 2008 Express 版,

这需要下载 Web 平台安装程序“wpilauncher_n.exe” 一旦你安装了这个,点击数据库选择(你还需要下载框架和运行时)

安装后转到 Windows 命令提示符并:

使用 sqlcmd -S \SQLExpress(同时 以管理员身份登录)

然后发出以下命令。

仅从以下位置恢复文件列表 磁盘='c:\temp\mydbName-2009-09-29-v10.bak'; GO 这将列出 备份 - 你需要的是第一个 告诉您逻辑名称的字段 - 一个是实际的数据库,另一个是日志文件。

恢复数据库 mydbName FROM 磁盘='c:\temp\mydbName-2009-09-29-v10.bak' WITH MOVE 'mydbName' TO 'c:\temp\mydbName_data.mdf', 移动 'mydbName_log' 到 'c:\temp\mydbName_data.ldf';去吧

我启动了 Web 平台安装程序,并从新增功能选项卡中安装了 SQL Server Management Studio 并浏览了数据库以确保数据存在...

当时我尝试了 MSSQL“SQL 导入和导出向导”附带的工具,但 csv 转储的结果只包括列名...

因此,我只是从 SQL Server Management Studio 导出了诸如“从用户中选择 *”之类的查询结果

【讨论】:

【参考方案8】:

SQL Server 数据库是 Microsoft 专有的。我能想到的两个选项是:

    以 CSV、XML 或类似格式转储数据库,然后加载到 MySQL。

    设置与 MySQL 的 ODBC 连接,然后使用 DTS 传输数据。正如查尔斯格雷厄姆所建议的那样,您可能需要在执行此操作之前构建表。但这就像从 SQL 企业管理器窗口剪切和粘贴到相应的 MySQL 窗口一样简单。

【讨论】:

【参考方案9】:

对于那些尝试上述 Richard 解决方案的人,以下是一些可能有助于解决常见错误的附加信息:

1) 运行 restore filelistonly 时,您可能会收到操作系统错误 5(拒绝访问)。如果是这种情况,请打开 SQL Server 配置管理器并将 SQLEXPRESS 的登录名更改为具有本地写入权限的用户。

2) @"这将列出备份的内容 - 您需要的是第一个告诉您逻辑名称的字段" - 如果您的文件列出了两个以上的标题,您还需要说明如何处理RESTORE DATABASE 命令中的那些文件。如果您没有指明如何处理数据库和日志之外的文件,系统显然会尝试使用 .bak 文件中列出的属性。从其他人的环境中恢复文件将产生“路径具有无效属性。它必须是一个目录'(因为您的机器上不存在相关路径)。 只需提供 MOVE 语句即可解决此问题。

在我的例子中,有第三个 FTData 类型的文件。我添加的 MOVE 命令:

MOVE 'mydbName_log' TO 'c:\temp\mydbName_data.ldf',
MOVE 'sysft_...' TO 'c:\temp\other';

在我的情况下,我实际上必须为第三个文件创建一个新目录。最初,我尝试将其发送到与 .mdf 文件相同的文件夹,但是当我执行还原时,第三个 FTData 文件产生了“无法正确初始化”错误。

【讨论】:

【参考方案10】:

来自 SQL Server 的 .bak 文件特定于该数据库方言,并且与 MySQL 不兼容。

尝试使用etlalchemy 将您的 SQL Server 数据库迁移到 MySQL。它是我创建的一个开源工具,用于促进不同 RDBMS 之间的轻松迁移。

the github page 上提供了快速安装和示例,更详细的项目起源说明可以找到here。

【讨论】:

etlalchemy 未维护

以上是关于如何将 SQL Server .bak 文件导入 MySQL?的主要内容,如果未能解决你的问题,请参考以下文章

如何将SQL Server备份文件导入现存数据库

如何调用远程 T-SQL 过程将远程 .bak 数据库文件恢复到远程 SQL Server 实例?

怎么把sql server 2008 备份文件bak还原?

SQL Server--SQL Server数据库bak文件还原

sqlserver2000怎么打开DB文件

sql server 2008还原bak文件时提示磁盘空间不足