原文地址,转载请注明出处: https://blog.csdn.net/qq_34021712/article/details/86358213 ©王赛超
咳咳,千万级别其实也并不是很多,主要是上周做了一个生产环境的数据迁移,趁此记录一下学习笔记。
具体的需求如下: 之前是用户登录之后的token存储在用户信息主表中,并且token还要用来对请求进行加签,现在项目要上网关,想将用户请求验签的操作迁移到网关,网关是单独的数据库,所以要将 用户token字段迁移出去,目前用户有1000多万。
由于数据迁移并不需要对数据进行额外的处理(用户敏感信息加密),所以想直接使用msyql的导出、导入功能。
导出和导入是两个过程
导出
对于字段较少/字段内容较少的数据,通过客户端方式可以采用navicat等工具导出,我导出的是3个字段,但是如果网络不好,导出也是很慢的,我在使用navicat导出的时候,用了很久,所以这里直接在生产环境内网的某台机器上使用mysqldump导出。
导入
的话推荐直接使用mysql的命令导入,不要使用navicat工具,很慢,导出的sql大概有1.2G,并且navicat本身就有假死的风险。
具体步骤
这里讲源库
标明为A库
,目标库
标明为B库
。方便理解!
第一步:在源库A上创建迁移目标表
CREATE TABLE `user_token` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(11) DEFAULT NULL,
`token` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
第二步:将源存储token的信息,复制到新建的表中
#INSERT INTO 目标表 (字段1,字段2) SELECT 字段1,字段2 FROM 源表; INSERT INTO user_token (user_id,token) SELECT id,token FROM userinfo;
字段可以不一致,只要指定好顺序就行,比如我上面的 从userinfo
表中查到的id
字段 插入user_token
的user_id
字段上。 复制数据的话,测试的时候大概不到5分钟的时间。
第三步:数据复制完之后,将数据从源库A中导出
#mysqldump -h mysql服务IP地址 -P mysql端口号 -u账号 -p密码 库名 表名 > /tmp/user_token.sql(导出路径)
mysqldump -h 127.0.0.1 -P 3306 -uroot -p123456 usercenter user_token > /tmp/user_token.sql
导出的话,测试的时候也就花了1分多钟。
第四步:在目标库B库中执行sql文件进行数据导入
#mysql -h 目标mysql服务IP地址 -u目标mysql账号 -p目标mysql密码 库名 < /tmp/user_token.sql(要导入的文件路径)
mysql -h 192.168.1.155 -uroot -p123456 gateway < /tmp/user_token.sql
导入的话,测试也就几分钟。
第五步:使用checksum命令校验数据是否一致
分别在源库
和 目标库
中 对 user_token
表进行 checksum
操作,如果结果一致,则表示成功。
checksum table user_token;