数据迁移工具

RDS在线数据迁移

概述

RDS针对MySQL数据库提供在线数据迁移方法,该方法通过控制台完成数据库的迁移。用户不停服务即可完成数据库的在线迁移,此功能支持MySQL 5.1以上版本的数据库迁移。

RDS在线数据迁移分为两种方案:全量数据迁移、(全量+增量)数据迁移。

全量数据迁移

RDS用户从自建数据库中将数据完整迁移到RDS中。

(全量+增量)数据迁移

RDS用户不仅可以从自建数据库中将数据完整迁移到RDS中,还可以导入自建数据库中的增量数据,即使RDS中的数据与用户自建数据库中的数据保持实时一致。

在线迁移注意事项

1.RDS不允许以保留关键字命名数据库,因此不支持用户对以保留关键字命名的自建数据库进行迁移,全部保留关键字如下所示,这些数据库将不会显示在迁移列表中。

admin,aurora,replicator,xtrabak,root,mysql,test,eagleye,information_schema,guest,add,analyze,asc,between,blob,call,change,check,condition,continue,cross,current_timestamp,database,day_microsecond,dec,default,desc,distinct,double,each,enclosed,exit,fetch,float8,foreign,goto,having,hour_minute,ignore,infile,insensitive,int1,int4,interval,iterate,keys,leading,like,lines,localtimestamp,longblob,low_priority,mediumint,minute_microsecond,modifies,no_write_to_binlog,on,optionally,out,precision,purge,read,references,rename,require,revoke,schema,select,set,spatial,sqlexception,sql_big_result,ssl,table,tinyblob,to,true,unique,update,using,utc_timestamp,varchar,when,with,xor,all,and,asensitive,bigint,both,cascade,char,collate,connection,convert,current_date,current_user,databases,day_minute,decimal,delayed,describe,distinctrow,drop,else,escaped,explain,float,for,from,grant,high_priority,hour_second,in,inner,insert,int2,int8,into,join,kill,leave,limit,load,lock,longtext,match,mediumtext,minute_second,natural,null,optimize,or,outer,primary,raid0,reads,regexp,repeat,restrict,right,schemas,sensitive,show,specific,sqlstate,sql_calc_found_rows,starting,terminated,tinyint,trailing,undo,unlock,usage,utc_date,values,varcharacter,where,write,year_month,alter,as,before,binary,by,case,character,column,constraint,create,current_time,cursor,day_hour,day_second,declare,delete,deterministic,div,dual,elseif,exists,false,float4,force,fulltext,group,hour_microsecond,if,index,inout,int,int3,integer,is,key,label,left,linear,localtime,long,loop,mediumblob,middleint,mod,not,numeric,option,order,outfile,procedure,range,real,release,replace,return,rlike,second_microsecond,separator,smallint,sql,sqlwarning,sql_small_result,straight_join,then,tinytext,trigger,union,unsigned,use,utc_time,varbinary,varying,while,x509,zerofill,performance_schema

2.自建数据库与目标RDS目标实例中的数据库同名且非空时,不可进行在线迁移。

3.RDS支持识别的字符集为utf8gbklatin1

4.迁移过程中,建议用户暂停使用DDL操作例如:创建表、删除表、修改索引等操作,非强制性需求。

5.用户自建数据库在线迁入的RDS实例需要开通公网权限,开通方法参考使用RDS实例

6.一次批量数据库迁移最多支持对10个数据库进行迁移,并且同时进行迁移的数据库需要具有相同的字符集。

迁移步骤

在自建数据库中创建迁移账号

用户可参考如下命令:

grant all privileges on ${db_name}.* to '${user}'@'%' identified by '${password}';

参数说明:

参数 说明
${user} 用户本地自建数据库用户名
${password} 用户本地自建数据库密码
${db_name} 用户本地自建数据库名

设置迁移账号权限

用户可参考如下命令:

grant select,reload,super,lock tables,replication client,replication slave ON *.* TO '${user}'@'%';

注意:

1.该命令对数据库账号${user}赋予select、reload、super、lock tables、replication client、replication slave权限。

2.当用户在在线迁移的时候,若需要进行锁表则自建数据库需要具有lock tables权限。

3.当用户在在线迁移的时候,若选择(全量+增量)迁移则自建数据库需要具有replication client、replication slave权限。

数据导入检查项

RDS数据在线迁移方式分为两种:全量迁移、(全量+增量)迁移。针对不同的迁移方式,数据导入的检查项也略有出入,如下表所示:

