一、项目背景
系统统一规范整理,将数据集中到本系统中统一对外输出。故涉及到其他地区的用户数据一并迁移到本系统DB中。
两张表的迁移工作,数据2千万+,从旧表fit in新表,两表不同字段命名不同,含义类似,均以新表字段为准。
二、前期准备
1、确认迁表数量级,是否全量迁移
2、旧系统、新系统是否有针对该两张表的调用量。若有,确认数据操作最低峰(可通过一段时间内update_time字段确认更新频率进行筛选)。公司有接口调用量监控系统也可进行查看。
3、编写db表描述文档,写清楚怎么迁,编写对应sql脚本。最后提工单,协作DBA操作。
三、执行数据迁移
通过与DBA同事的沟通,了解到数据迁移他们常采用的几种方式。
方案一、使用sqldump命令,把旧表数据全部导出,导入新库,再修改字段。
脚本mark:
mysqldump -hip -P3306 -u用户名 -p密码 --default-character-set=utf8 dbname t_app_driver_task_assign >t_app_driver_task_assign.sql;
sed -i 's/t_app_driver_task_assign/t_app_driver_task_assign_new/g' t_app_driver_task_assign.sql
use dbname
source /路径/文件.sql;
方案二、使用阿里云提供的DTS服务直接同步数据。无需手动执行脚本新建表。DTS会直接将本地数据库迁移至目标实例。
具体详见操作文档
https://help.aliyun.com/document_detail/26132.html?spm=5176.doc26133.6.713.xyhWUi
四、DTS初步认识
1、DTS为阿里云提供的mysql数据库的迁移服务,可实现不停服的情况下平滑的进行数据迁移工作。
2、通过后台管理页创建迁移任务,指定源库、目标库连接信息。并设置迁移属性(全量、表结构迁移)
3、执行任务,等待迁移完成。
具体执行流程大致如上。至于深入原理,有待继续研究。不知同otter是否类似。
五、关于线上数据脚本总结
1、数据库不允许字段为null
2、timestamp类型注意设置default值,不能以0000:00类数据格式存在。
3、旧表数据迁移至新库后,注意检查字段、索引区别。
#删除多余字段
ALTER TABLE TABLENAME DROP COLUMN coupon_code, DROP COLUMN active_date, DROP COLUMN coupon_type, DROP COLUMN disable_date, DROP COLUMN service_type;
#添加时间戳
ALTER TABLE TABLENAME ADD update_time timestamp default CURRENT_TIMESTAMP;
#删除索引
DELETE INDEX idx_coupon_code ON TABLENAME (coupon_code);
#创建索引
CREATE INDEX idx_uid_serviceid ON TABLENAME (user_id,service_id);
CREATE INDEX idx_user_id ON TABLENAME (user_id);
#添加索引
CREATE INDEX idx_order_count ON TABLENAME (order_count);