转载请注明:https://blog.csdn.net/a714530833/article/details/90199162
本文使用的数据库:SQLSERVER
场景:
1.从旧数据库中将数据迁移到全新的数据库
2.有两个数据库A和B,A中需迁移表的结构和B一样,A和B中都有各自的数据,现在要同步两个数据库
方法:
- 通过单表查询插入SQL语句
- 通过写数据库存储过程
- 通过写程序(这里采用java语言),将数据查询出来后,插入新数据库
注:主要介绍第一种方式,2和3简单介绍下思路,具体实现需后面再研究。1和2不一样的地方是,第二种方式存储过程实现的基本思路,是通过写语句,在迁移一条主表数据的时候,同时迁移其关联子表数据。而第一种方法,是一个表一个表的迁移,在有关联表的存在,所以要先迁移主表,后迁移子表。
实现:
一、通过单表查询插入SQL语句:
两个语句:
select * into TABLE_A from [192.168.0.110].reliability.dbo.TABLE_B where 条件1 nad 条件2
该语句会将TABLE_B中满足条件的数据拷贝到TABLE_A(TABLE_A在原数据库中不能存在,是脚本自动生成的表),注意此方法只能将数据进行拷贝,表结构不会保留(字段一样,单主键,外键,字段属性设置等都会丢失,可以理解成将查询出来的数据,进行简单保存)
set identity_insert TABLE_A ON /**如果表主键设置自增长且要主动设置指定值,需将此开关打开**/
INSERT INTO [reliability].[dbo].TABLE_A
([PKID],
[CCP_ID]
,[cum_yes])
select [PKID]
,[CCP_ID]
,[cum_yes]
from [192.168.0.110].reliability.dbo.TABLE_B
WHERE 条件
set identity_insert TABLE_A OFF
该方式需将要拷贝的表先在新数据库中生成(可用客户端拷贝旧表的表结构),且要拷贝的字段信息需都指明。如果主键没设置自增长,则set identity_insert TABLEL_A ON不要加。
注:
- 如果要迁移数据库在两个不同服务器上,则要在新数据库上配置链接服务器,将旧数据库配置到新数据库上,新数据库就能通过[IP].数据库名.dbo.表名的形式,访问到旧数据库的数据
- 对于要同步新旧数据库数据(两个数据库都有各自的数据),会存在一个问题,待迁移主表主键为自增长,旧数据库待迁移数据的主键在新数据库中可能已经被占用。所以不能简单的直接将原本的主键拷贝过去。而且也不能令拷过去的数据主键自增长,因为这样其关联的子表就会不知道其关联的主表主键是多少。解决方式有几种思路:1.在新数据库中新增一个临时字段,记录旧表中的主键数据,子表迁移的时候根据该字段更新外键数据,最后在删除该字段(修改到表结构,有风险,自己评估)。2.通过写程序或存储过程的方式实现(较麻烦)。3.给待迁移的数据主键加上某个指定的值,令其主键大于现有最大值,保证其不会重复,然后子表迁移时,外键也加上该值。(需评估数据主键的范围是否满足)
二、存储过程
由于本人了解有限,并未深入学习存储过程,这边只简单介绍大体思路,具体实现还待验证。
通过游标进行对旧数据库查询结果的遍历,并取出每次遍历中各字段的值。对每次遍历进行新数据库的插入。然后再根据主键,查询出关联子表,同理查询出子表数据进行插入(关联外键可在插入时直接更新)。子表操作完之后,再进行主表的下一轮循环。最后摧毁游标。(如果不是必要,建议不要采用存储过程,毕竟存储过程实现较难,且不易排查问题)
三、通过java程序
这里对于该方法,只介绍思路和新旧数据库的数据源切换方法。
首先,在项目中配置读和写的数据源
配置mapper映射(使用mybatis实现)
自定义注解,用于读写数据源的切换:
利用Spring AOP切面编程实现对自定义注解的解析
通过重写determineCurrentLookupKey动态切换数据源(看不明白的请自行百度Spring动态切换数据源)。以上就是整个数据迁移项目的核心,剩下的就是一些mybatis的查询和插入语句,在这就不做过多的描述。
转载请注明:https://blog.csdn.net/a714530833/article/details/90199162