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

75

标题已经很清楚地说明了问题。是否有一种直接进行此类导入的方法?


3
也被列入dba.stackexchange的讨论范围。(链接:http://dba.stackexchange.com/q/20078/1580) - David LeBauer
太经典了,兄弟!我终于成功导入了备份文件。我的糟糕主机提供商所有的 SQL 工具都坏了。 - Piotr Kula
10个回答

74

SQL服务器的.BAK文件是采用Microsoft Tape Format (MTF)格式存储的(ref:http://www.fpns.net/willy/msbackup.htm)。

.bak文件中可能包含SQL服务器用于存储数据库的LDF和MDF文件。

您需要使用SQL Server来提取这些文件。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的“Sql Web数据管理员”此导出工具,您将拥有一个包含数据库的SQL脚本。


4
问题在于 SQL Server 2008 Express Edition 只能处理大小为10GB及以下的数据库文件。我必须处理一个30GB的文件。工作场所的互联网连接速度太慢,无法下载完整的SQL Server 2008 R2版本的4GB.iso镜像文件,而我作为一名学生可以从dreamspark.com免费获取该版本。因此我有与你完全相同的问题。 - Geoffrey
第一个安装软件的链接已经失效。 - Brian Leishman
你确定文件格式是MTF吗?当我尝试使用命令行mtf-tool列出.bak文件的内容时,我遇到了一个错误... - Mikhail T.
@MikhailT. 当我写下这个答案将近10年前,我相当确定MTF正在使用;但现在可能已经发生了改变。 - Richard Harrison

10

MySql有一个从Microsoft SQL导入数据库的应用程序。

步骤:
  1. 打开MySql Workbench
  2. 点击“数据库迁移”(如果它没有出现,您需要从MySql更新中安装它)
  3. 使用简单的向导按照迁移任务列表进行操作。

3
MySQL Workbench 很糟糕。它不能很好地处理字符编码。 - Xiao
11
@Sean,如果你在MySQL Workbench中遇到问题,请提交错误报告。迁移是一个复杂的问题,实现需要经过多轮来稳定下来。 - Mike Lischke

8
在这个问题中,答案没有及时更新。因此很高兴地说,在2020年将MsSQL迁移到MySQL是非常容易的。像RebaseData这样的在线转换器可以用一次点击完成您的工作。您只需上传来自MsSQL的.bak文件,将其转换为可读取MySQL的.sql格式即可。
附注:此网站不仅可以转换您的.bak文件,而且还适用于您想要的所有类型的数据库迁移。

3
请注意,我们已经支付了RebaseData的费用以获得高级功能(免费版只能处理非常小的文件),但无论我们尝试使用CLI工具、通过API上传等方式,我们都无法让RebaseData处理我们近35GB的.bak文件。它几乎在所有地方都耗尽了内存(即使我们的服务器有32GB的内存并且我们尽了最大努力)。 - Titi
3
值得注意的是,如果您无法转换文件,他们还提供“7天退款保证”。尽管我通过电子邮件向支持团队发送了非常详细的解释,说明我们尝试过的一切,并希望他们能够通过API查看上传的文件,但我们已经超过两周没有收到他们的回复。 - Titi
RebaseData有一个10 MB的限制。这一点在上传.bak文件并完成“转换”后才变得清楚。我的建议是要避免使用。 - undefined

8

我没有找到直接完成这个任务的方法。

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

非常顺利!


是的,我的导入工作正常。右键单击“数据库”节点,然后单击“导入”-首先选择BAK文件,然后选择数据库-它会自动从加载的.bak文件中获取数据库名称并将其放入列表中。(创建新数据库)选择该数据库并单击“导入”..哇哦-6天后! - Piotr Kula
MySQL Migration Toolkit已经到达了EOL(终止生命周期)。请访问http://dev.mysql.com/downloads/gui-tools/5.0.html。 - Jakob
2
“数据库迁移”功能现在已成为MySQL Workbench的一部分。 - dazweeja

3
尽管我的MySQL背景有限,但我认为你不太可能成功。不过,你可以通过将数据库恢复到MSSQL服务器上,然后创建一个SSIS或DTS包将表和数据发送到MySQL服务器来迁移所有数据。
希望这可以帮到你。

1

对于那些尝试使用Richard上面的解决方案的人,这里有一些额外的信息,可能有助于解决常见错误:

1)当运行restore filelistonly时,您可能会遇到操作系统错误5(拒绝访问)。如果是这种情况,请打开SQL Server Configuration Manager,并将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文件产生“初始化失败”的错误。

1

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

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

可以在github页面上找到快速安装和示例,以及有关项目起源的更详细说明可以在此处找到。


etlalchemy 没有得到维护。 - realsarm
上次提交已经超过5年了。除非你对解决问题和希望通过修复来分叉它感兴趣,否则我建议你保持怀疑态度。 - Joshua Pinter

1
我使用的方法包括Richard Harrison方法的一部分:

所以,安装SQL Server 2008 Express版,

这需要下载Web Platform Installer“wpilauncher_n.exe” 安装后,单击数据库选择(还需要下载框架和运行时)

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

使用sqlcmd -S \ SQLExpress(同时作为管理员登录)

然后发出以下命令。

从磁盘还原filelistonly ='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

我启动了Web平台安装程序,并从“新功能”选项卡中安装了SQL Server Management Studio,浏览了数据库以确保数据存在...
此时,我尝试使用MSSQL附带的工具“SQL导入和导出向导”,但csv转储的结果仅包括列名...
因此,我只是从SQL Server Management Studio导出了查询结果,例如“select * from users”。

1

我非常怀疑这个。你可能想使用DTS/SSIS来完成这个任务,就像Levi所说的那样。你可能想要开始这个过程,但实际上并不导入数据。只需做足够的工作来组合基本表结构。然后,您将需要更改生成的表结构,因为生成的结构可能会很不稳定。

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


1

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

  1. 将数据库转储为CSV、XML或类似格式,然后加载到MySQL中。

  2. 设置ODBC连接到MySQL,然后使用DTS传输数据。正如Charles Graham所建议的那样,在执行此操作之前,您可能需要构建表。但这只需要从SQL Enterprise Manager窗口复制并粘贴到相应的MySQL窗口即可。


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