混合编码的数据迁移方法、数据迁移装置和存储介质
技术领域
本发明涉及数据处理领域,尤其涉及一种混合编码的数据迁移方法、数据迁移装置及存储介质。
背景技术
MySQL集开源、免费、使用便利以及高可靠性等诸多优点于一身而被广泛使用,据第三方权威评测机构DB-Engines提供的数据表明,MySQL多年来一直雄踞全球主要数据库系统(含商用和开源数据库系统)市场占有率前两位。MySQL单表最大限制早在3.X版本就已经突破了64PB,很多机构选用MySQL作为运营的大型信息系统的后台数据库管理系统。
底层操作系统或存储阵列的更换,以及MySQL数据库移植到其它厂商的数据库、基于MySQL的应用系统向其它应用系统提供数据交换与共享等服务,无一不需要使用到数据迁移操作。MySQL支持以西方拉丁语系为代表的单字节字符集编码和以我国汉字为代表的多字节字符集编码,总计支持超过 40种细分类型的字符集编码。MySQL建表时缺省情况下采用latin1字符集,这在网站这种类型的应用系统中表现更为明显,部分应用系统由于已经运行多年,其间可能由于需要增加新的功能或者需要支持新出现的业务等而不断增加数据表,由于可能没有严格执行良好的系统开发、维护规范,以及应用系统开发人员的频繁流动等多种原因,导致MySQL应用系统在同一个数据库中,竟然同时存在了混合使用多种不同字符集编码的数据表,这会让传统的数据迁移工作极度困难。
无论是MySQL官方提供的久经考验的客户端工具mysqldump还是第三方开发商提供的一些著名的前端工具例如Navicat、MySQL-Front等等,在导出混合编码的数据库时,都会出现乱码问题,这些工具即使指定以某种具体的编码类型(例如utf8编码)导出数据库,也只能保证库中与导出时指定的编码类型一致的那些数据表可以被正确导出而不出现乱码,其它编码类型的表数据仍然是乱码。假设某个数据库dbname中存在N种不同类型编码的表,且每种类型的表数量都一样而且每个表的数据量都大致相同,那么当用上述传统方法导出数据时,仅能保证1/N的数据是正确无误的,其余(N-1)/N的数据都是乱码而无法使用。
发明内容
针对上述技术问题,本发明实施例提供了一种具有较高的数据迁移效率以及较高的数据迁移准确率的混合编码的数据迁移方法、数据迁移装置及存储介质;以解决现有的数据迁移方法及数据迁移装置中数据迁移效率较低且数据迁移的准确率较差的技术问题。
本发明实施例提供一种混合编码的数据迁移方法,其包括:
对待处理文件的编码数据进行分析,获取所述待处理文件的编码数据的数据编码类型;
基于所述编码数据的数据编码类型生成多个编码数据提取线程;其中编码数据提取线程与数据编码类型一一对应;
使用各个编码数据提取线程,分别对所述编码数据进行编码数据提取操作,以得到多个具有单一数据编码类型的编码提取数据文件;
对所述多个编码提取数据文件进行类型转换以及数据合并处理,以得到处理后的目标文件;
将处理后的目标文件迁移到目标数据库中。
在本发明所述的混合编码的数据迁移方法中,所述对编码数据进行编码数据提取操作的步骤包括:
逐行读取所述编码数据;
检测读取到的编码数据是否为文件内容数据;
如是,则判断所述文件内容数据的编码类型与预设编码是否一致;如果不一致,将所述文件内容数据舍弃;如果一致,则将所述文件内容数据存储至对应的编码提取数据文件中,并返回逐行读取所述编码数据的步骤直至所述编码数据不是文件内容数据;
如否,则判断读取到的编码数据是否为文件尾数据;如所述编码数据为文件尾数据,则将所述编码数据的后续数据存储到对应的编码提取数据文件中;如所述编码数据不是文件尾数据,则确定所述编码数据为文件头数据,并将所述编码数据的文件头数据存储到对应的编码提取数据文件之后转到逐行读取所述编码数据的步骤。
在本发明所述的混合编码的数据迁移方法中,所述对待处理文件的编码数据进行分析,获取所述待处理文件的编码数据的数据编码类型的步骤包括:
获取编码数据中的数据编码类型特征串,并根据所述数据编码类型特征串确定所述待处理文件的编码数据的数据编码类型。
在本发明所述的混合编码的数据迁移方法中,所述检测读取到的编码数据是否为文件内容数据的步骤包括:
检测是否读取到所述编码数据的编码数据开始信息;
如果是,则确定所述编码数据为文件内容数据。
在本发明所述的混合编码的数据迁移方法中,所述判断所述编码数据是否为文件尾数据的步骤包括:
检测是否读取到所述编码数据的编码数据结束信息;
如果是,则确定所述编码数据为文件尾数据。
在本发明所述的混合编码的数据迁移方法中,将所述文件内容数据存储到对应的编码提取数据文件的步骤包括:
判断读取到的文件内容数据的容量是否大于设定值;
如大于设定值,则将当前读取到的文件内容数据存储到对应的编码提取数据文件当前缓存中,并对相应的当前缓存进行清空操作。
在本发明所述的混合编码的数据迁移方法中,所述使用各个编码数据提取线程,分别对所述编码数据进行编码数据提取操作的步骤包括:
同时使用多个编码数据提取线程,分别对所述编码数据进行编码数据提取操作;同时使用的编码数据提取线程的数量小于当前系统的CPU核数。
在本发明所述的混合编码的数据迁移方法中,所述对所述多个编码提取数据文件进行类型转换以及数据合并处理,以得到处理后的目标文件的步骤包括:
根据所述编码提取数据文件的数据编码类型以及处理后的目标文件的类型对所述多个编码提取数据文件进行类型转换,并对转换后的编码提取数据文件进行数据合并操作,以得到处理后的目标文件。
本发明实施例还提供一种混合编码的数据迁移装置,其包括:
数据分析模块,用于对待处理文件的编码数据进行分析,获取所述待处理文件的编码数据的数据编码类型;
线程生成模块,用于基于所述编码数据的数据编码类型生成多个编码数据提取线程;其中编码数据提取线程与数据编码类型一一对应;
提取操作模块,用于使用各个编码数据提取线程,分别对所述编码数据进行编码数据提取操作,以得到多个具有单一数据编码类型的编码提取数据文件;
转换合并模块,用于对所述多个编码提取数据文件进行类型转换以及数据合并处理,以得到处理后的目标文件;
数据迁移模块,用于将处理后的目标文件迁移到目标数据库中。
本发明实施例还提供一种存储介质,其内存储有处理器可执行指令,所述指令由一个或一个以上处理器加载,以执行上述的混合编码的数据迁移方法。
本发明实施例所提供的技术方案中,通过将编码数据转换为具有单一数据编码类型的多个编码提取数据文件,然后再合成单一数据编码类型的迁移目标文件;由于迁移目标文件的数据编码类型单一,因此具有较高的数据迁移效率以及较高的数据迁移准确率;有效的解决了现有的数据迁移方法及数据迁移装置中数据迁移效率较低且数据迁移的准确率较差的技术问题。
附图说明
图1为本发明的混合编码的数据迁移方法的优选实施例的流程图;
图2为本发明的混合编码的数据迁移方法的优选实施例的步骤S103的流程图;
图3为本发明的混合编码的数据迁移装置的优选实施例的结构示意图;
图4为本发明的混合编码的数据迁移方法及数据迁移装置的数据迁移流程的具体流程图;
图5为本发明的数据迁移装置所在的电子设备的工作环境结构示意图。
具体实施方式
请参照图式,其中相同的组件符号代表相同的组件,本发明的原理是以实施在一适当的运算环境中来举例说明。以下的说明是基于所例示的本发明具体实施例,其不应被视为限制本发明未在此详述的其它具体实施例。
在以下的说明中,本发明的具体实施例将参考由一部或多部计算机所执行之作业的步骤及符号来说明,除非另有述明。因此,其将可了解到这些步骤及操作,其中有数次提到为由计算机执行,包括了由代表了以一结构化型式中的数据之电子信号的计算机处理单元所操纵。此操纵转换该数据或将其维持在该计算机之内存系统中的位置处,其可重新配置或另外以本领域技术人员所熟知的方式来改变该计算机之运作。该数据所维持的数据结构为该内存之实体位置,其具有由该数据格式所定义的特定特性。但是,本发明原理以上述文字来说明,其并不代表为一种限制,本领域技术人员将可了解到以下所述的多种步骤及操作亦可实施在硬件当中。
请参照图1,图1为本发明的混合编码的数据迁移方法的优选实施例的流程图。本发明的混合编码的数据迁移方法可设置在MySQL数据库中,用于对 MySQL数据库中的存储数据进行数据迁移操作,本实施例的混合编码的数据迁移方法包括:
步骤S101,对待处理文件的编码数据进行分析,获取待处理文件的编码数据的数据编码类型;
步骤S102,基于编码数据的数据编码类型生成多个编码数据提取线程;其中编码数据提取线程与数据编码类型一一对应;
步骤S103,使用各个编码数据提取线程,分别对编码数据进行编码数据提取操作,以得到多个具有单一数据编码类型的编码提取数据文件;
步骤S104,对多个编码提取数据文件进行类型转换以及数据合并处理,以得到处理后的目标文件;
步骤S105,将处理后的目标文件迁移到目标数据库中。
下面详细说明本实施例的混合编码的数据迁移方法的数据迁移过程。
在步骤S101中,数据迁移装置(MySQL数据库)对需要进行数据迁移操作的待处理文件的编码数据进行分析,从而获取该待处理文件的编码数据的数据编码类型。
具体的,数据迁移装置可获取编码数据中的数据编码类型特征串,并根据获取的数据编码类型特征串来确定待处理文件的编码数据的数据编码类型。如latin1、gbk、utf8以及gb2312等数据编码类型等。
由于MySQL客户端工具mysqldump可以通过添加-no-data参数,将mysql 数据库中的编码数据中的文件数据(如数据表结构文件)导出。如命令为: mysqldump-uroot-p--host=localhost--no-data test>teststruct.sql,分析导出文件是否包含“ENGINE=YYYY DEFAULT CHARSET=XXXX”的数据编码类型特征串,并记下数据编码类型的数量以及名称。
在步骤S102中,数据迁移装置基于步骤S101获取的编码数据的数据编码类型生成多个编码数据提取线程,其中编码数据提取线程与数据编码类型一一对应。
为了提高编码数据的提取操作效率,数据迁移装置会使用多个线程同时对编码数据进行数据提取操作,因此在本实施例中,数据迁移装置基于编码数据的数据编码类型来生成可并行运行的编码数据提取线程,即每个编码数据提取线程可在编码数据中提取对应数据编码类型的编码提取数据文件。
在步骤S103中,数据迁移装置使用步骤S102生成的多个编码数据提取线程,分别对编码数据进行编码数据提取操作,以得到多个具有单一数据编码类型的编码提取数据文件。
这里优选使用多个编码数据提取线程,分别对编码数据进行编码数据提取操作,如当前系统的CPU核数为a,编码数据提取线程的总数量为b,当b 小于a-1时,所有的编码提取线程可同时运行,且可使用一CPU线程对所有的编码数据提取线程进行管理;当b大于等于a-1时,则a-1个编码提取线程可同时运行,且使用一CPU线程对所有的编码数据提取线程进行管理。
本优选实施例中,数据迁移装置对编码数据进行编码数据提取操作的具体流程请参照图2,图2为本发明的混合编码的数据迁移方法的优选实施例的步骤S103的流程图。该步骤S103包括:
步骤S201,数据迁移装置逐行读取编码数据;
步骤S202,数据迁移装置检测读取到的编码数据是否为文件内容数据。这里的编码数据包括位于编码数据头部的文件头数据、位于编码数据中部的文件内容数据以及位于编码数据尾部的文件尾数据。
由于数据编码类型的判断需要通过编码数据的文件内容数据进行,因此在本步骤中数据迁移装置需要对读取到的编码数据是否为文件内容数据进行判断。
具体的,可通过检测读取到编码数据的编码数据开始信息来判断读取到的编码数据是否为文件内容数据。譬如读取到编码数据的编码数据开始信息,如读取到“--Tablestructure for table`XXX`”等特征串,则认为读取到的编码数据为文件内容数据,转到步骤S203;否则,认为读取到的编码数据不是文件内容数据,转到步骤S204。
步骤S203,如读取到的编码数据为文件内容数据,则数据迁移装置会进一步判断文件内容数据的编码类型与预设编码是否一致,即判断文件内容数据的编码类型是否与编码提取进度对应的数据编码类型一致。如果不一致,则说明当前编码提取进度可能无法对这部分文件内容数据进行识别,因此将这部分文件内容数据舍弃;如果一致,则说明当前编码提取进度可对上述文件内容数据进行识别,因此数据迁移装置将上述文件内容数据存储至对应的编码提取数据文件缓存中。随后返回至步骤S201。
步骤S204,如读取到的编码数据不是文件内容数据,则数据迁移装置会进一步判断编码是否为文件尾数据,即判断文件内容数据是否提取完毕。
具体的,可通过检测读取到编码数据的编码数据结束信息来判断读取到的编码数据是否为文件尾数据。譬如读取到编码数据的编码数据结束信息,如读取到“UNLOCKTABLES”等特征串。
如果编码数据为文件尾数据,则数据迁移装置将编码数据的后续数据存储到对应的编码提取数据文件中。如编码数据不是文件尾数据,则数据迁移装置确定编码数据为文件头数据,则数据迁移装置将编码数据的文件头数据存储到对应的编码提取数据文件缓存中,作为编码提取数据文件的头数据。随后返回步骤S201直至编码数据读取完毕。
这样即完成了编码提取数据文件的提取操作过程。
优选的,数据迁移装置在进行编码提取数据文件的提取过程中,还会判断读取到的文件内容数据的容量是否大于设定的缓存区最大容量值,即当读取到的文件内容数据的容量大于设定值时,为了防止内存溢出,数据迁移装置会直接将读取到文件内容数据存储到对应的编码提取数据文件中,并对相应的当前缓存进行清空操作,以免发生内存溢出错误。
在步骤S104中,数据迁移装置对步骤S103生成的多个编码提取数据文件进行类型转换以及数据合并处理,以得到处理后的目标文件。具体的,数据迁移装置可根据编码提取数据文件的数据编码类型以及处理后的目标文件的类型对多个编码提取数据文件进行类型转换,即转换到统一数据编码类型。随后数据迁移装置对转换后的编码提取数据文件进行数据合并操作,从而得到具有统一数据编码类型且转换准确率较高的目标文件。
在步骤S105中,数据迁移装置将步骤S104生成的处理后的目标文件迁移到目标数据库中,由于目标文件具有统一的数据编码类型,因此在迁移后的目标数据库中的目标文件并不会出现乱码,保证了目标文件中的编码数据的准确性。
这样即完成了本优选实施例的混合编码的数据迁移方法的数据迁移过程。
本发明的混合编码的数据迁移方法通过将编码数据转换为具有单一数据编码类型的编码提取数据文件,然后再合成单一数据编码类型的迁移目标文件;由于迁移目标文件的数据编码类型单一,因此具有较高的数据迁移效率以及较高的数据迁移准确率。
本发明还提供一种混合编码的数据迁移装置,请参照图3,图3为本发明的混合编码的数据迁移装置的优选实施例的结构示意图。本实施例的数据迁移装置可使用上述的数据迁移方法进行实施,本实施例的数据迁移装置30包括数据分析模块31、线程生成模块32、提取操作模块33、转换合并模块34 以及数据迁移模块35。
数据分析模块31用于对待处理文件的编码数据进行分析,获取待处理文件的编码数据的数据编码类型;线程生成模块32用于基于编码数据的数据编码类型生成多个编码数据提取线程;其中编码数据提取线程与数据编码类型一一对应;提取操作模块33用于使用各个编码数据提取线程,分别对编码数据进行编码数据提取操作,以得到多个具有单一数据编码类型的编码提取数据文件;转换合并模块34用于对多个编码提取数据文件进行类型转换以及数据合并处理,以得到处理后的目标文件;数据迁移模块35用于将处理后的目标文件迁移到目标数据库中。
本优选实施例的数据迁移装置30使用时,首先数据分析模块31对需要进行数据迁移操作的待处理文件的编码数据进行分析,从而获取该待处理文件的编码数据的数据编码类型。
具体的,数据分析模块31可获取编码数据中的数据编码类型特征串,并根据获取的数据编码类型特征串来确定待处理文件的编码数据的数据编码类型。如latin1、gbk、utf8以及gb2312等数据编码类型等。
随后线程生成模块32基于获取的编码数据的数据编码类型生成多个编码数据提取线程,其中编码数据提取线程与数据编码类型一一对应。
为了提高编码数据的提取操作效率,线程生成模块32会使用多个线程同时对编码数据进行数据提取操作,因此在本实施例中,线程生成模块32基于编码数据的数据编码类型来生成可并行运行的编码数据提取线程,即每个编码数据提取线程可在编码数据中提取对应数据编码类型的编码提取数据文件。
然后提取操作模块33使用生成的多个编码数据提取线程,分别对编码数据进行编码数据提取操作,以得到多个具有单一数据编码类型的编码提取数据文件。
提取操作模块33对编码数据进行编码数据提取操作的具体流程包括:
提取操作模块33逐行读取编码数据。
提取操作模块33检测读取到的编码数据是否为文件内容数据。
如读取到的编码数据为文件内容数据,则提取操作模块33会进一步判断文件内容数据的编码类型与预设编码是否一致,即判断文件内容数据的编码类型是否与编码提取进度对应的数据编码类型一致。如果不一致,则说明当前编码提取进度可能无法对这部分文件内容数据进行识别,因此将这部分文件内容数据舍弃;如果一致,则说明当前编码提取进度可对上述文件内容数据进行识别,因此提取操作模块33将上述文件内容数据存储至对应的编码提取数据文件中。随后返回逐行读取编码数据的步骤。
如读取到的编码数据不是文件内容数据,则提取操作模块33会进一步判断编码是否为文件尾数据,即判断文件内容数据是否提取完毕。如果编码数据为文件尾数据,则提取操作模块33将编码数据的后续数据存储到对应的编码提取数据文件中。如编码数据不是文件尾数据,则提取操作模块33确定编码数据为文件头数据,则提取操作模块将编码数据的文件头数据存储到对应的编码提取数据文件中,作为编码提取数据文件的头数据。随后返回逐行读取编码数据的步骤直至编码数据读取完毕。
随后转换合并模块34对生成的多个编码提取数据文件进行类型转换以及数据合并处理,以得到处理后的目标文件。具体的,转换合并模块34可根据编码提取数据文件的数据编码类型以及处理后的目标文件的类型对多个编码提取数据文件进行类型转换,即转换到统一数据编码类型。随后转换合并模块34对转换后的编码提取数据文件进行数据合并操作,从而得到具有统一数据编码类型且转换准确率较高的目标文件。
最后数据迁移模块35将生成的处理后的目标文件迁移到目标数据库中,由于目标文件具有统一的数据编码类型,因此在迁移后的目标数据库中的目标文件并不会出现乱码,保证了目标文件中的编码数据的准确性。
这样即完成了本优选实施例的混合编码的数据迁移装置30的数据迁移过程。
本发明的混合编码的数据迁移装置通过将编码数据转换为具有单一数据编码类型的编码提取数据文件,然后再合成单一数据编码类型的迁移目标文件;由于迁移目标文件的数据编码类型单一,因此具有较高的数据迁移效率以及较高的数据迁移准确率。
下面通过一具体实施例说明本发明的混合编码的数据迁移方法及数据迁移装置的具体工作原理。本具体实施例的混合编码的数据迁移装置可设置在 MySQL数据库服务器中,请参照图4,图4为本发明的混合编码的数据迁移方法及数据迁移装置的数据迁移流程的具体流程图。该数据迁移流程包括:
步骤S401,获取MySQL数据库服务器的CPU核数以及剩余内存数量。
在Windows平台上,可通过以下代码获得CPU核数:
#include"windows.h"
SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
nPN=sysInfo.dwNumberOfProcessors。
Linux平台上,可通过以下代码获得CPU核数如下:
#include"unistd.h"
nPN=sysconf(_SC_NPROCESSORS_ONLN)。
将获取到的CPU核数记为nPN,系统支持同时运行的最大线程数量记为 nTN,如果nPN>=2,那么nTN=nPN-1(因为主线程需要占用一颗CPU资源,所以需要减1),否则nTN=nPN(系统为单核CPU,故主线程不单独占用CPU)。
在Windows平台上,可通过以下代码获得系统剩余内存:
#include<windows.h>
#include<stdio.h>
MEMORYSTATUSEX statex;
statex.dwLength=sizeof(statex);
GlobalMemoryStatusEx(&statex);
dwFreeM=statex.ullAvailPhys;//以字节为单位,下同
在Linux平台上,可通过以下代码获取系统剩余内存:
#include<stdio.h>
#include<unistd.h>
#include<linux/kernel.h>
struct sysinfo sys;
int err=sysinfo(&sys);
dwFreeM=sys.freeram;
分配给每个线程使用的空闲内存块设为dwMPerT,其值根据系统支持同时运行的最大线程数nTN,系统剩余的内存数量dwFreeM以及后面步骤需要并行处理的文件数来动态确定。
步骤S402,获取待处理文件的编码数据的数据编码类型。
MySQL客户端工具mysqldump可根据选取不同的参数导出表结构和数据。Mysqldump命令行通过添加--no-data参数,将导出数据库中的数据表结构文件,例如,只导出名为test数据库中的表结构,命令为:mysqldump-uroot-p --host=localhost--no-data test>teststruct.sql,分析该导出文件中的包含类似“) ENGINE=YYYY DEFAULTCHARSET=XXXX;”特征串的行,即可计算出该数据库中的数据表采用了多少种不同的编码类型,记为nTblCode,并记下每种编码的名称。
步骤S403,基于编码数据的数据编码类型生成多个编码数据提取线程。
为了提高处理和提取效率,本实施例采用了多线程并行化处理机制。比较步骤S401中获取到的CPU核数nTN和步骤S402中获取到的不同种类的编码类型数nTblCode,如果nTblCode<=nTN,则令nTN=nTblCode,启动nTblCode 个线程一趟并行处理即可提取完毕nTblCode个导出的文件;如果nTblCode> nTN,则需多趟并行处理方可提取完,每趟启动nTN个线程并处理提取nTN个文件。
步骤S404,使用各个编码数据提取线程,分别对所述编码数据进行编码数据提取操作。其包括如下步骤:
确定每个线程内部的最大缓存区大小dwMPerT=0.5*dwFreeM/nTN,考虑到线程上下文切换等也需要内存等多种因素,因此,dwMPerT的值不超过理论上可分配值的50%。
主线程创建nTN个线程,并赋予每个编码数据提取线程3个输入参数:编码类型参数strCodeType,对应该种编码类型的mysqldump导出的原始sql文件,线程可分配的最大缓存区dwMPerT,然后启动各编码数据提取线程。
具体的进行编码数据提取操作的流程包括:
步骤一、以只读方式打开线程输入参数中的原始sql文件(设为FileI),以只写方式创建处理后存放的新sql文件(设为FileO)。定义并初始化如下标志变量:数据库头部描述信息变量bHead,初值为TRUE;缓存区变量sa,初值为NULL;当前已存入缓存区行数变量iCount,初值为0;当前缓存区长度变量 dwBufLen,初值为0;扫描到某个表的结构定义结束变量nCodeFlag,初值为0;扫描到某个表的数据结束变量bUnlockTable,初值为FALSE;临时变量strLine,初值为NULL。
步骤二、从FileI文件逐行读取一行内容到strLine中,检测是否读到文件尾,若是,转步骤七;若否,转步骤三。
步骤三、检测bHead是否为FALSE,若是,说明已经扫描到了表结构定义和表数据部分,转步骤四;若否,将strLine存入缓存区sa中,并修改iCount= iCount+1,dwBufLen=dwBufLen+length(strLine),扫描strLine中是否存在“-- Table structure for table`XXX`”特征串,若存在,说明sql文件数据库头部描述信息已经检索完毕,置bHead为FALSE,并扫描缓存区内容,将缓存区中“set NAMS XXX”行的内容修改为“set NAMES utf8”,意为将数据库的编码设置为utf8国际字符集格式,然后回写缓存区相应位置行,最后将保存在缓存区sa 中的数据库头部描述信息全部写入FileO文件,清空缓存区sa的所有内容,修改dwBufLen=iCount=0。转步骤二。
步骤四、检测nCodeFlag是否为0,若否,转步骤五。否则,扫描strLine 中是否存在“)ENGINE=YYYY DEFAULT CHARSET=XXXX;”特征串,若不存在,将strLine存入缓存区sa中,并修改iCount=iCount+1,dwBufLen= dwBufLen+length(strLine),转步骤二,若存在,则进一步扫描strLine是否包含strCodeType中指定的编码类型,若包含,则置nCodeFlag为2,并将strLine中的“XXXX”特征串(即数据表的编码类型)替换成“utf8”,然后,将strLine 存入缓存区sa中,并修改iCount=iCount+1,dwBufLen=dwBufLen+ length(strLine);否则,置nCodeFlag为1,清空缓存区sa的所有内容(当前读入的表结构所用的编码不是strCodeType指定的编码,因此舍弃),修改dwBufLen =iCount=0。转步骤二。
步骤五、扫描strLine中是否存在“UNLOCK TABLES;”特征串,若存在,转步骤六,若不存在,则进一步检测nCodeFlag是否为1,若是,则转二(舍弃读到的与strCodeType指定的编码类型不符的所有数据),若nCodeFlag为2,则将strLine存入缓存区sa中,并修改iCount=iCount+1,dwBufLen=dwBufLen +length(strLine),然后判断m_dwBufLen>=m_dwMPerT,若是,则将缓存区 sa中的所有信息全部写入FileO文件,清空缓存区sa的所有内容,修改dwBufLen =iCount=0,转步骤二。
步骤六、置bUnlockTable标志值为TRUE,将缓存区sa中的所有信息全部写入FileO文件,清空缓存区sa的所有内容,修改nCodeFlag=dwBufLen= iCount=0,转步骤二。
步骤七、检测缓存区sa中是否仍有数据,若有,则将缓存区sa中的所有信息全部写入FileO文件,清空缓存区sa的所有内容,修改nCodeFlag=dwBufLen =iCount=0,转步骤八。
步骤八、关闭文件FileI,然后按utf8编码格式将FileO文件保存后并关闭,向主线程发原始sql文件已处理、提取完成标志,结束本线程。
步骤S405,对多个编码提取数据文件进行类型转换以及数据合并处理。
当多线程处理完所有nTblCode个sql文件后,主线程将各线程生成的新 sql文件拼接成一个完整的文件,文件取名规则为dbname2UTF8.sql,由于这个文件的内容采用统一的utf8国际字符集编码,因此可以很容易地、不加修改地迁移到同种数据库(即MySQL)中。
优选的,如果需要将数据迁移到常用的国产数据库,如达梦数据库(DM)、南大通用GBASE数据库(GBase)、华易数据库Huayisoft等,或者其它常用的数据库如Oracle,MS SQLServer,DB2等,则需要扫描之前的dbname2UTF8.sql 文件,首先去除文件中所有的MySQL风格的注释行;然后将数据库头部信息替换成相应目标数据库规定格式的头部信息;接着,逐个数据表将表结构替换成相应目标数据库规定的表结构格式;最后,针对MySQL独有风格的插入数据SQL语句,即文件中类似“INSERT INTO`数据表名`VALUES(记录 1),……(记录N);”的那些内容,需要分解成N行,每行内容类似如下:“INSERT INTO数据表名VALUES(记录1)”,……“INSERT INTO数据表名VALUES (记录N)”,在分解时需要将每行中的“`数据表名`”替换成“数据表名”(即去除其中的反引号``),其余的内容由于采用的是标准的SQL语法,因此可以不用替换,在目标数据库中可以直接使用。
步骤S406,将处理后的目标文件迁移到目标数据库中。
这样即完成了本具体实施例的混合编码的数据迁移方法及数据迁移装置的数据迁移过程。
本具体实施例的数据迁移方法及数据迁移装置支持Linux/Windows操作系统平台,以业界普遍存在的MySQL数据库表混合编码所导致的数据迁移困难问题为切入点,综合考虑了系统CPU核数和系统剩余内存量、多线程并行化处理等多种策略,并提供了迁移到异种数据库前置处理,因此,本具体实施例能将MySQL数据库数据完整、准确地迁移到任意其它数据库(当然也包括MySQL本身)而不会出现乱码问题,具备可伸缩、自适应、执行速度快等特点。
发明人在某个高校使用上述技术方案进行同种类数据库迁移的执行结果如下:
某高校现有师生约3万余人,该校门户网站始建于2001年,该校下辖有约40余个学院、部/处、中心、重点实验室等二级机构,这些二级机构也都先后分别建有自己的网站。由于缺乏统一规划、部署和实施,各网站建设标准和质量参差不齐,安全漏洞频出,网站管理和运维难度极大,因此决定引入规范、统一的网站群系统,重新开发各二级机构网站并整合到站群系统中。站群系统基于安全性较高的LAMP架构(即Linux+Apache+MySQL+PHP 架构),因此需要将旧网站系统中的数据库逐一迁移到站群的MySQL数据库中。其中的经管学院旧网站也采用了MySQL数据库系统,数据库名称为jzf,数据量大小约770M,数据库中共有982张数据表,这些表采用了latin1、gbk、 utf8、gb2312共4种不同的编码类型,详见表1。
表1经管学院数据库jzf基本情况
采用传统的mysqldump数据迁移方法时,无论指定什么编码参数,导出的数据中只有与指定编码相符的那些表数据是正确的,而其它的表数据总是乱码而无法使用。采用本专利方案,分别以latin1、gbk、utf8、gb2312编码类型导出jzf_latin1.sql、jzf_gbk.sql、jzf_utf8.sql、jzf_gb2312.sql这4个原始数据文件,再经4个线程并行处理后生成了jzf_latin1_utf8.sql,jzf_gbk_utf8.sql, jzf_utf8_utf8.sql,jzf_gb2312_utf8.sql这4个没有任何乱码的文件,并行处理过程仅耗时约6分钟。最后拼接合并成jzf2UTF8.sql文件,通过MySQL命令行source命令一次导入数据成功,无任何乱码出现。
表2以文字的形式展示了本方法以及传统的数据迁移方法以4种不同类型的编码类型参数导出的正确记录数、正确数据量及其分别占总记录数、总数据量的百分比。
表2传统数据迁移方法与本专利方法获得的有效记录及占比对比表
*说明:虽然gbk是gb2312的超集,但本专利实现中每个线程一次仅处理一种编码类型的表,所以,表中仍然将gbk和gb2312分列开来较为合适。
可见本发明的混合编码的数据迁移方法及数据迁移装置通过将编码数据转换为具有单一数据编码类型的编码提取数据文件,然后再合成单一数据编码类型的迁移目标文件;由于迁移目标文件的数据编码类型单一,因此具有较高的数据迁移效率以及较高的数据迁移准确率;有效的解决了现有的数据迁移方法及数据迁移装置中数据迁移效率较低且数据迁移的准确率较差的技术问题。
如本申请所使用的术语“组件”、“模块”、“系统”、“接口”、“线程”等等一般地旨在指计算机相关实体:硬件、硬件和软件的组合、软件或执行中的软件。例如,组件可以是但不限于是运行在处理器上的线程、处理器、对象、可执行应用、执行的线程、程序和/或计算机。通过图示,运行在控制器上的应用和该控制器二者都可以是组件。一个或多个组件可以有在于执行的线程和/或线程内,并且组件可以位于一个计算机上和/或分布在两个或更多计算机之间。
图5和随后的讨论提供了对实现本发明所述的数据迁移装置所在的电子设备的工作环境的简短、概括的描述。图5的工作环境仅仅是适当的工作环境的一个实例并且不旨在建议关于工作环境的用途或功能的范围的任何限制。实例电子设备512包括但不限于可穿戴设备、头戴设备、医疗健康平台、个人计算机、服务器计算机、手持式或膝上型设备、移动设备(比如移动电话、个人数字助理(PDA)、媒体播放器等等)、多处理器系统、消费型电子设备、小型计算机、大型计算机、包括上述任意系统或设备的分布式计算环境,等等。
尽管没有要求,但是在“计算机可读指令”被一个或多个电子设备执行的通用背景下描述实施例。计算机可读指令可以经由计算机可读介质来分布(下文讨论)。计算机可读指令可以实现为程序模块,比如执行特定任务或实现特定抽象数据类型的功能、对象、应用编程接口(API)、数据结构等等。典型地,该计算机可读指令的功能可以在各种环境中随意组合或分布。
图5图示了包括本发明的数据迁移装置中的一个或多个实施例的电子设备512的实例。在一种配置中,电子设备512包括至少一个处理单元516和存储器518。根据电子设备的确切配置和类型,存储器518可以是易失性的(比如RAM)、非易失性的(比如ROM、闪存等)或二者的某种组合。该配置在图5中由虚线514图示。
在其他实施例中,电子设备512可以包括附加特征和/或功能。例如,设备512还可以包括附加的存储装置(例如可移除和/或不可移除的),其包括但不限于磁存储装置、光存储装置等等。这种附加存储装置在图5中由存储装置520图示。在一个实施例中,用于实现本文所提供的一个或多个实施例的计算机可读指令可以在存储装置520中。存储装置520还可以存储用于实现操作系统、应用程序等的其他计算机可读指令。计算机可读指令可以载入存储器518中由例如处理单元516执行。
本文所使用的术语“计算机可读介质”包括计算机存储介质。计算机存储介质包括以用于存储诸如计算机可读指令或其他数据之类的信息的任何方法或技术实现的易失性和非易失性、可移除和不可移除介质。存储器518和存储装置520是计算机存储介质的实例。计算机存储介质包括但不限于RAM、 ROM、EEPROM、闪存或其他存储器技术、CD-ROM、数字通用盘(DVD)或其他光存储装置、盒式磁带、磁带、磁盘存储装置或其他磁存储设备、或可以用于存储期望信息并可以被电子设备512访问的任何其他介质。任意这样的计算机存储介质可以是电子设备512的一部分。
电子设备512还可以包括允许电子设备512与其他设备通信的通信连接 526。通信连接526可以包括但不限于调制解调器、网络接口卡(NIC)、集成网络接口、射频发射器/接收器、红外端口、USB连接或用于将电子设备512 连接到其他电子设备的其他接口。通信连接526可以包括有线连接或无线连接。通信连接526可以发射和/或接收通信媒体。
术语“计算机可读介质”可以包括通信介质。通信介质典型地包含计算机可读指令或诸如载波或其他传输机构之类的“己调制数据信号”中的其他数据,并且包括任何信息递送介质。术语“己调制数据信号”可以包括这样的信号:该信号特性中的一个或多个按照将信息编码到信号中的方式来设置或改变。
电子设备512可以包括输入设备524,比如键盘、鼠标、笔、语音输入设备、触摸输入设备、红外相机、视频输入设备和/或任何其他输入设备。设备512中也可以包括输出设备522,比如一个或多个显示器、扬声器、打印机和/或任意其他输出设备。输入设备524和输出设备522可以经由有线连接、无线连接或其任意组合连接到电子设备512。在一个实施例中,来自另一个电子设备的输入设备或输出设备可以被用作电子设备512的输入设备524或输出设备522。
电子设备512的组件可以通过各种互连(比如总线)连接。这样的互连可以包括外围组件互连(PCI)(比如快速PCI)、通用串行总线(USB)、火线(IEEE 1394)、光学总线结构等等。在另一个实施例中,电子设备512的组件可以通过网络互连。例如,存储器518可以由位于不同物理位置中的、通过网络互连的多个物理存储器单元构成。
本领域技术人员将认识到,用于存储计算机可读指令的存储设备可以跨越网络分布。例如,可经由网络528访问的电子设备530可以存储用于实现本发明所提供的一个或多个实施例的计算机可读指令。电子设备512可以访问电子设备530并且下载计算机可读指令的一部分或所有以供执行。可替代地,电子设备512可以按需要下载多条计算机可读指令,或者一些指令可以在电子设备512处执行并且一些指令可以在电子设备530处执行。
本文提供了实施例的各种操作。在一个实施例中,所述的一个或多个操作可以构成一个或多个计算机可读介质上存储的计算机可读指令,其在被电子设备执行时将使得计算设备执行所述操作。描述一些或所有操作的顺序不应当被解释为暗示这些操作必需是顺序相关的。本领域技术人员将理解具有本说明书的益处的可替代的排序。而且,应当理解,不是所有操作必需在本文所提供的每个实施例中存在。
而且,尽管已经相对于一个或多个实现方式示出并描述了本公开,但是本领域技术人员基于对本说明书和附图的阅读和理解将会想到等价变型和修改。本公开包括所有这样的修改和变型,并且仅由所附权利要求的范围限制。特别地关于由上述组件(例如元件、资源等)执行的各种功能,用于描述这样的组件的术语旨在对应于执行所述组件的指定功能(例如其在功能上是等价的)的任意组件(除非另外指示),即使在结构上与执行本文所示的本公开的示范性实现方式中的功能的公开结构不等同。此外,尽管本公开的特定特征已经相对于若干实现方式中的仅一个被公开,但是这种特征可以与如可以对给定或特定应用而言是期望和有利的其他实现方式的一个或多个其他特征组合。而且,就术语“包括”、“具有”、“含有”或其变形被用在具体实施方式或权利要求中而言,这样的术语旨在以与术语“包含”相似的方式包括。
本发明实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。上述提到的存储介质可以是只读存储器,磁盘或光盘等。上述的各装置或系统,可以执行相应方法实施例中的方法。
综上所述,虽然本发明已以实施例揭露如上,实施例前的序号仅为描述方便而使用,对本发明各实施例的顺序不造成限制。并且,上述实施例并非用以限制本发明,本领域的普通技术人员,在不脱离本发明的精神和范围内,均可作各种更动与润饰,因此本发明的保护范围以权利要求界定的范围为准。