由于一些数据库重构项目的需求,最近遇到很多从SQL Server将表和数据迁移到MySQL的需求。这个需求说简单也简单,说麻烦也麻烦。前不久为了把一张大日志表成功导入到mysql,也折腾了不少时间。现在简单整理下实施方案。
首先是表结构的问题:
SQL Server中的部分字段类型不能直接沿用到MySQL,需要进行转换,主要有以下几种:
然后是数据迁移的问题:
数据迁移时,我们采取的是从SQL Server将数据导出为文本文件,然后将文本文件load到MySQL的方式(也尝试过通过etl工具直接迁移,例如SQL Server Integration Service,但是速度实在不理想)。用文本导入的话有几个需要考虑的问题:
- 为了保持SQL Server表中的null值,null值需要转化成\N导出;
- 由于反斜杠\在load data时是转义符,因此表数据中存有的反斜杠要进行替换变成\\,才能正确导入到MySQL;
- 由于源数据的字符类字段中可能本身就含有特殊字符,如换行符回车符等,在导出数据时需要使用特殊分隔符以区分字段和行。
假设要迁移的表syslog有如下字段:
Column_name | Type | Nullable |
id | int | no |
Servername | varchar | yes |
Dbname | varchar | yes |
filename | varchar | yes |
Filesize | varchar | yes |
Backup_start_time | datetime | yes |
Backup_end_time | datetime | yes |
那么在导出数据时可以用如下sql提取数据(有大于8000的数据可以转换成varchar(max)):
select id, case when Servername is null then '\N' else replace(convert(varchar(8000),Servername),'\','\\') end as Servername, case when Dbname is null then '\N' else replace(convert(varchar(8000),Dbname),'\','\\') end as Dbname, case when Filesize is null then '\N' else replace(convert(varchar(8000),Filesize),'\','\\') end as Filesize, case when Backup_start_time is null then '\N' else convert(varchar(8000),Backup_start_time,121) end as Backup_start_time, case when Backup_end_time is null then '\N' else convert(varchar(8000),Backup_end_time,121) end as Backup_end_time from syslog (nolock)
如果表字段很多,提取数据的sql写起来比较麻烦 ,那么可以通过下列语句直接从系统表中拼接语句:
select case is_nullable when 0 then 'replace(convert(varchar(8000),'+name+case system_type_id when 61 then ',121),''\'',''\\'')' else '),''\'',''\\'')' end+name else 'case when '+name+' is null then ''\N'' else replace(convert(varchar(8000),'+name+case system_type_id when 61 then ',121),''\'',''\\'') end as ' else '),''\'',''\\'') end as ' end+name end +',' From sys.columns (nolock) where object_id=object_id('syslog') order by column_id
上述语句得到的结果是所有字段的转换后输出,加入select和from就可以得到完整的提取sql如下:
select replace(convert(varchar(8000),id),'\','\\')id, case when Servername is null then '\N' else replace(convert(varchar(8000),Servername),'\','\\') end as Servername, case when Dbname is null then '\N' else replace(convert(varchar(8000),Dbname),'\','\\') end as Dbname, case when Filesize is null then '\N' else replace(convert(varchar(8000),Filesize),'\','\\') end as Filesize, case when Backup_start_time is null then '\N' else replace(convert(varchar(8000),Backup_start_time,121),'\','\\') end as Backup_start_time, case when Backup_end_time is null then '\N' else replace(convert(varchar(8000),Backup_end_time,121),'\','\\') end as Backup_end_time from syslog (nolock)
这样由于简单的统一化处理,会对非字符类型字段做一些多余的replace,但不会对导出速度有太大影响。
生成好提取语句后,可以通过SQL Server的数据导入导出工具进行导出。
在源DB上右键,选择导出数据:
在导出源头输入正确的用户名密码后,导出的目的选择文本文件,并且为了保证中文字符正确迁移,最好采用unicode格式导出:
下一步后选择通过查询语句来转换数据:
随后在下一窗口填入提取sql的语句,继续下一步到选择分隔符,这里使用特别的自定义分隔符作为行分隔符和列分隔符:
之后完成导出即可生成文件syslog.txt。
将导出的文本文件拷贝到mysql所在的linux服务器上后,先将文件进行转码,转为utf8格式:
iconv -f unicode -t utf8 syslog.txt -o syslog.raw
然后在mysql中进行load data,按照定义的特殊字符作为分隔(事先应该先把表结构创建好):
load data infile '/tmp/syslog.raw' into table syslog FIELDS TERMINATED BY '##$$##' LINES TERMINATED BY '#$#\r\n';
这样就能把数据完整地导入到MySQL中。
相关推荐
本方案主要探讨如何将SQL Server中的数据迁移到MySQL,涵盖了多种迁移工具和技术,包括Kettle、SqlYong、Navicat以及DataX。这些工具支持离线和在线迁移,甚至能处理分片式数据库的迁移,极大地提高了数据迁移的灵活...
在数据库管理领域,数据迁移是一项常见的任务,尤其在企业中,由于业务需求或者技术选型的变化,可能需要将数据从一个数据库系统迁移到另一个。本案例中,我们关注的是从MySQL数据库向SQL Server数据库的迁移过程,...
以下是关于"sqlServer 数据迁移 mysql教程"的详细说明: 1. **环境准备**: 在开始迁移前,确保你已经安装了SQL Server 2008和MySQL 5.5的客户端工具,例如SQL Server Management Studio (SSMS) 和MySQL Workbench...
本文将详细介绍如何使用Navicat工具实现SQL Server表结构到MySQL的同步操作,这对于那些需要在不同数据库系统间进行数据迁移的开发者来说尤其有用。 Navicat是一款强大的数据库管理工具,支持多种数据库类型,包括...
【标题】:“从sqlserver同步数据到Mysql数据库”是一个典型的跨数据库系统数据迁移的案例。在信息技术领域,数据迁移是常见的操作,特别是在企业级应用中,可能由于业务需求、性能优化或者系统升级等原因,需要将...
MySQL到SQL Server迁移工具,全称为SQL Server Migration Assistant (SSMA) for MySQL,是由微软公司开发的一款专业级数据库迁移解决方案。这款工具旨在帮助用户将他们的MySQL数据库无缝地迁移到SQL Server环境中,...
在MySQL Workbench中,Migration Wizard功能强大,支持多种数据库之间的迁移,包括从MS SQL Server迁移。这一工具的使用,不仅能够简化迁移过程,还能减少迁移过程中可能出现的错误。 文档的正文部分一开始提到了...
总之,通过Flink-connector-sqlserver-cdc 2.3.0,我们可以轻松地构建一个实时数据同步系统,将SQL Server数据库的变化实时同步到MySQL。理解并掌握上述步骤和概念,对于实现高效、稳定的数据流处理至关重要。
示例中的`syncdata_mysql2sqlserver`存储过程可以批量处理多个表的迁移,通过循环遍历源数据库中的表,逐个将数据导入到目标数据库。 7. 标识和序列处理: MySQL和SQL Server在处理自增主键(标识字段)上有差异。...
根据提供的信息,这里提到的是一个名为“mss2sql”的工具,可能是一个用于转换SQL Server数据库结构和数据到MySQL格式的实用程序。但请注意,这个工具的具体使用方法、功能和兼容性需要查看其文档或通过实际操作来...
本操作文档将详细介绍如何使用Navicat客户端工具将SQL Server的表结构转换到MySQL数据库中。Navicat是一款强大的数据库管理工具,支持多种数据库系统,包括SQL Server和MySQL,使得数据迁移变得简单而高效。 首先,...
2. 数据迁移:工具会逐条读取SQL Server中的记录,根据字段映射规则将其转换为符合MySQL数据类型的格式,然后插入到对应的MySQL表中。这一步骤需要注意数据类型不兼容的问题,例如,SQL Server的datetime与MySQL的...
本篇文档详细介绍了如何将SQL Server 2000数据库迁移到MySQL 5的过程,以下是具体的迁移步骤和注意事项。 首先,迁移前的准备工作至关重要。确保你的数据源(SQL Server 2000)与目标数据库(MySQL 5)的版本匹配,...
- **数据类型映射**:由于SQL Server和MySQL之间的数据类型存在差异,因此需要创建一个对应表,将原数据库中的数据类型映射到MySQL的数据类型上。 - **脚本编写与测试**:编写转换脚本来迁移数据,并进行充分的测试...
总结,MySQL到SQL Server或反之的转换涉及到数据库对象的结构和数据的迁移,这可以通过专门的工具实现,如`mss2sql.rar`和`mysqltomssql.zip`。转换过程中需要注意语法差异、数据一致性、安全性和测试验证。理解这个...
在不同平台之间迁移数据是常见的需求,例如从Microsoft SQL Server转移到MySQL。"SQL Server数据库数据转MySQL工具"正是一款解决这一问题的专业软件,它允许用户方便地将SQL Server中的数据转换到MySQL环境中。 SQL...
migration-v4.1.4,瀚高数据库迁移工具支持源端为Oracle、MySQL、SQL Server、DB2、KingbaseV7、KingbaseV8、DM7、DM8、HIGHGO数据库,目标端为HIGHGO、PostgreSQL数据库的自动化迁移,为了能更好地实现数据迁移工程...
MySQL到SQL Server 2005的迁移是一个复杂的过程,涉及到数据转换、数据库结构映射以及应用程序接口的适配。这个过程通常需要专业的工具来帮助完成,以确保数据的完整性和迁移的顺利进行。以下是对这个主题的详细阐述...