写点什么

MYSQL 离线迁移至分布式 TDSQL

发布于: 2 小时前

当使用 MYSQL 单实例,因数据量剧增出现性能问题的时候,普通的分库分表又难以满足其需求,一些客户会考虑迁移至分布式数据库。TDSQL 分布式是一款面向金融领域的一款数据库,适合应用在海量数据、高性能,高并发的使用场景。那么我们从 MYSQL 迁移至 TDSQL 都有哪些途径呢 ?这里我们对 MYSQL 离线迁移至分布式 TDSQL 介绍一种方法:


使用 LOAD_DATA 导入至 TDSQL 分布式实例 ,LOAD_DATA 是在原生 MYSQL load data 基础上,针对导入分布式 TDSQL 进行优化逻辑处理后的一款导入工具。此工具只适用于导入 TDSQL 分布式 ,不适合 TDSQL 非分布式。究其原因是 TDSQL 分布式 在插入语句中有一个严格限制,插入语句必须带有 shardkey ,没有 shardkey 的情况下会导入失败。所以 LOAD_DATA 工具会对 shardkey 这一层面有一个处理。


我们可以通过./load_data 查看帮助 具体的使用方法:


cd /data/tdsql_run/15002/gateway/bin



命令的参数说明


导入命令:./load_data mode1 proxy_port proxy_passwd proxy_tablename auto '$file_name' ',' '"'


参数说明:


mode0:load_data 的原理是分割数据,然后导入数据,mode0 是先分割数据不进行导入。


mode1:分割数据,然后导入数据。


proxy_host:网关的 host


proxy_port:网关的端口


user:用户名


password:密码


db_talbe:库表,格式为 db.table


shardkey_index:shardkey 字段在导入文件的索引(位置,从 0 开始)


file:绝对路径的文件所在位置


field_terminated:与导出时使用的 field terminated 一致,行的分割


field_enclosed:与导出时使用的 field enclosed 一致,设置字段包围字符


下面我们简单做个迁移测试,具体介绍一下迁移步骤:


第一步 从 mysql 单实例中 导出数据至 csv 格式:


导出 csv 格式的方法也有多种 ,这里我们就使用 into outfile ,我们以 test 库下 T1 表为例


T1 表结构


CREATE TABLE game_score_log (


id int(11) NOT NULL AUTO_INCREMENT,


name varchar(10) NOT NULL,


score int(11) NOT NULL,


PRIMARY KEY (id)


) ;


插入一些数据


insert into t1 (id,name,score) values ("10001","王五","100");


insert into t1 (id,name,score) values ("10002","李四","95" );


insert into t1 (id,name,score) values ("10003","李四","100");


insert into t1 (id,name,score) values ("10004","李四","75" );


insert into t1 (id,name,score) values ("10005","王五","70" );


insert into t1 (id,name,score) values ("10006","张三","85" );


insert into t1 (id,name,score) values ("10007","张三","65" );


insert into t1 (id,name,score) values ("10008","王五","70" );


使用 select into outfile 进行导出


SELECT * FROM t1INTO OUTFILE '/tmp/t1.csv'FIELDS TERMINATED BY ','OPTIONALLY ENCLOSED BY '"'LINES TERMINATED BY '\n';


FIELDS TERMINATED BY ',' 字段间分割符 OPTIONALLY ENCLOSED BY '"' 将字段包围 对数值型无效 LINES TERMINATED BY '\n' 换行符


cat /tmp/t1.csv


"10001","王五","100"


"10002","李四","95"


"10003","李四","100"


"10004","李四","75"


"10005","王五","70"


"10006","张三","85"


"10007","张三","65"


"10008","王五","70"


第二步:导入数据到 TDSQL 分布式实例


(1)首先在 TDSQL 分布式实例上准备库和表结构,这里注意 shardkey 的选取(建议选择一个区分度较高的字段,以便数据均匀打散到各个分片中,这里需要业务人员的参与)


CREATE TABLE t1 (


id int(11) NOT NULL AUTO_INCREMENT,


name varchar(10) NOT NULL,


score int(11) NOT NULL,


PRIMARY KEY (id)


) shardkey=id;


(2)mode0 模式 分割成 n 个(看实例有几个分片)文件 ,但不导入


./load_data mode0 172.21.16.11 15002 ju2 ju2 test.t1 auto '/tmp/t1.csv' ',' '"'


执行后分割为:t1.csv_set_1605000504_1 和 t1.csv_set_1605000688_3 两个文件



(3)mode1 模式,直接分割并导入


./load_data mode1 172.21.16.11 15002 ju2 ju2 test.t1 auto '/tmp/t1.csv' ',' '"'



(4)最后验证:


MYSQL-uju2 -pju2 -h172.21.16.11 -P15002 -c



查看各个分片上的数据



至此,迁移完成。


原创声明,本文系作者授权云+社区发表,未经许可,不得转载。如有侵权,请联系 yunjia_community@tencent.com 删除。

用户头像

还未添加个人签名 2018.12.08 加入

还未添加个人简介

评论

发布
暂无评论
MYSQL离线迁移至分布式TDSQL