数据库数据迁移方法

转载请注明:https://blog.csdn.net/a714530833/article/details/90199162

本文使用的数据库:SQLSERVER

场景:

1.从旧数据库中将数据迁移到全新的数据库

2.有两个数据库A和B,A中需迁移表的结构和B一样,A和B中都有各自的数据,现在要同步两个数据库

方法:

  1. 通过单表查询插入SQL语句
  2. 通过写数据库存储过程
  3. 通过写程序(这里采用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值