检查项 检查方法 全量迁移 (全量+增量)迁移
检查RDS实例公网权限 检查RDS实例是否开通公网访问 需要 需要
检查RDS实例连通性 检查RDS实例是否可以正常连接 需要 需要
检查RDS实例数据库 检查RDS实例待迁移数据库是否不存在,或者存在是否为空 需要 需要
检查用户自建数据库连通性 根据用户提供的IP、端口、用户名、密码验证自建数据库的连通性 需要 需要
检查用户自建数据库版本 导出的自建数据库版本需大于或等于RDS数据库版本,(全量+增量)迁移方法的自建数据库版本必须在MySQL 5.1以上(含) 需要 需要
检查用户自建数据库账号权限 select、reload,super,replication client,replication slave 只需要select 需要全部列出权限
检查用户自建库、自建表是否可读 SELECT /!40001 SQL_NO_CACHE / * FROM '${db_name}'.'$(table_name)' limit 1 可读 可读
检查自建库具有导入数据库表锁权限 导入账号具备具有导入数据库表锁权限,具备lock tables权限 锁表状态需要 锁表状态需要
检查自建库开启binlog log_bin = on 不需要 需要
检查自建库设置binlog_format为statement模式 binlog_format = statement 不需要 需要
迁移数据库最大不超过10个 检查用户单次迁移数据库数量不超过10个 需要 需要
检查自建库字符集 检查用户自建数据库的字符集是否为utf8、gbk、latin1 需要 需要
检查批量导入任务的自建库字符集是否一致 用户新增一次批量发起导入任务的所有数据库需要有相同的字符集 需要 需要

将自建数据库迁移至RDS

具体操作步骤用户请参考《操作指南 数据库迁移

RDS离线数据迁移

简介

RDS支持用户使用离线的方式完成对自建数据库迁移的需求,离线数据迁移目前区分两种数据源:MySQL和任意源。针对数据源为MySQL的自建数据库推荐用户使用mysqldump工具实现迁移,针对数据源为任意源的自建数据库建议用户创建文本文件使用mysqlimport工具实现迁移。为了保证数据的同步性,建议用户在使用离线迁移的时候执行停机操作。

数据源为MySQL

概述

当用户需要迁移的数据源基于MySQL数据库时,由于RDS提供的关系型数据库服务与MySQL数据库完全兼容,用户将原有数据库迁移到RDS实例的过程,类似于将一个MySQL服务器迁移到另一个MySQL服务器的过程。这个过程可以使用mysqldump工具来实现。

迁移步骤

创建RDS实例

用户创建RDS实例后,系统会为用户提供RDS实例的域名和端口,如:mysql51.example.rds.bj.baidubce.com:3306。具体内容请参考《RDS操作指南 创建RDS实例》。

创建数据库和账号

用户在控制台创建RDS实例之后,继续在其中创建需要的数据库和账号并分配对应的读写权限。具体内容请参考《RDS操作指南 创建数据库》和《RDS操作指南 创建账号

用户数据导出

1.利用mysqldump导出用户数据

使用mysqldump工具从用户的MySQL数据源中导出需要导入RDS实例中的数据文件(本步骤仅导出数据,不包括存储过程、触发器及函数)。命令格式如下:

${mysqldir}/bin/mysqldump -h${ip} -P${port} -u${user} -p${password}  --opt --default-character-set=utf8 --hex-blob --tz-utc=0 --compress ${db_name} --skip-lock-tables --skip-triggers > ${datadir}/${db_name}.sql

参数说明:

参数 说明
${mysqldir} 用户本地安装MySQL的路径
${ip} 用户本地MySQL服务的IP地址
${port} 用户本地MySQL服务的端口
${user} 用户本地MySQL数据库用户名
${password} 用户本地MySQL数据库密码
${db_name} 用户本地需要迁移的自建数据库名
${datadir} 用户本地备份生成的文件路径
${db_name}.sql 用户本地备份生成的文件名

2.利用mysqldump导出存储过程、触发器和函数

使用mysqldump工具从用户的MySQL数据源中导出需要导入RDS实例中的存储过程、触发器和函数(若数据库中没有使用存储过程、触发器和函数,可跳过此步骤),在导出存储过程、触发器和函数时,需要将definer去掉。命令格式如下:

${mysqldir}/bin/mysqldump -h${ip} -P${port} -u${user} -p${password}  --opt --default-character-set=utf8 --hex-blob --tz-utc=0 --compress ${db_name} -R | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > ${datadir}/triggerProcedure.sql

有关mysqldump的更多信息,请参考MySQL文档中的mysqldump - 数据库备份程序

通过云服务器BCC将数据迁移至RDS

1.将备份文件上传至云服务器BCC

使用云服务器的方法请参考《操作指南 管理云服务器》,以下用Linux服务器为例,假设已上传的文件在云服务器中的路径为:
/tmp/${db_name}.sql
/tmp/triggerProcedure.sql

