在项目开发中,有时由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据迁移到MySQL。下面是小编日常整理的一种sqlserver数据库迁移的方法。
一、SQL Server中常用数据类型与MySQL不同的地方
二、将SQL Server数据迁移到MySQL需要注意的一些问题
1、唯一索引的不同,sql server的唯一索引的字段只能允许存在一个null值,而mysql,一直oracle中唯一索引对应的字段都允许存在多个null值。
2、存储过程的语法存在很大的不同,存储过程的迁移是最麻烦的,需要仔细修改。
3、程序中部分写的SQL语句由于语法的不同也要相应的修改。
三、将SQL Server数据迁移到MySQL的常见方法
1、使用 SQLyog 迁移
优点
该迁移方法很简单,灵活,迁移时,可以进行字段的修改,比如在sql server中原来是datetime,然后迁移到mysql时你可以配置成timestamp;成功率很高;
缺点
迁移很慢!这是该方法最大的缺点,如果表的数据量达到几十万行,甚至几百万行,你会发现迁移起来真的很慢。明显比其他迁移方法慢很多。
2、使用 powerdesigner 和 sql server 的脚本导出功能 来迁移
(1)、该方法首先使用 powerdesigner,对sql
server数据库,进行逆向工程,得到E-R图,然后生成MySQL的建表语句。完成数据库结构的迁移;当然表结构的迁移,不使用
powerdesigner一样也是可以的。比如我将表结构导出成语句,然后手动进行修改,然后在MySQL中运行,也是一样的;
(2)、然后使用 sql server的工具 SSMS,将sql server数据库中的表的数据,导出成insert语句,每个表对应导出一个文件,然后对文件进行一些处理,然后导入到MySQL数据库中。
3、使用Oracle MySQL Server 官方的 workbeach 工具进行迁移
(1)、在workbench 连接sql server时,用户需要有 view any database 的权限。不然workbench无法访问sql server的表结构的元数据,从而无法进行迁移。
(2)、还有使用 Navicat 来进行迁移的方法,方法和 SQLyog 是类似的。
以下有几款迁移工具的对比,可以参考,比较推荐DB2DB
软件易用性主要是指软件在导入前的配置是否容易。由于很多软件设计是面向程序员而非一般的数据库管理人员、甚至是普通的应用程序实施人员,而这一类人员很多时候并没有数据源配置经验。因为一些使用 ODBC 或者 ADO 进行配置的程序往往会让这类用户造成困扰(主要是不知道应该选择什么类型的数据库驱动程序)。下面让我们看看四个工具的设计界面:
>>>>
1、SQLyog
SQLyog 使用的是古老的 ODBC 连接,但对于新一代的程序来说,这种方式的非常的不熟悉并且不容易使用,并且必须要求本机安装好相应的数据库的 ODBC 驱动程序(SQL Server 一般自带好)。
>>>>
2、Navicat Premium
NavicatPremium是四个应用工具中设计最不人性化的一个:从上图怎么也想像不到要点按那个小按钮来添加一个新的连接,并且这个连接设置不会保存,每次导入时都必须重新设置。NavicatPremium使用的是比 ODBC 稍先进的 ADO 设置方式(199X年代的产物),但使用上依然是针对老一代的程序员。
>>>>
3、Mss2sql
Mss2sql 是最容易在百度上搜索出来的工具,原因之一是它出现的时间较早。
Mss2sql由于是很有针对性的从 SQLServer 迁移到 MySQL,因为界面使用了 *** 作向导设计,使用非常容易。同时在设置的过程中,有非常多的选项进行细节调整,可以感觉到软件经过了相当长一段时间的使用渐渐完善出来的。
>>>>
4、DB2DB
DB2DB 由于是由国人开发,因此无论是界面还是提示信息,都是全程汉字。另外,由于 DB2DB 在功能上很有针对性,因为界面设计一目了然和易使用。和 mss2sql 一样, DB2DB 提供了非常多的选项供用户进行选择和设置。
三、处理速度和内存占用评测
在本评测前,本人的一位资深同事曾经从网上下载了某款迁移软件,把一个大约2500万记录数的数据表转送到阿里云 MySQL,结果经过了三天三夜(好在其中两天是星期六和星期日两个休息日)都未能迁移过来。因此这一次需要对这四个工具的处理速度作一个详细的测试。
考虑到从 SQL Server 迁移到 MySQL 会出现两种不同的场景:
从 SQL Server 迁移到本地 MySQL 进行代码测试和修改;
从 SQL Server 迁移到云端 MySQL 数据库正式上线使用;
以下为测试过程中的截图:
>>>>
1、SQLyog
>>>>
2、Navicat Premium
注意:我们在测试 Navicat Premium 迁移到 MySQL 时发现,对于 SQL Server 的 Money 类型支持不好(不排除还有其它的数据类型支持不好)。Money 类型字段默认的小数位长度为 255,使得无法创建数据表导致整个测试无法成功,需要我们逐张表进行表结构修改才能完成测试过程。
Navicat Premium 的处理速度属于中等,不算快也不算慢,但 CPU 占用还有内存占用都处于高位水平。不过以现在的电脑硬件水平来说,还是可以接受。但 CPU 占用率太高,将使得数据在导入的过程中,服务器不能用于其它用途。
>>>>
3、Mss2sql
Mss2sql 并没有提供计时器,因此我们使用人工计时的方法,整个过程处理完毕大于是 726 秒。Mss2sql 的 CPU 占用率相对其它工具来说较高,但仍属于可以接受的范围之内。
>>>>
4、DB2DB
DB2DB 同样迁移 300万数据时,仅仅使用了 2 分 44 秒,这个速度相当惊人。不过最后的结果出现一个 BUG,就是提示了转换成功,但后面的进度条却没有走完(在后面的数据完整性评测中,我们验证了数据其实是已经全部处理完毕了)。
1将选中的数据快儿拷贝到一个
TXT文本
文件中(记得把后面的空格消掉。。否则导入数据库后会有对应的
空行
),假如存到“D:\datatxt”这个位置里。
2根据要导入的数据快儿建立
MySql数据库
和表,然后进入命令提示符里使用命令
load
data
local
infile
'D:/datatxt'
into
table
exceltomysql
fields
terminated
by
'\t';
注意:
盘符
我使用的“/”才成功,否则提示找不到文件
下面文章中是用的“\”!
进行导入 *** 作
手动进行Excel数据和MySql
数据转换
有多种方法啊。介绍其中一种,使用mysql数据库的ODBC驱动。步骤:1安装mysql数据库的ODBC驱动,mysql-connector-odbc-35123-win32msi(其中是版本号),下载并安装。2在Mysql中创建数据库实例。3打开控制面板 -- 管理工具 -- 数据源ODBC,在用户DSN中添加一个MySQL ODBC 351数据源。4在登录login选项卡中输入数据源名称Data Source Name,此处输入MysqlDNS(也可以自己随便命名,只要在后面导入数据的时候选择正确的数据源名字就行);然后输入服务器Server,用户User,密码Password,输入正确后选择要导入的数据库,Database选择你需要导入的数据库。在连接选项connect options中根据需要设置MySql使用的端口port和字符集Character Set。注:字符集一定要和Mysql服务器相对应,如果Mysql使用了gbk字符集,则一定要设置字符集为gbk,否则导入到Sql Server可能会出现问号乱码。5打开sql server企业管理器,选择该数据库,单击右键选择所有任务 -- 导出数据。6‘选择数据源’为默认,‘选择目的’为刚刚安装的mySQL数据源,用户/系统DSN为MysqlDNS。在‘指定表复制或查询’中选择‘从源数据库复制表和视图’,在‘选择源表和视图’里,选择需要导入的表,即可将数据从MSSQLServer数据库导入到MySql数据库中。
MySQL命令行导出数据库:
1,进入MySQL目录下的bin文件夹:cd
MySQL中到bin文件夹的目录
如我输入的命令行:cd
C:\Program
Files\MySQL\MySQL
Server
41\bin
(或者直接将windows的环境变量path中添加该目录)
2,导出数据库:mysqldump
-u
用户名
-p
数据库名
>
导出的文件名
如我输入的命令行:mysqldump
-u
root
-p
news
>
newssql
(输入后会让你输入进入MySQL的密码)
(如果导出单张表的话在数据库名后面输入表名即可)
3、会看到文件newssql自动生成到bin文件下
命令行导入数据库:
1,将要导入的sql文件移至bin文件下,这样的路径比较方便
2,同上面导出的第1步
3,进入MySQL:mysql
-u
用户名
-p
如我输入的命令行:mysql
-u
root
-p
(输入同样后会让你输入MySQL的密码)
4,在MySQL-Front中新建你要建的数据库,这时是空数据库,如新建一个名为news的目标数据库
5,输入:mysql>use
目标数据库名
如我输入的命令行:mysql>use
news;
6,导入文件:mysql>source
导入的文件名;
如我输入的命令行:mysql>source
newssql;
MySQL数据库的导入,有两种方法:
1)
先导出数据库SQL脚本,再导入;
2)
直接拷贝数据库目录和文件。
在不同 *** 作系统或MySQL版本情况下,直接拷贝文件的方法可能会有不兼容的情况发生。
所以一般推荐用SQL脚本形式导入。下面分别介绍两种方法。
2
方法一
SQL脚本形式
*** 作步骤如下:
21
导出SQL脚本
在原数据库服务器上,可以用phpMyAdmin工具,或者mysqldump命令行,导出SQL脚本。
211
用phpMyAdmin工具
导出选项中,选择导出“结构”和“数据”,不要添加“DROP
DATABASE”和“DROP
TABLE”选项。
选中“另存为文件”选项,如果数据比较多,可以选中“gzipped”选项。
将导出的SQL文件保存下来。
212
用mysqldump命令行
命令格式
mysqldump
-u用户名
-p
数据库名
>
数据库名sql
范例:
mysqldump
-uroot
-p
abc
>
abcsql
(导出数据库abc到abcsql文件)
提示输入密码时,输入该数据库用户名的密码。
22
创建空的数据库
通过主控界面/控制面板,创建一个数据库。假设数据库名为abc,数据库全权用户为abc_f。
23
将SQL脚本导入执行
同样是两种方法,一种用phpMyAdmin(mysql数据库管理)工具,或者mysql命令行。
231
用phpMyAdmin工具
从控制面板,选择创建的空数据库,点“管理”,进入管理工具页面。
在"SQL"菜单中,浏览选择刚才导出的SQL文件,点击“执行”以上载并执行。
注意:phpMyAdmin对上载的文件大小有限制,php本身对上载文件大小也有限制,如果原始sql文件
比较大,可以先用gzip对它进行压缩,对于sql文件这样的文本文件,可获得1:5或更高的压缩率。
gzip使用方法:
#
gzip
xxxxxsql
得到
xxxxxsqlgz文件。
提示输入密码时,输入该数据库用户名的密码。
3
直接拷贝
如果数据库比较大,可以考虑用直接拷贝的方法,但不同版本和 *** 作系统之间可能不兼容,要慎用。
31
准备原始文件
用tar打包为一个文件
32
创建空数据库
33
解压
在临时目录中解压,如:
cd
/tmp
tar
zxf
mydbtargz
34
拷贝
将解压后的数据库文件拷贝到相关目录
cd
mydb/
cp
/var/lib/mysql/mydb/
对于FreeBSD:
cp
/var/db/mysql/mydb/
35
权限设置
将拷贝过去的文件的属主改为mysql:mysql,权限改为660
chown
mysql:mysql
/var/lib/mysql/mydb/
chmod
660
/var/lib/mysql/mydb/
insert into tablename values(value1,value2,)
insert into tablename(fieldname1,fieldname2,) values(value1,value2,)
insert into tablename(fieldname1,fieldname2) select fieldname1,fieldname2 from tablename1
以上基本上罗列了用insert插入数据的方法,当然你也可以用insert语句将几行同时插入到一个表中如下所示:
2在mysql运行环境下,我们还可以用LOAD DATA 语句把文件里面的数据读取录入到表里面一般来讲,因为此文件是由服务器在主机上直接读取的所以你必须具有file权限且文件必须是完全可读当你版本够新的话,你可以给出local,这样由于你是从客户机上读取该文件并将内容传送到服务器,你就不需要file权限
如果你没有给出local,则服务器按如下方法对其进行定位:
1)如果你的filename为绝对路径,则服务器从根目录开始查找该文件
2)如果你的filename为相对路径,则服务器从数据库的数据目录中开始查找该文件
如果你给出了local,则文件将按以下方式进行定位:
1)如果你的filename为绝对路径,则客户机从根目录开始查找该文件
2)如果你的filename为相对路径,则客户机从当前目录开始查找该文件
说了半天,也许你还不明白这具体的格式,看下面先:
LOAD DATA [LOCAL] INFILE 'filename' into table tablename import_options [(fieldname_list)]
import options的语法为:fieldsterminated by 'char'
enclosed by 'char'
escaped by 'char'linesterminated by 'string'
下面我们对其进行一些说明:
1)fields terminated by char 指定分隔列的字符缺省时假定列值由制表符分隔
2)fields enclosed by char 指明列值应包括在指定的字符中通常用引号缺省时,假定列值不包括在任何字符中
3)fields escaped by char 表示用于转义特殊字符的转义符缺省时表示无转义符
4)lindes escaped by string 指定结束输入行的串(可以是多字符的)缺省时假定由换行符终止行
需要注意的是转义字符的使用 如:\' 表示单引号,\" 表示双引号 等等另外还有一些选项这里没有具体谈到,如 ignore n lines 她可以控制文件的前n行不被读入数据库详细请看mysql中文参考
说了上面这么多,给一行命令大家具体体会一下:
load data [local] infile "sampletxt" into table sample fields terminated by "," enclosed by "\""
3在系统命令行下你可以用mysqlimport实用程序,她将文本文件的内容读取到已有表中(其实mysqlimport起的作用就是实现load data命令行的接口),调用完mysqlimport后她生成一个load data 语句语法基本上和load data差不多:
mysqlimport [options] sample_db filename
同样,给条命令看一下吧:
以上就是关于如何把sqlserver数据迁移到mysql数据库及需要注意事项全部的内容,包括:如何把sqlserver数据迁移到mysql数据库及需要注意事项、如何将数据库从SQL Server迁移到MySQL、怎么将数据导入到mysql数据库中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)