写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二,希望对学习路上的你有所助益。同时,博主也想通过此次尝试打造一个完善的技术图书馆,任何与文章技术点有关的异常、错误、注意事项均会在末尾列出,欢迎大家通过各种方式提供素材。
本文关键字:MySQL、数据库、数据迁移、导入、导出
数据迁移的操作在应用运行或数据使用过程中十分常见,这里为了让大家对数据有一个更完善的认识,先给大家科普一下数据的生命周期。
引述维基百科中对数据迁移的解释,可以说比较亲民也很全面了:
数据迁移(data migration)是指选择、准备、提取和转换数据,并将数据从一个计算机存储系统永久地传输到另一个计算机存储系统的过程。此外,验证迁移数据的完整性和退役原来旧的数据存储,也被认为是整个数据迁移过程的一部分。
数据迁移是任何系统实现、升级或集成的关键考虑因素,通常以尽可能自动化的方式执行,从而将人力资源从繁琐的任务中解放出来。数据迁移有多种原因,包括服务器或存储设备更换、维护或升级、应用程序迁移、网站集成、灾难恢复和数据中心迁移。
如果按照数据的流向来分类,可以将数据迁移分为数据导出和数据导入两种操作,这种方式通常会存在一个中间文件,有可能是sql格式的文件,也有可能是各种格式的数据文件。将这些文件保存在磁盘上,需要时再导入到另外的数据库中,这种方式虽然会生成文件,但是可以随时进行数据的恢复。另外一种方式是在原数据库服务与目标数据库服务均开启的情况下,直接进行数据的传输。
由于数据文件的格式多种多样,数据迁移的方式也是多种多样,所以本文只介绍常用的转储SQL、运行SQL、数据传输、数据同步。
SQL作为通用的数据库语言,可以将数据库中存在的结构和数据转换为完整的SQL语句,包含建表语句以及数据插入语句,并且会根据表间关系自动生成顺序合理的SQL。通常情况下,如果我们以导出数据文件的方式进行数据的迁移,SQL格式将成为首选,甚至可以跨库进行(由于SQL语法通用,经过处理后可以在不同的DBMS之间迁移数据)。
如果使用单表数据导出,需要提前已经配置了secure-file-priv选项,来指定一个导出目录,如果未配置则无法导出,导出时会生成一个新的文件。
如果是第一次配置,配置完成后需要重启MySQL服务。(如果是Windows系统,请使用Windows路径写法)
SELECT * FROM `表名` INTO OUTFILE '文件路径';
单表数据的导出会以数据文件的形式存在,每条数据单独成行,每列数据以分隔符隔开,可以用记事本直接打开,在进行数据导入的时候也可以直接使用。
同时,我们也可以使用mysqldump
工具直接导出为SQL文件,这其实是个备份工具,支持数据表及数据库的导出操作。
mysqldump -u 用户名 -p 数据库名 数据表名 > '文件路径'
mysqldump -u 用户名 -p 数据库名 > '文件路径'
没有使用过Navicat工具的小伙伴可以查看这篇文章,插看基本操作:MySQL数据库界面化工具 - Navicat的常用功能
使用界面化工具来进行数据导出十分简单,以Navicat为例。选择某一个数据表,右键点击:导出向导。
根据需要选择对应的数据文件格式:
通过这种方式导出的sql文件只包含数据,并不包含表结构,如下:
打开数据库连接后,选择要导出的数据库,右键:转储SQL -> 结构+数据 -> 选择路径。
准备好数据文件或SQL文件后,就可以开始进行数据导入的操作,如果SQL文件中不包含建表语句,则需要先建立表结构,保证字段名称、字段类型(长度)、约束条件等于数据兼容。
对于导出得到的数据文件,需要使用LOAD DATA INFILE语句来插入数据:
load data local infile '文件路径' into table 表名;
导入完成后会显示执行状态,如果表中存在主键约束或唯一性约束,则相同的数据会被跳过。
如果在进行数据导出时,直接生成了可执行的SQL文件,则可以使用source
命令执行该文件,这种方式同时适用与单表数据导入与整个数据库导入。
source 文件路径;
加载sql文件后会显示每条SQL语句的执行结果,其中Query OK代表成功,rows affected代表当前语句对数据库的影响行数(0 rows affected对应建表语句和各种指令,只要显示Query OK就证明执行成功)。
选择需要导入数据的数据表,右键:导入向导。
根据需要选择导入模式,最后点击开始即可。
如果根据已有的SQL文件执行数据导入,可以直接在打开一个数据库后,新建一个查询窗口,然后将sql文件中的内容粘贴到窗口中执行就好了,这种方式同时适用于单表数据导入与数据库整体导入。
除此之外,如果我们想要进行整个数据库的数据导入,也可以直接右键数据库:运行SQL。
使用数据传输功能的效果与通过SQL语句进行数据导入类似,一般都会先删除已存在的相同的表,这一点一定要注意,使得最终结果与数据源相同,完成完整的数据迁移。
点击工具菜单中的数据传输开始使用:
数据同步的操作步骤与数据传输类似,同样需要先指定数据源与目标数据库,区别在于数据同步会先比较两个数据库的差异,用户可以自行决定是否进行同步,主要适用于有相同表结构的数据库以及主从分布等场景。