论文部分内容阅读
[摘 要]本文研究了某些信息系统需要在两个同构数据库之间进行数据迁移的情况下,能够较快捷、完整地完成数据迁移的一种通用的数据库脚本的设计方法。该方法综合考虑了两个数据库的一致性程度,以及主键、外键和触发器等影响因素,最后给出了该方法的实际运行效率。
[关键词]同构 数据迁移
中图分类号:TE381 文献标识码:A 文章编号:1009-914X(2017)34-0282-01
一、研究背景
不少单位内部使用的小型信息系统,由于单位自身的原因(组织架构、内部组网方式等),可能存在两台或多台服务器分别运行的情况。经过一段时间的运行之后,又可能产生需要将多台服务器上的数据合并到单一服务器上统一运行的需求。
以空中交通管理部门为例,局机关内部可能会通过内部局域网组网,但在边远的导航台、雷达站等地,无法接入局机关内部局域网,当地只有互联网网络。因此该信息系统可能会设置两台服务器,一台部署在局机关内部网络运行,一台部署在互联网外网,供边远导航台、雷达站等台点使用。此种分开运行的方式持续几年后,边远导航台、雷达站可能通过通信链路改造接入了局机关内部网络,此时需要把外网服务器的数据迁移到内网服务器上,统一运行。
二、影响数据迁移的因素
以SQL Server数据库为例,要将外网数据库的数据迁移进入内网数据库,需要考虑的因素有(内网数据库设为数据库A,外网数据库设为数据库B):
1.两个数据库的结构必须基本一致
a)数据库A的表集合必须包含数据库B的表集合,即B中有的表A中一定要有,A中有的表B中不一定要有;
b)对于数据库A和数据库B共有的某张表T,A中的表T的字段集合必须包含B中的表T的字段集合,即B中的表T有的字段在A中一定要有,A中的表T的字段B中不一定要有;
c)對于A中的表T有、但B中的表T没有的字段,必须为null属性;
d)对于A中的表T和B中的表T都有的字段,在A中的长度定义必须大于等于在B中的长度定义:例如A中某表的某字段定义为nvarchar(100),则B中该表该字段的定义必须为nvarchar(n<=100)。
2.需要事先屏蔽可能引起数据冲突的因素
a)主键相同的数据项不得重复插入。当将数据库B中的某条数据插入A中时,若该条数据的主键已存在于A中,则SQL Server会报错,从而终止事务执行。因此必须避免该种情况发生。
b)需事先取消表与表间的外键约束。表与表之间可能存在外键约束[1],例如表C使用表D的主键Y作为外键F。但我们在遍历数据库B中的表插入数据库A的时候,无法事先知道表的先后顺序,有可能会先插入表C的数据、再插入表D的数据。再插入表C的某条数据时,这时候因为数据库A中的表D还没有该条数据的外键F的存在,这时候就无法插入,SQL Server会报错,从而终止事务执行。因此需事先取消表与表间的外键约束。
c)需事先取消表中的触发器。触发器是指对表进行插入、更新、删除的时候会自动执行的特殊存储过程[2],在本文中主要指插入时的触发器。在将数据库B中的某条数据插入数据库A时,若不取消触发器,则触发器的执行结果可能会对数据库A产生某种影响Z;而该触发器同样存在于数据库B中,当初B中该条数据插入时同样会产生某种影响Z’,而Z’也会插入数据库A,势必可能会和Z发生冲突。因此需事先取消表中的触发器。
三、数据迁移具体流程
1.检查数据库结构的一致性
使用数据库中的INFORMATION_SCHEMA.TABLES表,找出内网数据库和外网数据库的所有表名;再使用数据库中的INFORMATION_SCHEMA.COLUMNS表,找出每个表中的每个字段的字段名、数据类型、长度、是否为空等属性。对内网数据库和外网数据库的上述信息进行表,检查两个数据库的结构是否符合第二节中基本一致的定义。
2.禁用强制外键约束
从内网数据库的系统表SysObjects中找出所有“强制外键约束”,包括该约束的名称、所在的表名等信息,放入临时表[_MyForeignKey];然后遍历临时表,对于内网数据库的每一个“强制外键约束”,进行“NOCHECK CONSTRA INT”操作。
3.禁用触发器
直接遍历内网数据库中的每一个表,对该表执行“DISABLE TRIGGER all”操作,即可禁用该表上的所有触发器。
4.获取外网数据库中所有表名及主键名
从外网数据库的系统表SysObjects和SysColumns中獲取外网数据库的所有表名及主键名,放入临时表[_MyTableAndPKey]中。
5.将外网数据库中每个表整体插入内网数据库
遍历临时表[_MyTableAndPKey],对于每个表名X(设其主键为F),使用SQL语句“insert into database_A.X select * from database_B.X where F not in (select F from database_A.X)” 将外网数据库中每个表整体插入内网数据库。
6.恢复触发器
直接遍历内网数据库中的每一个表,对该表执行“ENABLE TRIGGER all”操作,即可禁用该表上的所有触发器。
7.恢复外键约束
遍历临时表[_MyForeignKey],对于内网数据库中的每一个“强制外键约束”,进行“CHECK CONSTRAINT”操作。
8.具体实施
将上述第1步写成单独脚本运行,人工对检查结果进行判断,对违背一致性原则的个别表结构进行人工修正;
将上述第2步-第7步的操作编写成一个事务,统一执行。若事务执行过程中出错,则对照出错信息,再次检查两个数据库的表结构,进行必要的修正,直到事务顺利执行为止。
四、结论
我们在使用英特尔至强处理器E5-2603 V4(1.7GHz、6核12线程)、16G DDR4内存、2T SATA硬盘的DELL R730服务器上进行了数据迁移测试。结果表明,将约10万条数据的外网数据库迁移进入内网数据库,用时仅需3.218秒,更重要的是所有数据都顺利迁移,没有发生数据丢失,事后信息系统也通过了测试,内外网数据统一运行良好,整个数据迁移工作成功完成。
参考文献
[1] 曾秀莲.基于SQL Server2005外键技术的教学实践.计算机光盘软件与应用,2012(13):141-142.
[2] 姚渝春,潘林森,王凡.数据库触发器及应用.土木建筑与环境工程,2003,25(5):128-131.
[关键词]同构 数据迁移
中图分类号:TE381 文献标识码:A 文章编号:1009-914X(2017)34-0282-01
一、研究背景
不少单位内部使用的小型信息系统,由于单位自身的原因(组织架构、内部组网方式等),可能存在两台或多台服务器分别运行的情况。经过一段时间的运行之后,又可能产生需要将多台服务器上的数据合并到单一服务器上统一运行的需求。
以空中交通管理部门为例,局机关内部可能会通过内部局域网组网,但在边远的导航台、雷达站等地,无法接入局机关内部局域网,当地只有互联网网络。因此该信息系统可能会设置两台服务器,一台部署在局机关内部网络运行,一台部署在互联网外网,供边远导航台、雷达站等台点使用。此种分开运行的方式持续几年后,边远导航台、雷达站可能通过通信链路改造接入了局机关内部网络,此时需要把外网服务器的数据迁移到内网服务器上,统一运行。
二、影响数据迁移的因素
以SQL Server数据库为例,要将外网数据库的数据迁移进入内网数据库,需要考虑的因素有(内网数据库设为数据库A,外网数据库设为数据库B):
1.两个数据库的结构必须基本一致
a)数据库A的表集合必须包含数据库B的表集合,即B中有的表A中一定要有,A中有的表B中不一定要有;
b)对于数据库A和数据库B共有的某张表T,A中的表T的字段集合必须包含B中的表T的字段集合,即B中的表T有的字段在A中一定要有,A中的表T的字段B中不一定要有;
c)對于A中的表T有、但B中的表T没有的字段,必须为null属性;
d)对于A中的表T和B中的表T都有的字段,在A中的长度定义必须大于等于在B中的长度定义:例如A中某表的某字段定义为nvarchar(100),则B中该表该字段的定义必须为nvarchar(n<=100)。
2.需要事先屏蔽可能引起数据冲突的因素
a)主键相同的数据项不得重复插入。当将数据库B中的某条数据插入A中时,若该条数据的主键已存在于A中,则SQL Server会报错,从而终止事务执行。因此必须避免该种情况发生。
b)需事先取消表与表间的外键约束。表与表之间可能存在外键约束[1],例如表C使用表D的主键Y作为外键F。但我们在遍历数据库B中的表插入数据库A的时候,无法事先知道表的先后顺序,有可能会先插入表C的数据、再插入表D的数据。再插入表C的某条数据时,这时候因为数据库A中的表D还没有该条数据的外键F的存在,这时候就无法插入,SQL Server会报错,从而终止事务执行。因此需事先取消表与表间的外键约束。
c)需事先取消表中的触发器。触发器是指对表进行插入、更新、删除的时候会自动执行的特殊存储过程[2],在本文中主要指插入时的触发器。在将数据库B中的某条数据插入数据库A时,若不取消触发器,则触发器的执行结果可能会对数据库A产生某种影响Z;而该触发器同样存在于数据库B中,当初B中该条数据插入时同样会产生某种影响Z’,而Z’也会插入数据库A,势必可能会和Z发生冲突。因此需事先取消表中的触发器。
三、数据迁移具体流程
1.检查数据库结构的一致性
使用数据库中的INFORMATION_SCHEMA.TABLES表,找出内网数据库和外网数据库的所有表名;再使用数据库中的INFORMATION_SCHEMA.COLUMNS表,找出每个表中的每个字段的字段名、数据类型、长度、是否为空等属性。对内网数据库和外网数据库的上述信息进行表,检查两个数据库的结构是否符合第二节中基本一致的定义。
2.禁用强制外键约束
从内网数据库的系统表SysObjects中找出所有“强制外键约束”,包括该约束的名称、所在的表名等信息,放入临时表[_MyForeignKey];然后遍历临时表,对于内网数据库的每一个“强制外键约束”,进行“NOCHECK CONSTRA INT”操作。
3.禁用触发器
直接遍历内网数据库中的每一个表,对该表执行“DISABLE TRIGGER all”操作,即可禁用该表上的所有触发器。
4.获取外网数据库中所有表名及主键名
从外网数据库的系统表SysObjects和SysColumns中獲取外网数据库的所有表名及主键名,放入临时表[_MyTableAndPKey]中。
5.将外网数据库中每个表整体插入内网数据库
遍历临时表[_MyTableAndPKey],对于每个表名X(设其主键为F),使用SQL语句“insert into database_A.X select * from database_B.X where F not in (select F from database_A.X)” 将外网数据库中每个表整体插入内网数据库。
6.恢复触发器
直接遍历内网数据库中的每一个表,对该表执行“ENABLE TRIGGER all”操作,即可禁用该表上的所有触发器。
7.恢复外键约束
遍历临时表[_MyForeignKey],对于内网数据库中的每一个“强制外键约束”,进行“CHECK CONSTRAINT”操作。
8.具体实施
将上述第1步写成单独脚本运行,人工对检查结果进行判断,对违背一致性原则的个别表结构进行人工修正;
将上述第2步-第7步的操作编写成一个事务,统一执行。若事务执行过程中出错,则对照出错信息,再次检查两个数据库的表结构,进行必要的修正,直到事务顺利执行为止。
四、结论
我们在使用英特尔至强处理器E5-2603 V4(1.7GHz、6核12线程)、16G DDR4内存、2T SATA硬盘的DELL R730服务器上进行了数据迁移测试。结果表明,将约10万条数据的外网数据库迁移进入内网数据库,用时仅需3.218秒,更重要的是所有数据都顺利迁移,没有发生数据丢失,事后信息系统也通过了测试,内外网数据统一运行良好,整个数据迁移工作成功完成。
参考文献
[1] 曾秀莲.基于SQL Server2005外键技术的教学实践.计算机光盘软件与应用,2012(13):141-142.
[2] 姚渝春,潘林森,王凡.数据库触发器及应用.土木建筑与环境工程,2003,25(5):128-131.