迁移过程
程序改造和数据库迁移
迁移类型
在线迁移和离线迁移
迁移工具
可以使用SQL Server Management Studio,里面加上ODBC驱动程序操作Mysql。
SQL OPENQUERY用法
OPENQUERY函数,远程执行数据库增删改查。
eg:
-
OPENQUERY([MYSQL-STAGE-STAGE], 'select * from etl_migrate_log where table_name= ''notes'';')
第一个参数为配置好的链接服务器名称,第二个参数为要执行的MySQL命令
增删改查
--1.SELECT语句
SELECT * FROM OPENQUERY([MYSQL-STAGE-STAGE], 'select * from etl_migrate_log where table_name= ''notes'';');
--或
SELECT * FROM OPENQUERY([MYSQL-STAGE-STAGE], 'select * from etl_migrate_log ') WHERE table_name= 'notes'
--2.INSERT语句,INTO可省略
INSERT INTO OPENQUERY([MYSQL-STAGE-STAGE],'select table_name,endtime from etl_migrate_log ;') VALUES( 'notes', now())
--3.UPDATE语句
UPDATE OPENQUERY([MYSQL-STAGE-STAGE], 'select table_name, endtime from etl_migrate_log where table_name= ''notes''') SET endtime = now()
--4.DELETE语句,FROM可省略
DELETE FROM OPENQUERY([MYSQL-STAGE-STAGE], 'select * from etl_migrate_log where table_name= ''notes''')
--或
SET @tablename= 'ls'
DELETE FROM OPENQUERY([MYSQL-STAGE-STAGE], 'select * from etl_migrate_log') WHERE table_name= @tablename
结构和语法区别
-
,时间戳timestamp数据类型
sqlserver和mysql都有timestamp数据类型,但是两者的实现区别很大。
在sql server中,该类型表明数据库中数据修改发生的相对顺序,它的值本质上是一个bigint类型的一个递增数字,与时间和日期无关, 该数字在数据库实例级别不会重读。
在mysql中,该类型表明数据库中数据修改发生的相对顺序, 它的本质是一个时间,该时间再表级别都有可能重复。
最坑的是该类型的字段是我们业务的关键字段,用于用户从服务器上拉去数据。
最后的解决办法,该字段的数据按照bigint的值从sql server迁移到mysql,mysql在添加一个timastamp数据类型,程序添加判断机制。
2,字符集和emoji表情
sqlserver中默认直接可以保存emoji表情。开始迁移过程没有注意到该问题。历史数据迁移完毕以后,才发现该问题。
mysql中需要使用utf8mb4来保存此数据。
3,索引不能超过大小
mysql中索引长度不能超过767字节!!!
这个只能是优化数据类型。
比如有的字段保存设备的macid,数据类型是varchar(50),经过调研发现macid只有12位,可以修改成varchar(12)。
再有int是否可以改为tinyint或者smallint、是否可以用latin1代替utf8(当然最好是都统一使用utf8)等
这里主要就是数据类型的优化,稍后会有专门的文章来介绍数据类型优化。
4,varchar(max)类型
mysql没有该数据类型,mysql中需要使用text类型。
5,常见的不兼容的语法
sqlserver中一个使用top取前几行的数据,mysql使用limit完成此功能。这个相对还比较好修改。
两者使用临时表的方法也不一样。
6,CTE递归
在存在递归查询的操作里,sqlserver有一个非常棒的功能就是CTE递归查询。
7,over窗口查询
sqlserver中的over窗口函数也是我非常喜欢的一个功能,比如分组排序、分组范围等查询。