2.将数据迁移至RDS

使用云服务器将上传的数据文件导入到已购买的RDS实例中,命令格式:

mysql -h${rds_ip} -u${rds_user} -p ${rds_db_name} < /tmp/${db_name}.sql

参数说明:

参数 说明
${rds_ip} RDS实例的域名,具体请参考《操作指南 使用RDS实例
${rds_user} RDS数据库账号,具体请参考《操作指南 管理数据库账号
${rds_db_name} RDS中数据库名,具体请参考《操作指南 管理数据库
${db_name}.sql 用户备份生成的文件名

注意:

由于账号针对每个数据库都有访问权限,因此用户需要提前在RDS中创建需要导入数据的数据库并赋予对应使用账号的读写权限才可以成功导入数据。

3.将存储过程、触发器和函数迁移至RDS

使用云服务器将上传的存储过程文件(包含存储过程、触发器和函数,若没有则请跳过此步)导入到已购买的RDS实例中,命令格式:

mysql -h${rds_ip} -u${rds_user} -p ${rds_db_name} < /tmp/triggerProcedure.sql

至此数据源为mysql的数据迁移完毕,用户可使用数据库客户端工具(如MySQL-Front)、第三方数据库管理工具(如phpMyAdmin)或程序的方式,通过RDS实例连接地址、端口号、数据库账号和密码连接数据库。

数据源为任意源

概述

当用户需要迁移的数据源数据量过大时或数据源来自于除MySQL数据库之外的其他存储位置,建议用户创建文本文件并使用mysqlimport工具来加载此类文件。mysqlimport是MySQL客户端软件提供的一种命令行实用工具,用于将文本文件加载到MySQL中。有关mysqlimport的信息,请参考MySQL文档中的mysqlimport - 数据导入计划

迁移步骤

创建RDS实例

用户创建RDS实例后,系统会为用户提供RDS实例的域名和端口,如:mysql51.example.rds.bj.baidubce.com:3306。具体内容请参考《RDS操作指南 创建RDS实例》。

创建数据库和账号

用户在控制台创建RDS实例之后,继续在其中创建需要的数据库和账号并分配对应的读写权限。具体内容请参考《RDS操作指南 创建数据库》和《RDS操作指南 创建账号

创建包含源数据的文本文件

用户在使用通用格式存储待加载的数据时,如CSV(逗号分隔值),每个表都必须拥有自己的文件,不能将多个表的数据合并到同一文件中,并且每个文件的名称都必须与对应的表相同。用户可以根据个人喜好设置文件的扩展名,例如,如果表名为“test”,则文件名可以是“test.csv”或“test.txt”,但不能是“test_01.csv”。

用户需要尽量按照正在加载的表的主键对数据进行排序,这样可以优化加载时间并尽可能减少磁盘存储要求。

数据迁移的速度和效率取决于能否将文件的大小保持在较小状态,若在未压缩状态下单个文件的大小超过1GB,则建议用户将此文件分割为多个文件,然后对各个文件进行分别加载。

在Linux的操作系统中,请使用split命令。例如,以下命令将test.csv文件分割为多个小于1GB的文件,且只在换行符处进行分割(-C 1024m)。新文件的名称为test.part_00、test.part_01等。

split -C 1024m -d test.csv test.part_

通过云服务器BCC将数据迁移至RDS

1.将备份文本文件上传至云服务器BCC

使用云服务器的方法请参考《操作指南 管理云服务器》,以下用Linux服务器为例,假设已上传的文本文件在云服务器中的路径为:

/tmp/test.part_00
/tmp/test.part_01
…

2.将数据迁移至RDS

用户可以使用mysqlimport工具将名为“test”并且扩展名以“part_”开头的所有文本文件加载到RDS中,此方法可以将“split”示例中创建的所有文件一次性加载,示例代码如下:

mysqlimport --local --compress --user=${rds_user} --password --host=${rds_ip} \--fields-terminated-by=',' ${rds_db_name} test.part_*

参数说明:

参数 说明
${rds_ip} RDS实例的域名,具体请参考《操作指南 使用RDS实例
${rds_user} RDS数据库账号,具体请参考《操作指南 管理数据库账号
${rds_db_name} RDS中数据库名,具体请参考《操作指南 管理数据库
test.part_* 用户备份生成的文件名

注意:
--local选项指定传入数据应位于客户端,如果没有此选项,MySQL将查找数据库主机上的数据,因此请始终指定--local选项。

至此数据源为任意源的数据迁移完毕,用户可使用数据库客户端工具(如MySQL-Front)、第三方数据库管理工具(如phpMyAdmin)或程序的方式,通过RDS实例连接地址、端口号、数据库账号和密码连接数据库。