SQL Server 迁移至MySQL 关键步骤的梳理总结
迁移主要是通过navicat工具来实现的。迁移工具的选定在此不讨论。
迁移前准备
1.提前通知dba\sa\bi等,并确认发布计划及数据库迁移方案。
2.梳理出sql server db 中影响业务的job(迁移的过程中要关闭)、db linkserver、相关账号。
3.模拟数据迁移,评估出相关精确的时间。例如每张大表的耗时(我们定义的表准是,每张百万级别的表耗时都要测评出来),每2分钟一个进度标记。navicat 工具不能指定sql条件迁移 ,需全表迁移,因此 不支持增量迁移。sql server 和 mysql 表结构需一致。表名、字段名一致。如果不一致,需要创建一个过渡库过渡表来进行迁移。
4.创建生产环境的mysql数据库,将最终的dev环境的表导入生产环境(只导表结构)。与sql server 相比,如果有表结构调整,最好要求开发提供数变化的list(包含新增表、新增索引等)。
5.对生产环境的mysql进行账号设置(dbkey等相关配置一起设置)。
6.对生产环境的表进行检查(主要表结构的变化,例如主要字段、索引、默认值等)。navicat工具导入的过程中,可以保留索引,但是默认值会丢失,并且默认字段不理想。此步骤可参照附录。
7.进行测试(全链路,从数据库的连接到插入更新等)。测试可以是全面的,db对数据库进行测试,当然,针对应用程序,可以要求测试人员提供一份性能压测报告。
8.数据库备份作业的设置(完整备份和binlog备份)。
9.验证迁移步骤及准备脚本
迁移中
1.请sa团队暂停相关的业务服务
2.禁用server 上db的相关账号。
3.停止备份job 和影响业务的job。
4.数据迁移。
5.验证数据,主要是比对迁移前后数据量。
6.通知全员数据迁移完毕。通知sa开启相关服务。
迁移后
1.删除链接服务器(dblink,本地相关链接服务器 和异地有关此db的连接服务器)。
2.通过活动监视器或sql命令查询是否还有对此 sql server db的请求。
3.mysql数据库性能监控。
4.数据库做一个完整备份,copy至异地服务器。copy至异地,主要是考虑服务器资源的回收,此为,在异地最好要添加一个对备份文件的描述,例如此文件是什么时候产生的,用途是什么,是否可以删除,建议保留时间,操作人等。
5.关闭sql server 剩余的job。
6.detach (分离)数据库(一定是detach 不要直接删除,虽然有备份文件,但恢复还是相对较慢的)。
7.如果此服务器上没有其它的用户数据库,停止sql server 服务。
8.历史数据库的迁移(如果有的话)。
9.归档数据job的设置。
10.本次迁移的总结报告(主要是梳理出迁移过程注意的事项和提升的建议)
附录
附录a
sql server 与 mysql 字段类型对照表
sql server | mysql |
n/varchar(1-4000) | varchar(1-4000) |
varchar(4000-8000) | text |
n/varchar(max) | longtext |
char | char |
nchar | varchar |
timestamp | timestamp |
time | datetime(3) |
datetime | datetime(3) |
date | datetime(3) |
smalldatetime | datetime(3) |
numeric | decimal |
numeric17 | decimal |
ntext | mediumtext |
text | mediumtext |
bit | tinyint |
int | int |
tinyint | tinyint |
bigint | bigint |
smallint | int |
float | double |
decimal | decimal |
varbinary | varchar |
binary | varchar |
image | longblob |
uniqueidentifier | varchar(40) |
real | double |
money | decimal(19,4) |
longblob | longblob |
附录b
查询生成 需添加默认值和调整字段的sql语句。
以下t-sql在需要迁移的sql server db上执行,生成的sql 语句在mysql直接执行(sql_text列)。
select 'alter table ' + d.name + ' modify column ' + a.name+' ' + case when b.name = 'datetime' then ' datetime(3)' when b.name = 'bit' then ' tinyint(1)' when b.name = 'decimal' then ' decimal(' + cast(columnproperty(a.id, a.name, 'precision') as varchar(10)) + ',' + cast(isnull(columnproperty(a.id, a.name, 'scale'), 0) as varchar(10)) + ')' when b.name like '%varchar' and columnproperty(a.id, a.name, 'precision')=-1 then ' varchar(4000)' when b.name like '%varchar' and columnproperty(a.id, a.name, 'precision')<>-1 then ' varchar('+cast(columnproperty(a.id, a.name, 'precision') as varchar(20))+')' when b.name like '%varbinary' and columnproperty(a.id, a.name, 'precision')=-1 then ' varbinary(4000)' when b.name like '%varbinary' and columnproperty(a.id, a.name, 'precision')<>-1 then ' varbinary('+cast(columnproperty(a.id, a.name, 'precision') as varchar(20))+')' else b.name end + case when a.isnullable = 1 then ' null' else ' not null ' end + ' default ' + cast (case when e.text = '(getdate())' then 'current_timestamp(3)' when e.text like '(%' then replace(replace(e.text, '(', ''), ')', '') else e.text end as varchar(30)) + case when isnull(g.[value], '') <> '' then ' comment ''' + cast(isnull(g.[value], '') as varchar(100)) + ''';' else ';' end as sql_text , 表名 = d.name , 字段名 = a.name , 字段说明 = isnull(g.[value], '') , 类型 = b.name , 占用字节数 = a.length , 长度 = columnproperty(a.id, a.name, 'precision') , 小数位数 = isnull(columnproperty(a.id, a.name, 'scale'), 0) , 允许空 = case when a.isnullable = 1 then 'y' else 'n' end , 默认值 = isnull(e.text, '') from syscolumns a inner join systypes b on a.xusertype = b.xusertype inner join sysobjects d on a.id = d.id and d.xtype = 'u' and d.name <> 'dtproperties' inner join syscomments e on a.cdefault = e.id left join sys.extended_properties g on a.id = g.major_id and a.colid = g.minor_id left join sys.extended_properties f on d.id = f.major_id and f.minor_id = 0 where b.name <> 'uniqueidentifier' and d.name not in ('需排除的表') order by d.name , a.id , a.colorder
本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!
上一篇: 燕麦米减肥吗?其实它也有很多大道理
下一篇: goldengate简单配置