我有一个来自 MySQL 转储的
.sql
文件,其中包含表、定义和要插入这些表中的数据。如何将转储文件中表示的数据库转换为 SQL Server 数据库?
除了 MySQL 之外,它还支持 Oracle、Sybase 和 MS Access。
它看起来非常智能,甚至能够处理不平凡的传输。它还具有一些命令行界面(除了 GUI 之外),因此理论上它可以集成到某些批量加载过程中。
这是 MySQL 版本的当前下载链接 https://www.microsoft.com/en-us/download/details.aspx?id=54257
当前(2016 年 6 月)稳定版本 6.0.1 在传输数据时与当前(5.3.6)MySQL ODBC 驱动程序崩溃。一切都是 64 位。 带有 5.1.13 ODBC 驱动程序的 5.3 版本工作正常。
我建议你像这样使用mysqldump:
mysqldump --compatible=mssql
phpMyAdmin 仍然是一个网络应用程序,对于 大型数据库可能存在一些限制(脚本执行时间、可分配内存等)。
我在网上找到了一个方法
这需要一点工作,因为它必须逐桌完成。但无论如何,我可以将表、数据和约束复制到 SQL Server 数据库中。
这是链接
http://www.codeproject.com/KB/database/migrate-mysql-to-mssql.aspx
这是我将
.sql
文件导入 SQL Server 的方法:
使用
--compatible=mssql
和 --extended-insert=FALSE
选项从 MySQL 导出表:
mysqldump -u [username] -p --compatible=mssql --extended-insert=FALSE db_name table_name > table_backup.sql
使用 PowerShell 将导出的文件拆分为每个文件 300000 行:
$i=0; Get-Content exported.sql -ReadCount 300000 | %{$i++; $_ | Out-File out_$i.sql}
在 SQL Server Management Studio 中运行每个文件
有一些技巧如何加快插入速度。
–where
选项。通过使用此选项,您可以根据 where
SQL 子句支持的任何条件拆分表。
如果您使用PhpMyAdmin进行导出,您可以将sql兼容模式切换为“MSSQL”。这样,您只需针对 MS SQL 数据库运行导出的脚本即可完成。
如果您不能或不想使用 PhpMyAdmin,mysqldump 中还有一个兼容性选项,但我个人宁愿让 PhpMyAdmin 为我做这件事。
我今天遇到了一个非常相似的问题 - 我需要将一个大表(500 万行)从 MySql 复制到 MS SQL。
以下是我完成的步骤(在 Ubuntu Linux 下):
在 MS SQL 中创建了一个表,其结构与 MySql 中的源表匹配。
已安装 MS SQL 命令行:https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#ubuntu
将表从 MySql 转储到文件:
mysqldump \ - 袖珍的 \ --完整插入\ --无创建信息 \ --兼容=mssql \ --扩展插入=假\ --主机“$MYSQL_HOST”\ --用户“$MYSQL_USER”\ -p“$MYSQL_PASS”\ “$MYSQL_DB”\ “$表”>“$文件名”
就我而言,转储文件非常大,所以我决定将其分成许多小块(每块 1000 行) -
split --lines=1000 "$FILENAME" part-
最后我迭代了这些小文件,做了一些文本替换,并针对 MS SQL 服务器逐一执行了这些片段:
导出 SQLCMD=/opt/mssql-tools/bin/sqlcmd x=0 对于文件部分-* 做 echo“正在将文件 [$file] 导出到 MS SQL。已处理 $x 千个” # 将 \' 替换为 '' sed -i "s/\\'/''/g" "$file" # 删除所有“ sed -i 's/"//g' "$file" # 允许插入指定 PK(id) 的记录 sed -i "1s/^/SET IDENTITY_INSERT $TABLE ON; /” “$文件” “$SQLCMD”-S“$AZURE_SERVER”-d“$AZURE_DB”-U“$AZURE_USER”-P“$AZURE_PASS”-i“$file” 回声“” 回声“” x=$((x+1)) 完毕 回声“完成”
当然,您需要替换我的变量,例如
$AZURE_SERVER
、$TABLE
等。和你的。
希望有帮助。
对我来说,使用此命令导出所有数据效果最好:
mysqldump -u USERNAME -p --all-databases --complete-insert --extended-insert=FALSE --compatible=mssql > backup.sql
--extended-insert=FALSE 需要避免 mssql 1000 行导入限制。
我使用迁移工具创建了表,因此我不确定从 backup.sql 文件创建是否有效。
在 SQL Server 的 SSMS 中,我必须使用 IDENTITY_INSERT ON 逐表导入数据才能写入 ID 字段:
SET IDENTITY_INSERT dbo.app_warehouse ON;
GO
INSERT INTO "app_warehouse" ("id", "Name", "Standort", "Laenge", "Breite", "Notiz") VALUES (1,'01','Bremen',250,120,'');
SET IDENTITY_INSERT dbo.app_warehouse OFF;
GO
如果您有关系,则必须先导入子项,然后导入带有外键的表。
您还可以使用“ODBC”+“SQL Server 导入和导出向导”。 下面的链接描述了它: https://www.mssqltips.com/sqlservertutorial/2205/mysql-to-sql-server-data-migration/
运行:
mysqldump -u root -p your_target_DB --compatible=mssql > MSSQL_Compatible_Data.sql
您想查看进程栏吗?
pv mysqldump -u root -p your_target_DB --compatible=mssql > MSSQL_Compatible_Data.sql